diff --git a/dvc/fs/git.py b/dvc/fs/git.py index dd830ea14..13c43d554 100644 --- a/dvc/fs/git.py +++ b/dvc/fs/git.py @@ -50,3 +50,6 @@ class GitFileSystem(FSSpecWrapper): # pylint:disable=abstract-method @property def rev(self) -> str: return self.fs.rev + + def ls(self, path, **kwargs): + return self.fs.ls(path, **kwargs) or [] diff --git a/dvc/fs/local.py b/dvc/fs/local.py index 8bbfa2123..159531800 100644 --- a/dvc/fs/local.py +++ b/dvc/fs/local.py @@ -147,6 +147,9 @@ class LocalFileSystem(FileSystem): def info(self, path): return self.fs.info(path) + def ls(self, path, **kwargs): + return self.fs.ls(path, **kwargs) + def put_file( self, from_file, to_info, callback=DEFAULT_CALLBACK, **kwargs ): diff --git a/dvc/fs/repo.py b/dvc/fs/repo.py index c8de8c32b..a15db1c98 100644 --- a/dvc/fs/repo.py +++ b/dvc/fs/repo.py @@ -28,13 +28,12 @@ def _ls(fs, path): dnames = [] fnames = [] - with suppress(FileNotFoundError): - for entry in fs.ls(path, detail=True): - name = fs.path.name(entry["name"]) - if entry["type"] == "directory": - dnames.append(name) - else: - fnames.append(name) + for entry in fs.ls(path, detail=True): + name = fs.path.name(entry["name"]) + if entry["type"] == "directory": + dnames.append(name) + else: + fnames.append(name) return dnames, fnames @@ -362,15 +361,20 @@ class RepoFileSystem(FileSystem): # pylint:disable=abstract-method assert dvcignore - dvc_dirs, dvc_fnames = _ls(dvc_fs, dvc_path) if dvc_fs else ([], []) + dvc_dirs, dvc_fnames = [], [] + if dvc_fs: + with suppress(FileNotFoundError): + dvc_dirs, dvc_fnames = _ls(dvc_fs, dvc_path) try: - _, repo_dirs, repo_fnames = next( - dvcignore.walk(fs, fs_path, **kwargs) - ) - except StopIteration: + repo_dirs, repo_fnames = _ls(fs, fs_path) + except FileNotFoundError: return + repo_dirs, repo_fnames = dvcignore( + fs_path, repo_dirs, repo_fnames, **kwargs + ) + # separate subdirs into shared dirs, dvc-only dirs, repo-only dirs dvc_set = set(dvc_dirs) repo_set = set(repo_dirs)