diff --git a/swh/fuse/fs/artifact.py b/swh/fuse/fs/artifact.py --- a/swh/fuse/fs/artifact.py +++ b/swh/fuse/fs/artifact.py @@ -469,6 +469,16 @@ swhid: SWHID prefix: str = field(default="") + def find_target(self, metadata: Dict[str, Any], branch_name: str) -> str: + target_type = metadata[branch_name]["target_type"] + target = metadata[branch_name]["target"] + if target_type == "revision": + return target + elif target_type == "alias": + return self.find_target(metadata, target) + else: + self.fuse.logger.error("Unknown snapshot target type: %s", target_type) + async def compute_entries(self) -> AsyncIterator[FuseEntry]: metadata = await self.fuse.get_metadata(self.swhid) root_path = self.get_relative_root_path() @@ -482,11 +492,13 @@ next_prefix = next_subdirs[0] if len(next_subdirs) == 1: - yield self.create_child( - FuseSymlinkEntry, - name=next_prefix, - target=Path(root_path, f"archive/{branch_meta['target']}"), - ) + target = self.find_target(metadata, branch_name) + if target: + yield self.create_child( + FuseSymlinkEntry, + name=next_prefix, + target=Path(root_path, f"archive/{target}"), + ) else: subdirs.add(next_prefix) diff --git a/swh/fuse/tests/data/api_data.py b/swh/fuse/tests/data/api_data.py --- a/swh/fuse/tests/data/api_data.py +++ b/swh/fuse/tests/data/api_data.py @@ -2778,6 +2778,11 @@ "target_type": "revision", "target_url": "https://archive.softwareheritage.org/api/1/revision/a2db7c15ce9f586164cabb15d83fb3f6bbeb3cf5/", }, + "HEAD": { + "target": "refs/heads/master", + "target_type": "alias", + "target_url": "https://archive.softwareheritage.org/api/1/revision/430a9fd4c797c50cea26157141b2408073b2ed91/", + }, }, "next_branch": None, }, diff --git a/swh/fuse/tests/data/gen-api-data.py b/swh/fuse/tests/data/gen-api-data.py --- a/swh/fuse/tests/data/gen-api-data.py +++ b/swh/fuse/tests/data/gen-api-data.py @@ -61,6 +61,15 @@ data = requests.get(f"{API_URL_real}/{url}").text data = json.loads(data) + if swhid.object_type == SNAPSHOT: + # Add a custom alias to test out this special case for snapshot + alias_name = "refs/heads/master" + data["branches"]["HEAD"] = { # type: ignore + "target": alias_name, + "target_type": "alias", + "target_url": data["branches"][alias_name]["target_url"], # type: ignore + } + MOCK_ARCHIVE[url] = data METADATA[swhid] = data