Skip to content

Commit 8ae0a38

Browse files
author
Lukas Pühringer
authored
Merge pull request #2338 from jku/hash-prefix
Add TargetFile.get_prefixed_paths()
2 parents 0dc4ab2 + cddae3b commit 8ae0a38

2 files changed

Lines changed: 39 additions & 0 deletions

File tree

tests/test_api.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,34 @@ def test_targetfile_from_data(self) -> None:
725725
targetfile_from_data = TargetFile.from_data(target_file_path, data)
726726
targetfile_from_data.verify_length_and_hashes(data)
727727

728+
def test_targetfile_get_prefixed_paths(self) -> None:
729+
target = TargetFile(100, {"sha256": "abc", "md5": "def"}, "a/b/f.ext")
730+
self.assertEqual(
731+
target.get_prefixed_paths(), ["a/b/abc.f.ext", "a/b/def.f.ext"]
732+
)
733+
734+
target = TargetFile(100, {"sha256": "abc", "md5": "def"}, "")
735+
self.assertEqual(target.get_prefixed_paths(), ["abc.", "def."])
736+
737+
target = TargetFile(100, {"sha256": "abc", "md5": "def"}, "a/b/")
738+
self.assertEqual(target.get_prefixed_paths(), ["a/b/abc.", "a/b/def."])
739+
740+
target = TargetFile(100, {"sha256": "abc", "md5": "def"}, "f.ext")
741+
self.assertEqual(
742+
target.get_prefixed_paths(), ["abc.f.ext", "def.f.ext"]
743+
)
744+
745+
target = TargetFile(100, {"sha256": "abc", "md5": "def"}, "a/b/.ext")
746+
self.assertEqual(
747+
target.get_prefixed_paths(), ["a/b/abc..ext", "a/b/def..ext"]
748+
)
749+
750+
target = TargetFile(100, {"sha256": "abc"}, "/root/file.ext")
751+
self.assertEqual(target.get_prefixed_paths(), ["/root/abc.file.ext"])
752+
753+
target = TargetFile(100, {"sha256": "abc"}, "/")
754+
self.assertEqual(target.get_prefixed_paths(), ["/abc."])
755+
728756
def test_is_delegated_role(self) -> None:
729757
# test path matches
730758
# see more extensive tests in test_is_target_in_pathpattern()

tuf/api/metadata.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,6 +1737,17 @@ def verify_length_and_hashes(self, data: Union[bytes, IO[bytes]]) -> None:
17371737
self._verify_length(data, self.length)
17381738
self._verify_hashes(data, self.hashes)
17391739

1740+
def get_prefixed_paths(self) -> List[str]:
1741+
"""
1742+
Return hash-prefixed URL path fragments for the target file path.
1743+
"""
1744+
paths = []
1745+
parent, sep, name = self.path.rpartition("/")
1746+
for hash_value in self.hashes.values():
1747+
paths.append(f"{parent}{sep}{hash_value}.{name}")
1748+
1749+
return paths
1750+
17401751

17411752
class Targets(Signed):
17421753
"""A container for the signed part of targets metadata.

0 commit comments

Comments
 (0)