From ecd98bdf7d32dec753a97591c35c832f96a7ea46 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Wed, 3 Aug 2022 17:04:24 +0300 Subject: [PATCH] odbmgr: separate repo and local odbs --- dvc/info.py | 2 +- dvc/odbmgr.py | 8 +++++--- dvc/output.py | 3 ++- dvc/repo/__init__.py | 6 +++--- dvc/repo/data.py | 4 ++-- dvc/repo/diff.py | 4 ++-- dvc/repo/experiments/executor/local.py | 2 +- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/dvc/info.py b/dvc/info.py index 2797915a3..ecb0475a8 100644 --- a/dvc/info.py +++ b/dvc/info.py @@ -58,7 +58,7 @@ def _get_caches(cache): caches = ( cache_type for cache_type, cache_instance in cache.by_scheme() - if cache_instance + if cache_instance and cache_type != "repo" ) # Caches will be always non-empty including the local cache diff --git a/dvc/odbmgr.py b/dvc/odbmgr.py index df4b2fb84..d17291208 100644 --- a/dvc/odbmgr.py +++ b/dvc/odbmgr.py @@ -24,7 +24,7 @@ class ODBManager: ] def __init__(self, repo): - self.repo = repo + self._repo = repo self.config = config = repo.config["cache"] self._odb = {} @@ -42,13 +42,15 @@ class ODBManager: if opt in config: settings[str(opt)] = config.get(opt) - self._odb[Schemes.LOCAL] = _get_odb(repo, settings) + odb = _get_odb(repo, settings) + self._odb["repo"] = odb + self._odb[Schemes.LOCAL] = odb def _init_odb(self, schemes): for scheme in schemes: remote = self.config.get(scheme) settings = {"name": remote} if remote else None - self._odb[scheme] = _get_odb(self.repo, settings) + self._odb[scheme] = _get_odb(self._repo, settings) def __getattr__(self, name): if name not in self._odb and name in self.CLOUD_SCHEMES: diff --git a/dvc/output.py b/dvc/output.py index cc0ca349f..8cbf227c2 100644 --- a/dvc/output.py +++ b/dvc/output.py @@ -409,7 +409,8 @@ class Output: @property def odb(self): - odb = getattr(self.repo.odb, self.protocol) + odb_name = "repo" if self.is_in_repo else self.protocol + odb = getattr(self.repo.odb, odb_name) if self.use_cache and odb is None: raise RemoteCacheRequiredError(self.fs.protocol, self.fs_path) return odb diff --git a/dvc/repo/__init__.py b/dvc/repo/__init__.py index 2fb8cf035..344e75ca1 100644 --- a/dvc/repo/__init__.py +++ b/dvc/repo/__init__.py @@ -364,13 +364,13 @@ class Repo: ) def unprotect(self, target): - return self.odb.local.unprotect(target) + return self.odb.repo.unprotect(target) def _ignore(self): flist = [self.config.files["local"], self.tmp_dir] - if path_isin(self.odb.local.cache_dir, self.root_dir): - flist += [self.odb.local.cache_dir] + if path_isin(self.odb.repo.cache_dir, self.root_dir): + flist += [self.odb.repo.cache_dir] for file in flist: self.scm_context.ignore(file) diff --git a/dvc/repo/data.py b/dvc/repo/data.py index 5ab24d716..bab312e33 100644 --- a/dvc/repo/data.py +++ b/dvc/repo/data.py @@ -168,7 +168,7 @@ def _diff_index_to_wtree(repo: "Repo", **kwargs: Any) -> Dict[str, List[str]]: except FileNotFoundError: new = None - cache = repo.odb.local + cache = repo.odb.repo root = str(out) old = out.get_obj() with ui.status(f"Calculating diff for {root} between index/workspace"): @@ -196,7 +196,7 @@ def _diff_head_to_index( typ = "index" if rev == "workspace" else head objs[root][typ] = out.get_obj() - cache = repo.odb.local + cache = repo.odb.repo for root, obj_d in objs.items(): old = obj_d.get(head, None) new = obj_d.get("index", None) diff --git a/dvc/repo/diff.py b/dvc/repo/diff.py index bc04cb1fe..648a837e9 100644 --- a/dvc/repo/diff.py +++ b/dvc/repo/diff.py @@ -140,9 +140,9 @@ def _output_paths(repo, targets): if on_working_fs: _, _, obj = build( - repo.odb.local, + repo.odb.repo, output.fs_path, - repo.odb.local.fs, + repo.odb.repo.fs, "md5", dry_run=True, ignore=output.dvcignore, diff --git a/dvc/repo/experiments/executor/local.py b/dvc/repo/experiments/executor/local.py index f9ff8dce0..23d88c52e 100644 --- a/dvc/repo/experiments/executor/local.py +++ b/dvc/repo/experiments/executor/local.py @@ -112,7 +112,7 @@ class TempDirExecutor(BaseLocalExecutor): def init_cache(self, repo: "Repo", rev: str, run_cache: bool = True): """Initialize DVC cache.""" - self._config(repo.odb.local.cache_dir) + self._config(repo.odb.repo.cache_dir) def cleanup(self): super().cleanup()