diff --git a/dvc/ignore.py b/dvc/ignore.py index 17dbde4da..54b04f507 100644 --- a/dvc/ignore.py +++ b/dvc/ignore.py @@ -3,9 +3,11 @@ from __future__ import unicode_literals import logging import os +from funcy import cached_property from pathspec import PathSpec from pathspec.patterns import GitWildMatchPattern +from dvc.scm.tree import BaseTree from dvc.utils import relpath logger = logging.getLogger(__name__) @@ -90,3 +92,39 @@ class DvcIgnoreFilter(object): dirs, files = ignore(root, dirs, files) return dirs, files + + +class CleanTree(BaseTree): + def __init__(self, tree): + self.tree = tree + + @cached_property + def dvcignore(self): + return DvcIgnoreFilter(self.tree) + + @property + def tree_root(self): + return self.tree.tree_root + + def open(self, path, mode="r", encoding="utf-8"): + return self.tree.open(path, mode, encoding) + + def exists(self, path): + return self.tree.exists(path) + + def isdir(self, path): + return self.tree.isdir(path) + + def isfile(self, path): + return self.tree.isfile(path) + + def walk(self, top, topdown=True): + for r, d, fs in self.tree.walk(top, topdown): + d[:], fs[:] = self.dvcignore(r, d, fs) + + yield r, d, fs + + def walk_files(self, top): + for root, _, files in self.walk(top): + for file in files: + yield os.path.join(root, file) diff --git a/dvc/repo/brancher.py b/dvc/repo/brancher.py index a24415a07..99b6aab79 100644 --- a/dvc/repo/brancher.py +++ b/dvc/repo/brancher.py @@ -1,6 +1,7 @@ from funcy import group_by -from dvc.scm.tree import WorkingTree, CleanTree +from dvc.ignore import CleanTree +from dvc.scm.tree import WorkingTree def brancher( # noqa: E302 diff --git a/dvc/scm/git/__init__.py b/dvc/scm/git/__init__.py index 874c9e510..194c714fd 100644 --- a/dvc/scm/git/__init__.py +++ b/dvc/scm/git/__init__.py @@ -8,13 +8,13 @@ from funcy import cached_property from pathspec.patterns import GitWildMatchPattern from dvc.exceptions import GitHookAlreadyExistsError +from dvc.ignore import CleanTree from dvc.scm.base import Base from dvc.scm.base import CloneError from dvc.scm.base import FileNotInRepoError from dvc.scm.base import RevError from dvc.scm.base import SCMError from dvc.scm.git.tree import GitTree -from dvc.scm.tree import CleanTree from dvc.utils import fix_env from dvc.utils import is_binary from dvc.utils import relpath diff --git a/dvc/scm/tree.py b/dvc/scm/tree.py index 21fba4035..e95af7d57 100644 --- a/dvc/scm/tree.py +++ b/dvc/scm/tree.py @@ -1,8 +1,5 @@ import os -from funcy import cached_property - -from dvc.ignore import DvcIgnoreFilter from dvc.utils.compat import open @@ -75,39 +72,3 @@ class WorkingTree(BaseTree): top, topdown=topdown, onerror=onerror ): yield os.path.normpath(root), dirs, files - - -class CleanTree(BaseTree): - def __init__(self, tree): - self.tree = tree - - @cached_property - def dvcignore(self): - return DvcIgnoreFilter(self.tree) - - @property - def tree_root(self): - return self.tree.tree_root - - def open(self, path, mode="r", encoding="utf-8"): - return self.tree.open(path, mode, encoding) - - def exists(self, path): - return self.tree.exists(path) - - def isdir(self, path): - return self.tree.isdir(path) - - def isfile(self, path): - return self.tree.isfile(path) - - def walk(self, top, topdown=True, **kwargs): - for r, d, fs in self.tree.walk(top, topdown): - d[:], fs[:] = self.dvcignore(r, d, fs) - - yield r, d, fs - - def walk_files(self, top): - for root, _, files in self.walk(top): - for file in files: - yield os.path.join(root, file) diff --git a/tests/func/test_repo.py b/tests/func/test_repo.py index d78b55fa6..8bb7abfed 100644 --- a/tests/func/test_repo.py +++ b/tests/func/test_repo.py @@ -1,9 +1,9 @@ import os +from dvc.ignore import CleanTree from dvc.scm.git.tree import GitTree from dvc.cache import Cache from dvc.repo import Repo -from dvc.scm.tree import CleanTree from dvc.system import System from dvc.utils.compat import fspath diff --git a/tests/func/test_tree.py b/tests/func/test_tree.py index d3df8528e..29d8d5e21 100644 --- a/tests/func/test_tree.py +++ b/tests/func/test_tree.py @@ -3,9 +3,10 @@ from __future__ import unicode_literals from os.path import join +from dvc.ignore import CleanTree from dvc.scm import SCM from dvc.scm.git import GitTree -from dvc.scm.tree import WorkingTree, CleanTree +from dvc.scm.tree import WorkingTree from tests.basic_env import TestDir from tests.basic_env import TestGit from tests.basic_env import TestGitSubmodule diff --git a/tests/unit/utils/test_fs.py b/tests/unit/utils/test_fs.py index 0dca8c65b..bc1547629 100644 --- a/tests/unit/utils/test_fs.py +++ b/tests/unit/utils/test_fs.py @@ -5,8 +5,9 @@ import pytest from mock import patch import dvc +from dvc.ignore import CleanTree from dvc.path_info import PathInfo -from dvc.scm.tree import WorkingTree, CleanTree +from dvc.scm.tree import WorkingTree from dvc.system import System from dvc.utils import relpath from dvc.utils.compat import str