diff --git a/dvc/repo/index.py b/dvc/repo/index.py index b3dfb47ee..bac2bfa36 100644 --- a/dvc/repo/index.py +++ b/dvc/repo/index.py @@ -221,7 +221,7 @@ def _load_storage_from_out(storage_map, key, out): ), ) ) - storage_map.add_remote(FileStorage(key, dep.fs, dep.fs_path)) + storage_map.add_remote(FileStorage(key, dep.fs, dep.fs_path, read_only=True)) class Index: diff --git a/pyproject.toml b/pyproject.toml index 54c1b4614..95e30fe91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ dependencies = [ "configobj>=5.0.6", "distro>=1.3", "dpath<3,>=2.1.0", - "dvc-data>=3.4,<3.5", + "dvc-data>=3.5,<3.6", "dvc-http>=2.29.0", "dvc-render>=1.0.0,<2", "dvc-studio-client>=0.17.1,<1", diff --git a/tests/func/test_repo_index.py b/tests/func/test_repo_index.py index 9a0b06ea4..42a5123a2 100644 --- a/tests/func/test_repo_index.py +++ b/tests/func/test_repo_index.py @@ -1,3 +1,4 @@ +import os from itertools import chain import pytest @@ -338,3 +339,53 @@ params: tmp_dir.gen("dvc.yaml", top_level_params) index = Index.from_repo(dvc) assert index.param_keys == {"repo": {("classifier", "custom_params_file.yaml")}} + + +def test_data_index(tmp_dir, dvc, local_cloud, erepo_dir): + tmp_dir.dvc_gen( + { + "foo": b"foo", + "dir": {"bar": b"bar", "subdir": {"baz": b"baz"}}, + } + ) + + with erepo_dir.chdir(): + erepo_dir.dvc_gen("efoo", b"efoo", commit="create efoo") + erepo_dir.dvc_gen( + "edir", + {"ebar": b"ebar", "esubdir": {"ebaz": b"ebaz"}}, + commit="create edir", + ) + + dvc.imp(os.fspath(erepo_dir), "efoo") + dvc.imp(os.fspath(erepo_dir), "edir") + + local_cloud.gen("ifoo", b"ifoo") + local_cloud.gen("idir", {"ibar": b"ibar", "isubdir": {"ibaz": b"ibaz"}}) + + dvc.imp_url(str(local_cloud / "ifoo")) + dvc.imp_url(str(local_cloud / "idir")) + + index = Index.from_repo(dvc) + assert index.data_keys == { + "local": set(), + "repo": {("dir",), ("edir",), ("efoo",), ("foo",), ("idir",), ("ifoo",)}, + } + + data = index.data["repo"] + assert set(data.keys()) == { + ("dir",), + ("edir",), + ("efoo",), + ("foo",), + ("idir",), + ("ifoo",), + } + + assert not data.storage_map[("foo",)].remote + assert not data.storage_map[("dir",)].remote + + assert data.storage_map[("efoo",)].remote.read_only + assert data.storage_map[("edir",)].remote.read_only + assert data.storage_map[("ifoo",)].remote.read_only + assert data.storage_map[("idir",)].remote.read_only