mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-02 07:18:25 +01:00
config: use wtree for non-repo configs (#4341)
For example, when `dvc import`ing something, dvc won't see stuff declared in system and global configs, because GitTree doesn't see stuff that is outside of the git repo. Discord context: https://discordapp.com/channels/485586884165107732/563406153334128681/740543492417126521
This commit is contained in:
+11
-4
@@ -324,11 +324,17 @@ class Config(dict):
|
||||
if not self["cache"].get("dir") and self.dvc_dir:
|
||||
self["cache"]["dir"] = os.path.join(self.dvc_dir, "cache")
|
||||
|
||||
def _get_tree(self, level):
|
||||
# NOTE: this might be a GitTree, which doesn't see things outside of
|
||||
# the repo.
|
||||
return self.tree if level == "repo" else self.wtree
|
||||
|
||||
def _load_config(self, level):
|
||||
filename = self.files[level]
|
||||
tree = self._get_tree(level)
|
||||
|
||||
if self.tree.exists(filename, use_dvcignore=False):
|
||||
with self.tree.open(filename) as fobj:
|
||||
if tree.exists(filename, use_dvcignore=False):
|
||||
with tree.open(filename) as fobj:
|
||||
conf_obj = configobj.ConfigObj(fobj)
|
||||
else:
|
||||
conf_obj = configobj.ConfigObj()
|
||||
@@ -336,13 +342,14 @@ class Config(dict):
|
||||
|
||||
def _save_config(self, level, conf_dict):
|
||||
filename = self.files[level]
|
||||
tree = self._get_tree(level)
|
||||
|
||||
logger.debug(f"Writing '{filename}'.")
|
||||
|
||||
self.tree.makedirs(os.path.dirname(filename))
|
||||
tree.makedirs(os.path.dirname(filename))
|
||||
|
||||
config = configobj.ConfigObj(_pack_remotes(conf_dict))
|
||||
with self.tree.open(filename, "wb") as fobj:
|
||||
with tree.open(filename, "wb") as fobj:
|
||||
config.write(fobj)
|
||||
config.filename = filename
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import os
|
||||
import pytest
|
||||
|
||||
from dvc.config import Config
|
||||
from dvc.tree.local import LocalTree
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@@ -16,3 +17,19 @@ from dvc.config import Config
|
||||
)
|
||||
def test_to_relpath(path, expected):
|
||||
assert Config._to_relpath(os.path.join(".", "config"), path) == expected
|
||||
|
||||
|
||||
def test_get_tree(tmp_dir, scm):
|
||||
tmp_dir.scm_gen("foo", "foo", commit="add foo")
|
||||
|
||||
tree = scm.get_tree("master")
|
||||
config = Config(tree=tree)
|
||||
|
||||
assert config.tree == tree
|
||||
assert config.wtree != tree
|
||||
assert isinstance(config.wtree, LocalTree)
|
||||
|
||||
assert config._get_tree("repo") == tree
|
||||
assert config._get_tree("local") == config.wtree
|
||||
assert config._get_tree("global") == config.wtree
|
||||
assert config._get_tree("system") == config.wtree
|
||||
|
||||
Reference in New Issue
Block a user