diff --git a/swh/loader/git/dumb.py b/swh/loader/git/dumb.py index c5ba46ffd0d58ab1e85c80a098f7cdc48150d26b..1e94f4a142bb3a1b63778f248559cc515de2068c 100644 --- a/swh/loader/git/dumb.py +++ b/swh/loader/git/dumb.py @@ -128,11 +128,9 @@ class GitObjectsFetcher: commit_objects = [] for ref in wants: ref_object = self._get_git_object(ref) - if ref_object.type_num == Commit.type_num: + self.objects[ref_object.type_name].add(ref) + if ref_object.type_name == Commit.type_name: commit_objects.append(cast(Commit, ref_object)) - self.objects[b"commit"].add(ref) - else: - self.objects[b"tag"].add(ref) # perform DFS on commits graph while commit_objects: diff --git a/swh/loader/git/tests/test_loader.py b/swh/loader/git/tests/test_loader.py index 4429df2112ae461ceab0370942c239c294fe475d..63168a8935834df6d6a77ea2b39b504bf90b2c21 100644 --- a/swh/loader/git/tests/test_loader.py +++ b/swh/loader/git/tests/test_loader.py @@ -34,6 +34,7 @@ from swh.loader.tests import ( get_stats, prepare_repository_from_archive, ) +from swh.model.hashutil import hash_to_bytes from swh.model.model import ( MetadataAuthority, MetadataAuthorityType, @@ -43,6 +44,8 @@ from swh.model.model import ( OriginVisitStatus, RawExtrinsicMetadata, Snapshot, + SnapshotBranch, + SnapshotTargetType, ) @@ -974,6 +977,42 @@ class DumbGitLoaderTestBase(FullGitLoaderTests): assert b"HEAD" in self.loader.snapshot.branches assert self.loader.snapshot.branches[b"HEAD"].target == b"refs/heads/master" + def test_load_refs_targeting_tree_or_blob(self, mocker): + known_tree = "fbf70528223d263661b5ad4b80f26caf3860eb8e" + known_blob = "534d61ecee4f6da4d6ca6ddd8abf258208d2d1bc" + tree_ref = "refs/tree" + blob_ref = "refs/blob" + + class GitObjectsFetcherTreeAndBlobRefs(dumb.GitObjectsFetcher): + def _http_get(self, path: str) -> SpooledTemporaryFile: + buffer = super()._http_get(path) + if path == "info/refs": + # Add two refs targeting blob and tree in the refs list + refs = buffer.read().decode("utf-8") + buffer.seek(0) + buffer.write( + ( + f"{known_tree}\t{tree_ref}\n" + f"{known_blob}\t{blob_ref}\n" + refs + ).encode() + ) + buffer.flush() + buffer.seek(0) + return buffer + + mocker.patch.object(dumb, "GitObjectsFetcher", GitObjectsFetcherTreeAndBlobRefs) + + res = self.loader.load() + assert res == {"status": "eventful"} + + assert self.loader.snapshot.branches[tree_ref.encode()] == SnapshotBranch( + target=hash_to_bytes(known_tree), target_type=SnapshotTargetType.DIRECTORY + ) + + assert self.loader.snapshot.branches[blob_ref.encode()] == SnapshotBranch( + target=hash_to_bytes(known_blob), target_type=SnapshotTargetType.CONTENT + ) + class TestDumbGitLoaderWithPack(DumbGitLoaderTestBase): @classmethod