diff --git a/swh/web/common/identifiers.py b/swh/web/common/identifiers.py --- a/swh/web/common/identifiers.py +++ b/swh/web/common/identifiers.py @@ -140,9 +140,12 @@ revision = archive.lookup_revision(release["target"]) directory = revision["directory"] if object_type == ObjectType.CONTENT: - if not swhid_parsed.origin: - # when no origin context, content objects need to have their - # path prefixed by root directory id for proper breadcrumbs display + if ( + not swhid_parsed.origin + and swhid_parsed.anchor.object_type != ObjectType.REVISION + ): + # when no origin or revision context, content objects need to have + # their path prefixed by root directory id for breadcrumbs display query_dict["path"] = hash_to_hex(directory) + query_dict["path"] else: # remove leading slash from SWHID content path diff --git a/swh/web/tests/common/test_identifiers.py b/swh/web/tests/common/test_identifiers.py --- a/swh/web/tests/common/test_identifiers.py +++ b/swh/web/tests/common/test_identifiers.py @@ -635,3 +635,40 @@ swhid = gen_swhid(DIRECTORY, directory, metadata={"origin": malformed_origin_url}) resolved_swhid = resolve_swhid(swhid) assert origin_url in resolved_swhid["browse_url"] + + +@given(revision()) +def test_resolve_dir_entry_swhid_with_anchor_revision(archive_data, revision): + revision_data = archive_data.revision_get(revision) + directory = revision_data["directory"] + dir_content = archive_data.directory_ls(directory) + dir_entry = random.choice(dir_content) + + rev_swhid = gen_swhid(REVISION, revision) + + if dir_entry["type"] == "rev": + return + + if dir_entry["type"] == "file": + swhid = gen_swhid( + CONTENT, + dir_entry["checksums"]["sha1_git"], + metadata={"anchor": rev_swhid, "path": f"/{dir_entry['name']}"}, + ) + + else: + swhid = gen_swhid( + DIRECTORY, + dir_entry["target"], + metadata={"anchor": rev_swhid, "path": f"/{dir_entry['name']}/"}, + ) + + browse_url = reverse( + "browse-revision", + url_args={"sha1_git": revision}, + query_params={"path": dir_entry["name"]}, + ) + + resolved_swhid = resolve_swhid(swhid) + + assert resolved_swhid["browse_url"] == browse_url