From fe2d913821d9e24eed09b6dda55d6207d440e1bb Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Thu, 28 Jan 2021 03:05:05 +0200 Subject: [PATCH] list: don't clone local repos (#5341) * repo: introduce Repo.open * ls: don't clone local repos --- dvc/external_repo.py | 8 ++++++-- dvc/repo/__init__.py | 12 ++++++++++++ dvc/repo/ls.py | 4 ++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dvc/external_repo.py b/dvc/external_repo.py index 7b12df4cd..3dd2fc96e 100644 --- a/dvc/external_repo.py +++ b/dvc/external_repo.py @@ -59,13 +59,17 @@ def external_repo( url=url, scm=None if for_write else Git(root_dir), rev=None if for_write else rev, - subrepos=not for_write, - uninitialized=True, config=config, repo_factory=make_repo, **kwargs, ) + if "subrepos" not in repo_kwargs: + repo_kwargs["subrepos"] = True + + if "uninitialized" not in repo_kwargs: + repo_kwargs["uninitialized"] = True + repo = Repo(**repo_kwargs) try: diff --git a/dvc/repo/__init__.py b/dvc/repo/__init__.py index 25c80fa3c..9c98bd8c1 100644 --- a/dvc/repo/__init__.py +++ b/dvc/repo/__init__.py @@ -202,6 +202,18 @@ class Repo: def __str__(self): return self.url or self.root_dir + @staticmethod + @contextmanager + def open(url, *args, **kwargs): + if os.path.exists(url): + yield Repo(url, *args, **kwargs) + return + + from dvc.external_repo import external_repo + + with external_repo(url, *args, **kwargs) as repo: + yield repo + @cached_property def scm(self): from dvc.scm import SCM diff --git a/dvc/repo/ls.py b/dvc/repo/ls.py index 720b58661..12c759385 100644 --- a/dvc/repo/ls.py +++ b/dvc/repo/ls.py @@ -28,9 +28,9 @@ def ls( "isexec": bool, } """ - from dvc.external_repo import external_repo + from . import Repo - with external_repo(url, rev) as repo: + with Repo.open(url, rev, subrepos=True, uninitialized=True) as repo: path_info = PathInfo(repo.root_dir) if path: path_info /= path