Skip to content

Commit 681fb82

Browse files
authored
dvc: get rid of BaseTree in favor of BaseRemoteTree (#4240)
Related to #4050
1 parent 488e0d8 commit 681fb82

File tree

3 files changed

+32
-60
lines changed

3 files changed

+32
-60
lines changed

dvc/repo/tree.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
from dvc.exceptions import OutputNotFoundError
66
from dvc.path_info import PathInfo
77
from dvc.remote.base import RemoteActionNotImplemented
8-
from dvc.scm.tree import BaseTree
8+
from dvc.tree.base import BaseRemoteTree
99
from dvc.utils import file_md5
1010
from dvc.utils.fs import copy_fobj_to_file, makedirs
1111

1212
logger = logging.getLogger(__name__)
1313

1414

15-
class DvcTree(BaseTree): # pylint:disable=abstract-method
15+
class DvcTree(BaseRemoteTree): # pylint:disable=abstract-method
1616
"""DVC repo tree.
1717
1818
Args:
@@ -27,7 +27,7 @@ class DvcTree(BaseTree): # pylint:disable=abstract-method
2727
"""
2828

2929
def __init__(self, repo, fetch=False, stream=False):
30-
self.repo = repo
30+
super().__init__(repo, {"url": repo.root_dir})
3131
self.fetch = fetch
3232
self.stream = stream
3333

@@ -101,14 +101,14 @@ def open(
101101
cache_path = out.cache_path
102102
return open(cache_path, mode=mode, encoding=encoding)
103103

104-
def exists(self, path):
104+
def exists(self, path): # pylint: disable=arguments-differ
105105
try:
106106
self._find_outs(path, strict=False, recursive=True)
107107
return True
108108
except OutputNotFoundError:
109109
return False
110110

111-
def isdir(self, path):
111+
def isdir(self, path): # pylint: disable=arguments-differ
112112
if not self.exists(path):
113113
return False
114114

@@ -134,7 +134,7 @@ def isdir(self, path):
134134
except FileNotFoundError:
135135
return True
136136

137-
def isfile(self, path):
137+
def isfile(self, path): # pylint: disable=arguments-differ
138138
if not self.exists(path):
139139
return False
140140

@@ -237,7 +237,7 @@ def get_file_hash(self, path_info):
237237
return out.checksum
238238

239239

240-
class RepoTree(BaseTree): # pylint:disable=abstract-method
240+
class RepoTree(BaseRemoteTree): # pylint:disable=abstract-method
241241
"""DVC + git-tracked files tree.
242242
243243
Args:
@@ -247,7 +247,7 @@ class RepoTree(BaseTree): # pylint:disable=abstract-method
247247
"""
248248

249249
def __init__(self, repo, **kwargs):
250-
self.repo = repo
250+
super().__init__(repo, {"url": repo.root_dir})
251251
if hasattr(repo, "dvc_dir"):
252252
self.dvctree = DvcTree(repo, **kwargs)
253253
else:
@@ -266,7 +266,9 @@ def stream(self):
266266
return self.dvctree.stream
267267
return False
268268

269-
def open(self, path, mode="r", encoding="utf-8", **kwargs):
269+
def open(
270+
self, path, mode="r", encoding="utf-8", **kwargs
271+
): # pylint: disable=arguments-differ
270272
if "b" in mode:
271273
encoding = None
272274

@@ -276,20 +278,20 @@ def open(self, path, mode="r", encoding="utf-8", **kwargs):
276278
)
277279
return self.repo.tree.open(path, mode=mode, encoding=encoding)
278280

279-
def exists(self, path):
281+
def exists(self, path): # pylint: disable=arguments-differ
280282
return self.repo.tree.exists(path) or (
281283
self.dvctree and self.dvctree.exists(path)
282284
)
283285

284-
def isdir(self, path):
286+
def isdir(self, path): # pylint: disable=arguments-differ
285287
return self.repo.tree.isdir(path) or (
286288
self.dvctree and self.dvctree.isdir(path)
287289
)
288290

289291
def isdvc(self, path, **kwargs):
290292
return self.dvctree is not None and self.dvctree.isdvc(path, **kwargs)
291293

292-
def isfile(self, path):
294+
def isfile(self, path): # pylint: disable=arguments-differ
293295
return self.repo.tree.isfile(path) or (
294296
self.dvctree and self.dvctree.isfile(path)
295297
)
@@ -393,7 +395,7 @@ def walk(
393395
repo_walk = self.repo.tree.walk(top, topdown=topdown)
394396
yield from self._walk(dvc_walk, repo_walk, dvcfiles=dvcfiles)
395397

396-
def walk_files(self, top, **kwargs):
398+
def walk_files(self, top, **kwargs): # pylint: disable=arguments-differ
397399
for root, _, files in self.walk(top, **kwargs):
398400
for fname in files:
399401
yield PathInfo(root) / fname
@@ -437,5 +439,5 @@ def copytree(self, top, dest):
437439
copy_fobj_to_file(fobj, dest_dir / fname)
438440

439441
@property
440-
def hash_jobs(self):
442+
def hash_jobs(self): # pylint: disable=invalid-overridden-method
441443
return self.repo.tree.hash_jobs

dvc/scm/git/tree.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from funcy import cached_property
77

88
from dvc.exceptions import DvcException
9-
from dvc.scm.tree import BaseTree
9+
from dvc.tree.base import BaseRemoteTree
1010
from dvc.utils import relpath
1111

1212
# see git-fast-import(1)
@@ -21,7 +21,7 @@ def _item_basename(item):
2121
return os.path.basename(item.path)
2222

2323

24-
class GitTree(BaseTree): # pylint:disable=abstract-method
24+
class GitTree(BaseRemoteTree): # pylint:disable=abstract-method
2525
"""Proxies the repo file access methods to Git objects"""
2626

2727
def __init__(self, git, rev, use_dvcignore=False, dvcignore_root=None):
@@ -31,6 +31,7 @@ def __init__(self, git, rev, use_dvcignore=False, dvcignore_root=None):
3131
git (dvc.scm.Git):
3232
branch:
3333
"""
34+
super().__init__(None, {})
3435
self.git = git
3536
self.rev = rev
3637
self.use_dvcignore = use_dvcignore
@@ -52,7 +53,9 @@ def dvcignore(self):
5253
self.use_dvcignore = True
5354
return ret
5455

55-
def open(self, path, mode="r", encoding="utf-8"):
56+
def open(
57+
self, path, mode="r", encoding="utf-8"
58+
): # pylint: disable=arguments-differ
5659
assert mode in {"r", "rb"}
5760

5861
relative_path = relpath(path, self.git.working_dir)
@@ -73,23 +76,23 @@ def open(self, path, mode="r", encoding="utf-8"):
7376
return io.BytesIO(data)
7477
return io.StringIO(data.decode(encoding))
7578

76-
def exists(self, path):
79+
def exists(self, path): # pylint: disable=arguments-differ
7780
if self._git_object_by_path(path) is None:
7881
return False
7982

8083
return not self.dvcignore.is_ignored_file(
8184
path
8285
) and not self.dvcignore.is_ignored_dir(path)
8386

84-
def isdir(self, path):
87+
def isdir(self, path): # pylint: disable=arguments-differ
8588
obj = self._git_object_by_path(path)
8689
if obj is None:
8790
return False
8891
if obj.mode != GIT_MODE_DIR:
8992
return False
9093
return not self.dvcignore.is_ignored_dir(path)
9194

92-
def isfile(self, path):
95+
def isfile(self, path): # pylint: disable=arguments-differ
9396
obj = self._git_object_by_path(path)
9497
if obj is None:
9598
return False
@@ -214,7 +217,13 @@ def to_ctime(git_time):
214217
)
215218

216219
@property
217-
def hash_jobs(self):
220+
def hash_jobs(self): # pylint: disable=invalid-overridden-method
218221
# NOTE: gitpython is not threadsafe. See
219222
# https://github.com/iterative/dvc/issues/4079
220223
return 1
224+
225+
def walk_files(self, top): # pylint: disable=arguments-differ
226+
for root, _, files in self.walk(top):
227+
for file in files:
228+
# NOTE: os.path.join is ~5.5 times slower
229+
yield f"{root}{os.sep}{file}"

dvc/scm/tree.py

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,3 @@
1-
import os
2-
3-
4-
class BaseTree:
5-
"""Abstract class to represent access to files"""
6-
7-
@property
8-
def tree_root(self):
9-
pass
10-
11-
def open(self, path, mode="r", encoding="utf-8"):
12-
"""Open file and return a stream."""
13-
14-
def exists(self, path):
15-
"""Test whether a path exists."""
16-
17-
def isdir(self, path):
18-
"""Return true if the pathname refers to an existing directory."""
19-
20-
def isfile(self, path):
21-
"""Test whether a path is a regular file"""
22-
23-
def walk(self, top, topdown=True, onerror=None):
24-
"""Directory tree generator.
25-
26-
See `os.walk` for the docs. Differences:
27-
- no support for symlinks
28-
"""
29-
30-
def walk_files(self, top):
31-
for root, _, files in self.walk(top):
32-
for file in files:
33-
# NOTE: os.path.join is ~5.5 times slower
34-
yield f"{root}{os.sep}{file}"
35-
36-
def makedirs(self, path, mode=0o777, exist_ok=True):
37-
raise NotImplementedError
38-
39-
401
def is_working_tree(tree):
412
from dvc.tree.local import LocalRemoteTree
423

0 commit comments

Comments
 (0)