Skip to content

Commit

Permalink
scm: Add ignore_revs arg to iter_revs.
Browse files Browse the repository at this point in the history
  • Loading branch information
daavoo committed Aug 5, 2022
1 parent 634894d commit e3ea7ae
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
8 changes: 6 additions & 2 deletions dvc/scm.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os
from contextlib import contextmanager
from functools import partial
from typing import TYPE_CHECKING, Iterator, List, Mapping, Optional
from typing import TYPE_CHECKING, Iterator, List, Mapping, Optional, Set

from funcy import group_by
from scmrepo.base import Base # noqa: F401, pylint: disable=unused-import
Expand Down Expand Up @@ -204,6 +204,7 @@ def iter_revs(
all_commits: bool = False,
all_experiments: bool = False,
commit_date: Optional[str] = None,
ignore_revs: Optional[Set[str]] = None,
) -> Mapping[str, List[str]]:
from scmrepo.exceptions import SCMError as _SCMError

Expand All @@ -222,6 +223,7 @@ def iter_revs(
return {}

revs = revs or []
ignore_revs = ignore_revs or set()
results: List[str] = _get_n_commits(scm, revs, num)

if all_commits:
Expand Down Expand Up @@ -254,4 +256,6 @@ def _time_filter(rev):
results.extend(exp_commits(scm))

rev_resolver = partial(resolve_rev, scm)
return group_by(rev_resolver, results)
grouped = group_by(rev_resolver, results)

return {k: v for k, v in grouped.items() if k not in ignore_revs}
37 changes: 31 additions & 6 deletions tests/unit/scm/test_scm.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
from datetime import datetime

import pytest
from scmrepo.exceptions import SCMError

from dvc.repo.experiments import ExpRefInfo
from dvc.scm import GitMergeError, iter_revs


def test_iter_revs(
tmp_dir,
scm,
mocker,
):
@pytest.fixture
def setup_revs(tmp_dir, scm):
"""
new other
│ │
Expand All @@ -37,6 +35,12 @@ def test_iter_revs(
ref = ExpRefInfo(rev_root, "exp2")
scm.set_ref(str(ref), rev_old)

return old, rev_root, rev_old, rev_new, rev_other


def test_iter_revs_rev_num(scm, setup_revs):
_, rev_root, rev_old, rev_new, rev_other = setup_revs

gen = iter_revs(scm, [rev_root, "new"], 1)
assert gen == {rev_root: [rev_root], rev_new: ["new"]}
gen = iter_revs(scm, ["new"], 2)
Expand All @@ -49,6 +53,11 @@ def test_iter_revs(
}
gen = iter_revs(scm, ["tag"])
assert gen == {rev_old: ["tag"]}


def test_iter_revs_all(scm, setup_revs):
old, rev_root, rev_old, rev_new, rev_other = setup_revs

gen = iter_revs(scm, all_branches=True)
assert gen == {rev_old: [old], rev_new: ["new"], rev_other: ["other"]}
gen = iter_revs(scm, all_tags=True)
Expand All @@ -67,8 +76,11 @@ def test_iter_revs(
rev_root: [rev_root],
}

def _func(rev):

def test_iter_revs_commit_date(scm, setup_revs, mocker):
_, rev_root, rev_old, rev_new, rev_other = setup_revs

def _func(rev):
if rev == rev_root:
return mocker.Mock(commit_date=datetime(2022, 6, 28).timestamp())
if rev == rev_old:
Expand All @@ -87,6 +99,19 @@ def _func(rev):
}


def test_iter_revs_ignore(scm, setup_revs):
_, rev_root, rev_old, rev_new, rev_other = setup_revs

gen = iter_revs(scm, all_commits=True, ignore_revs={rev_old, rev_new})
assert gen == {rev_other: [rev_other], rev_root: [rev_root]}
gen = iter_revs(scm, all_branches=True, ignore_revs={rev_old, rev_new})
assert gen == {rev_other: ["other"]}
gen = iter_revs(scm, all_tags=True, ignore_revs={rev_old, rev_new})
assert gen == {}
gen = iter_revs(scm, all_experiments=True, ignore_revs={rev_old, rev_new})
assert gen == {rev_root: [rev_root]}


def test_merge_error(tmp_dir, scm):
exc = GitMergeError("Merge failed")
assert "shallow" not in str(exc)
Expand Down

0 comments on commit e3ea7ae

Please sign in to comment.