From 93993e97514a4777196729ffdbf22702d119939d Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Fri, 31 Jul 2020 04:04:55 +0300 Subject: [PATCH 1/3] remote: allow local options for repo remotes Fixes #4276 --- dvc/command/remote.py | 9 +++++++-- dvc/config.py | 8 ++++---- tests/func/test_remote.py | 7 +++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/dvc/command/remote.py b/dvc/command/remote.py index db622a378b..a3484a7be6 100644 --- a/dvc/command/remote.py +++ b/dvc/command/remote.py @@ -3,7 +3,7 @@ from dvc.command.base import append_doc_link, fix_subparsers from dvc.command.config import CmdConfig -from dvc.config import ConfigError +from dvc.config import ConfigError, merge from dvc.utils import format_link logger = logging.getLogger(__name__) @@ -61,7 +61,12 @@ def run(self): class CmdRemoteModify(CmdRemote): def run(self): with self.config.edit(self.args.level) as conf: - self._check_exists(conf) + merged = self.config.load_config_to_level(self.args.level) + merge(merged, conf) + self._check_exists(merged) + + if self.args.name not in conf["remote"]: + conf["remote"][self.args.name] = {} section = conf["remote"][self.args.name] if self.args.unset: section.pop(self.args.option, None) diff --git a/dvc/config.py b/dvc/config.py index 68cda1bece..26181e4d67 100644 --- a/dvc/config.py +++ b/dvc/config.py @@ -400,7 +400,7 @@ def load_config_to_level(self, level=None): if merge_level == level: break if merge_level in self.files: - _merge(merged_conf, self.load_one(merge_level)) + merge(merged_conf, self.load_one(merge_level)) return merged_conf @contextmanager @@ -414,7 +414,7 @@ def edit(self, level="repo"): conf = self._save_paths(conf, self.files[level]) merged_conf = self.load_config_to_level(level) - _merge(merged_conf, conf) + merge(merged_conf, conf) self.validate(merged_conf) self._save_config(level, conf) @@ -453,11 +453,11 @@ def _pack_remotes(conf): return result -def _merge(into, update): +def merge(into, update): """Merges second dict into first recursively""" for key, val in update.items(): if isinstance(into.get(key), dict) and isinstance(val, dict): - _merge(into[key], val) + merge(into[key], val) else: into[key] = val diff --git a/tests/func/test_remote.py b/tests/func/test_remote.py index 35ce310f06..e90046d85c 100644 --- a/tests/func/test_remote.py +++ b/tests/func/test_remote.py @@ -232,6 +232,13 @@ def test_modify_missing_remote(tmp_dir, dvc): assert main(["remote", "modify", "myremote", "user", "xxx"]) == 251 +def test_modify_parent_remote(tmp_dir, dvc): + assert main(["remote", "add", "myremote", "http://example.com/path"]) == 0 + assert ( + main(["remote", "modify", "myremote", "user", "xxx", "--local"]) == 0 + ) + + def test_external_dir_resource_on_no_cache(tmp_dir, dvc, tmp_path_factory): # https://github.com/iterative/dvc/issues/2647, is some situations # (external dir dependency) cache is required to calculate dir md5 From 6dc69df9a217da942e8d26edd387a40e142a7574 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Fri, 31 Jul 2020 07:49:05 +0300 Subject: [PATCH 2/3] Update tests/func/test_remote.py Co-authored-by: Saugat Pachhai --- tests/func/test_remote.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/func/test_remote.py b/tests/func/test_remote.py index e90046d85c..675b47cb8a 100644 --- a/tests/func/test_remote.py +++ b/tests/func/test_remote.py @@ -232,7 +232,7 @@ def test_modify_missing_remote(tmp_dir, dvc): assert main(["remote", "modify", "myremote", "user", "xxx"]) == 251 -def test_modify_parent_remote(tmp_dir, dvc): +def test_remote_modify_local_on_repo_config(tmp_dir, dvc): assert main(["remote", "add", "myremote", "http://example.com/path"]) == 0 assert ( main(["remote", "modify", "myremote", "user", "xxx", "--local"]) == 0 From 46d3d1b6943b311e75da684c70aca2757e582a18 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Fri, 31 Jul 2020 08:49:56 +0300 Subject: [PATCH 3/3] add more tests --- tests/func/test_remote.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/func/test_remote.py b/tests/func/test_remote.py index 675b47cb8a..38196ffbdd 100644 --- a/tests/func/test_remote.py +++ b/tests/func/test_remote.py @@ -237,6 +237,17 @@ def test_remote_modify_local_on_repo_config(tmp_dir, dvc): assert ( main(["remote", "modify", "myremote", "user", "xxx", "--local"]) == 0 ) + assert dvc.config.load_one("local")["remote"]["myremote"] == { + "user": "xxx" + } + assert dvc.config.load_one("repo")["remote"]["myremote"] == { + "url": "http://example.com/path" + } + dvc.config.load() + assert dvc.config["remote"]["myremote"] == { + "url": "http://example.com/path", + "user": "xxx", + } def test_external_dir_resource_on_no_cache(tmp_dir, dvc, tmp_path_factory):