From 66def035bfd7c483ce99b963c8c5f1c0cfae48b4 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Tue, 14 Jul 2020 22:39:19 +0300 Subject: [PATCH] list: support tracked file path as a target (#4204) * list: support tracked file path as a target Fixes #4202 * erepo: add __str__ to improve error readablity Related to #4202 --- dvc/external_repo.py | 3 +++ dvc/repo/tree.py | 3 ++- tests/func/test_ls.py | 30 ++++++++++++++++++++++++++++++ tests/func/test_tree.py | 2 +- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/dvc/external_repo.py b/dvc/external_repo.py index 5f22321473..809d04b9c2 100644 --- a/dvc/external_repo.py +++ b/dvc/external_repo.py @@ -72,6 +72,9 @@ class BaseExternalRepo: _local_cache = None + def __str__(self): + return self.url + @property def local_cache(self): if hasattr(self, "cache"): diff --git a/dvc/repo/tree.py b/dvc/repo/tree.py index 1b12ad68ef..1639d144a6 100644 --- a/dvc/repo/tree.py +++ b/dvc/repo/tree.py @@ -44,6 +44,7 @@ def _is_cached(out): return outs def _get_granular_checksum(self, path, out, remote=None): + assert isinstance(path, PathInfo) if not self.fetch and not self.stream: raise FileNotFoundError dir_cache = out.get_dir_cache(remote=remote) @@ -128,7 +129,7 @@ def isdir(self, path): # for dir checksum, we need to check if this is a file inside the # directory try: - self._get_granular_checksum(path, out) + self._get_granular_checksum(path_info, out) return False except FileNotFoundError: return True diff --git a/tests/func/test_ls.py b/tests/func/test_ls.py index 14d57acf15..85dd9eb1ba 100644 --- a/tests/func/test_ls.py +++ b/tests/func/test_ls.py @@ -472,3 +472,33 @@ def test_ls_granular(erepo_dir): {"isout": False, "isdir": False, "isexec": False, "path": "2"}, {"isout": False, "isdir": True, "isexec": False, "path": "subdir"}, ] + + +@pytest.mark.parametrize("use_scm", [True, False]) +def test_ls_target(erepo_dir, use_scm): + with erepo_dir.chdir(): + gen = erepo_dir.scm_gen if use_scm else erepo_dir.dvc_gen + gen( + { + "dir": { + "1": "1", + "2": "2", + "subdir": {"foo": "foo", "bar": "bar"}, + } + }, + commit="create dir", + ) + + def _ls(path): + return Repo.ls(os.fspath(erepo_dir), path) + + assert _ls(os.path.join("dir", "1")) == [ + {"isout": False, "isdir": False, "isexec": False, "path": "1"} + ] + assert _ls(os.path.join("dir", "subdir", "foo")) == [ + {"isout": False, "isdir": False, "isexec": False, "path": "foo"} + ] + assert _ls(os.path.join("dir", "subdir")) == [ + {"isdir": False, "isexec": 0, "isout": False, "path": "bar"}, + {"isdir": False, "isexec": 0, "isout": False, "path": "foo"}, + ] diff --git a/tests/func/test_tree.py b/tests/func/test_tree.py index ebfd9aea69..8cb49d10d4 100644 --- a/tests/func/test_tree.py +++ b/tests/func/test_tree.py @@ -211,7 +211,7 @@ def test_repotree_cache_save(tmp_dir, dvc, scm, erepo_dir, local_cloud): # into dvc.cache, not fetched or streamed from a remote tree = RepoTree(erepo_dir.dvc, stream=True) expected = [ - tree.get_file_hash(erepo_dir / path) + tree.get_file_hash(PathInfo(erepo_dir / path)) for path in ("dir/bar", "dir/subdir/foo") ]