Compare commits

...
Author SHA1 Message Date
daavoo 60e161004d exp: Fix --rev args for ls pull and remove.
Closes #9471

(cherry picked from commit 3ddd4b87fc)
2023-05-21 16:32:31 +02:00
6 changed files with 68 additions and 8 deletions
+6 -3
View File
@@ -1,6 +1,6 @@
import logging import logging
from collections import defaultdict from collections import defaultdict
from typing import Optional from typing import List, Optional, Union
from dvc.repo import locked from dvc.repo import locked
from dvc.repo.scm_context import scm_context from dvc.repo.scm_context import scm_context
@@ -15,14 +15,17 @@ logger = logging.getLogger(__name__)
@scm_context @scm_context
def ls( def ls(
repo, repo,
rev: Optional[str] = None, rev: Optional[Union[List[str], str]] = None,
all_commits: bool = False, all_commits: bool = False,
num: int = 1, num: int = 1,
git_remote: Optional[str] = None, git_remote: Optional[str] = None,
): ):
rev_set = None rev_set = None
if not all_commits: if not all_commits:
revs = iter_revs(repo.scm, [rev or "HEAD"], num) rev = rev or "HEAD"
if isinstance(rev, str):
rev = [rev]
revs = iter_revs(repo.scm, rev, num)
rev_set = set(revs.keys()) rev_set = set(revs.keys())
ref_info_dict = exp_refs_by_baseline(repo.scm, rev_set, git_remote) ref_info_dict = exp_refs_by_baseline(repo.scm, rev_set, git_remote)
+4 -2
View File
@@ -23,7 +23,7 @@ def pull( # noqa: C901
git_remote: str, git_remote: str,
exp_names: Union[Iterable[str], str], exp_names: Union[Iterable[str], str],
all_commits=False, all_commits=False,
rev: Optional[str] = None, rev: Optional[Union[List[str], str]] = None,
num=1, num=1,
force: bool = False, force: bool = False,
pull_cache: bool = False, pull_cache: bool = False,
@@ -49,7 +49,9 @@ def pull( # noqa: C901
raise UnresolvedExpNamesError(unresolved_exp_names) raise UnresolvedExpNamesError(unresolved_exp_names)
if rev: if rev:
rev_dict = iter_revs(repo.scm, [rev], num) if isinstance(rev, str):
rev = [rev]
rev_dict = iter_revs(repo.scm, rev, num)
rev_set = set(rev_dict.keys()) rev_set = set(rev_dict.keys())
ref_info_dict = exp_refs_by_baseline(repo.scm, rev_set, git_remote) ref_info_dict = exp_refs_by_baseline(repo.scm, rev_set, git_remote)
for _, ref_info_list in ref_info_dict.items(): for _, ref_info_list in ref_info_dict.items():
+5 -3
View File
@@ -24,7 +24,7 @@ logger = logging.getLogger(__name__)
def remove( # noqa: C901, PLR0912 def remove( # noqa: C901, PLR0912
repo: "Repo", repo: "Repo",
exp_names: Union[None, str, List[str]] = None, exp_names: Union[None, str, List[str]] = None,
rev: Optional[str] = None, rev: Optional[Union[List[str], str]] = None,
all_commits: bool = False, all_commits: bool = False,
num: int = 1, num: int = 1,
queue: bool = False, queue: bool = False,
@@ -60,6 +60,8 @@ def remove( # noqa: C901, PLR0912
if remained: if remained:
raise UnresolvedExpNamesError(remained, git_remote=git_remote) raise UnresolvedExpNamesError(remained, git_remote=git_remote)
elif rev: elif rev:
if isinstance(rev, str):
rev = [rev]
exp_ref_dict = _resolve_exp_by_baseline(repo, rev, num, git_remote) exp_ref_dict = _resolve_exp_by_baseline(repo, rev, num, git_remote)
removed.extend(exp_ref_dict.keys()) removed.extend(exp_ref_dict.keys())
exp_ref_list.extend(exp_ref_dict.values()) exp_ref_list.extend(exp_ref_dict.values())
@@ -85,14 +87,14 @@ def remove( # noqa: C901, PLR0912
def _resolve_exp_by_baseline( def _resolve_exp_by_baseline(
repo: "Repo", repo: "Repo",
rev: str, rev: List[str],
num: int, num: int,
git_remote: Optional[str] = None, git_remote: Optional[str] = None,
) -> Dict[str, "ExpRefInfo"]: ) -> Dict[str, "ExpRefInfo"]:
assert isinstance(repo.scm, Git) assert isinstance(repo.scm, Git)
commit_ref_dict: Dict[str, "ExpRefInfo"] = {} commit_ref_dict: Dict[str, "ExpRefInfo"] = {}
rev_dict = iter_revs(repo.scm, [rev], num) rev_dict = iter_revs(repo.scm, rev, num)
rev_set = set(rev_dict.keys()) rev_set = set(rev_dict.keys())
ref_info_dict = exp_refs_by_baseline(repo.scm, rev_set, git_remote) ref_info_dict = exp_refs_by_baseline(repo.scm, rev_set, git_remote)
for _, ref_info_list in ref_info_dict.items(): for _, ref_info_list in ref_info_dict.items():
@@ -369,6 +369,12 @@ def test_list(tmp_dir, scm, dvc, exp_stage):
baseline_a[:7]: {ref_info_a.name, ref_info_b.name} baseline_a[:7]: {ref_info_a.name, ref_info_b.name}
} }
exp_list = dvc.experiments.ls(rev=[baseline_a, scm.get_rev()])
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a[:7]: {ref_info_a.name, ref_info_b.name},
"master": {ref_info_c.name},
}
exp_list = dvc.experiments.ls(all_commits=True) exp_list = dvc.experiments.ls(all_commits=True)
assert {key: set(val) for key, val in exp_list.items()} == { assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a[:7]: {ref_info_a.name, ref_info_b.name}, baseline_a[:7]: {ref_info_a.name, ref_info_b.name},
+24
View File
@@ -251,6 +251,30 @@ def test_pull_args(tmp_dir, scm, dvc, git_downstream, exp_stage, all_, rev, resu
assert git_downstream.tmp_dir.scm.get_ref(str(ref_info3)) == result3 assert git_downstream.tmp_dir.scm.get_ref(str(ref_info3)) == result3
def test_pull_multi_rev(tmp_dir, scm, dvc, git_downstream, exp_stage):
baseline = scm.get_rev()
results = dvc.experiments.run(exp_stage.addressing, params=["foo=1"])
exp1 = first(results)
ref_info1 = first(exp_refs_by_rev(scm, exp1))
results = dvc.experiments.run(exp_stage.addressing, params=["foo=2"])
exp2 = first(results)
ref_info2 = first(exp_refs_by_rev(scm, exp2))
scm.commit("new_baseline")
results = dvc.experiments.run(exp_stage.addressing, params=["foo=3"])
exp3 = first(results)
ref_info3 = first(exp_refs_by_rev(scm, exp3))
downstream_exp = git_downstream.tmp_dir.dvc.experiments
git_downstream.tmp_dir.scm.fetch_refspecs(str(tmp_dir), ["master:master"])
downstream_exp.pull(git_downstream.remote, [], rev=[baseline, scm.get_rev()])
assert git_downstream.tmp_dir.scm.get_ref(str(ref_info1)) == exp1
assert git_downstream.tmp_dir.scm.get_ref(str(ref_info2)) == exp2
assert git_downstream.tmp_dir.scm.get_ref(str(ref_info3)) == exp3
def test_pull_diverged(tmp_dir, scm, dvc, git_downstream, exp_stage): def test_pull_diverged(tmp_dir, scm, dvc, git_downstream, exp_stage):
git_downstream.tmp_dir.scm_gen("foo", "foo", commit="init") git_downstream.tmp_dir.scm_gen("foo", "foo", commit="init")
remote_rev = git_downstream.tmp_dir.scm.get_rev() remote_rev = git_downstream.tmp_dir.scm.get_rev()
+23
View File
@@ -156,3 +156,26 @@ def test_remove_experiments_by_rev(tmp_dir, scm, dvc, exp_stage):
assert "queue2" in queue_revs assert "queue2" in queue_revs
assert scm.get_ref(new_exp_ref) is not None assert scm.get_ref(new_exp_ref) is not None
assert "queue4" in queue_revs assert "queue4" in queue_revs
def test_remove_multi_rev(tmp_dir, scm, dvc, exp_stage):
baseline = scm.get_rev()
results = dvc.experiments.run(exp_stage.addressing, params=["foo=1"])
baseline_exp_ref = first(exp_refs_by_rev(scm, first(results)))
dvc.experiments.run(
exp_stage.addressing, params=["foo=2"], queue=True, name="queue2"
)
scm.commit("new_baseline")
results = dvc.experiments.run(exp_stage.addressing, params=["foo=3"])
new_exp_ref = first(exp_refs_by_rev(scm, first(results)))
assert set(dvc.experiments.remove(rev=[baseline, scm.get_rev()])) == {
baseline_exp_ref.name,
new_exp_ref.name,
}
assert scm.get_ref(str(baseline_exp_ref)) is None
assert scm.get_ref(str(new_exp_ref)) is None