diff --git a/dvc/tree/__init__.py b/dvc/tree/__init__.py index b9a38325c..aff54088a 100644 --- a/dvc/tree/__init__.py +++ b/dvc/tree/__init__.py @@ -43,10 +43,10 @@ def _get_conf(repo, **kwargs): remote_conf = repo.config["remote"][name.lower()] else: remote_conf = kwargs - return _resolve_remote_refs(repo.config, remote_conf) + return _resolve_remote_refs(repo, remote_conf) -def _resolve_remote_refs(config, remote_conf): +def _resolve_remote_refs(repo, remote_conf): # Support for cross referenced remotes. # This will merge the settings, shadowing base ref with remote_conf. # For example, having: @@ -72,7 +72,7 @@ def _resolve_remote_refs(config, remote_conf): if parsed.scheme != "remote": return remote_conf - base = config["remote"][parsed.netloc] + base = _get_conf(repo, name=parsed.netloc) url = posixpath.join(base["url"], parsed.path.lstrip("/")) return {**base, **remote_conf, "url": url} diff --git a/tests/unit/tree/test_tree.py b/tests/unit/tree/test_tree.py new file mode 100644 index 000000000..645617610 --- /dev/null +++ b/tests/unit/tree/test_tree.py @@ -0,0 +1,18 @@ +from dvc.path_info import CloudURLInfo +from dvc.tree import get_cloud_tree + + +def test_get_cloud_tree(tmp_dir, dvc): + tmp_dir.add_remote(name="base", url="s3://bucket/path", default=False) + tmp_dir.add_remote(name="first", url="remote://base/first", default=False) + tmp_dir.add_remote( + name="second", url="remote://first/second", default=False + ) + + base = CloudURLInfo("s3://bucket/path") + first = base / "first" + second = first / "second" + + assert get_cloud_tree(dvc, name="base").path_info == base + assert get_cloud_tree(dvc, name="first").path_info == first + assert get_cloud_tree(dvc, name="second").path_info == second