diff --git a/swh/loader/git/tests/test_from_disk.py b/swh/loader/git/tests/test_from_disk.py --- a/swh/loader/git/tests/test_from_disk.py +++ b/swh/loader/git/tests/test_from_disk.py @@ -4,8 +4,8 @@ # See top-level LICENSE file for more information import os.path -import subprocess +import dulwich.repo from swh.loader.git.from_disk import GitLoaderFromDisk as OrigGitLoaderFromDisk from swh.loader.git.from_disk import GitLoaderFromArchive as OrigGitLoaderFromArchive @@ -132,6 +132,7 @@ directory=self.destination_path, ) self.storage = self.loader.storage + self.repo = dulwich.repo.Repo(self.destination_path) def load(self): return self.loader.load() @@ -169,7 +170,7 @@ self.assertContentsContain(CONTENT1) self.assertCountDirectories(7) - self.assertCountReleases(0) # FIXME: why not 2? + self.assertCountReleases(0) # FIXME: should be 2 after T2059 self.assertCountRevisions(7) self.assertCountSnapshots(1) @@ -207,17 +208,6 @@ """Tests for the GitLoaderFromDisk. Includes the common ones, and add others that only work with a local dir.""" - def _git(self, *cmd): - """Small wrapper around subprocess to call Git.""" - try: - return subprocess.check_output( - ["git", "-C", self.destination_path] + list(cmd) - ) - except subprocess.CalledProcessError as e: - print(e.output) - print(e.stderr) - raise - def test_load_changed(self): """Loads a repository, makes some changes by adding files, commits, and merges, load it again, and check the storage contains everything @@ -226,35 +216,31 @@ res = self.load() self.assertEqual(res["status"], "eventful", res) - self._git("config", "--local", "user.email", "you@example.com") - self._git("config", "--local", "user.name", "Your Name") - # Load with a new file + revision with open(os.path.join(self.destination_path, "hello.py"), "a") as fd: fd.write("print('Hello world')\n") - self._git("add", "hello.py") - self._git("commit", "-m", "Hello world") - new_revision = self._git("rev-parse", "master").decode().strip() + self.repo.stage([b"hello.py"]) + new_revision = self.repo.do_commit(b"Hello world\n").decode() + new_dir = "85dae072a5aa9923ffa7a7568f819ff21bf49858" + + assert self.repo[new_revision.encode()].tree == new_dir.encode() revisions = REVISIONS1.copy() assert new_revision not in revisions - revisions[new_revision] = "85dae072a5aa9923ffa7a7568f819ff21bf49858" + revisions[new_revision] = new_dir res = self.load() self.assertEqual(res["status"], "eventful") self.assertCountContents(4 + 1) self.assertCountDirectories(7 + 1) - self.assertCountReleases(0) # FIXME: why not 2? + self.assertCountReleases(0) # FIXME: should be 2 after T2059 self.assertCountRevisions(7 + 1) self.assertCountSnapshots(1 + 1) self.assertRevisionsContain(revisions) - # TODO: how to check the snapshot id? - # self.assertSnapshotEqual(SNAPSHOT1) - self.assertEqual(self.loader.load_status(), {"status": "eventful"}) self.assertEqual(self.loader.visit_status(), "full") @@ -262,27 +248,51 @@ self.assertIsNotNone(visit["snapshot"]) self.assertEqual(visit["status"], "full") - # Load with a new merge - self._git("merge", "branch1", "-m", "merge") - new_revision = self._git("rev-parse", "master").decode().strip() + snapshot_id = visit["snapshot"] + snapshot = self.storage.snapshot_get(snapshot_id) + branches = snapshot["branches"] + assert branches[b"HEAD"] == { + "target": b"refs/heads/master", + "target_type": "alias", + } + assert branches[b"refs/heads/master"] == { + "target": hash_to_bytes(new_revision), + "target_type": "revision", + } - assert new_revision not in revisions - revisions[new_revision] = "dab8a37df8db8666d4e277bef9a546f585b5bedd" + # Merge branch1 into HEAD. + + current = self.repo[b"HEAD"] + branch1 = self.repo[b"refs/heads/branch1"] + + merged_tree = dulwich.objects.Tree() + for item in self.repo[current.tree].items(): + merged_tree.add(*item) + for item in self.repo[branch1.tree].items(): + merged_tree.add(*item) + + merged_dir_id = "dab8a37df8db8666d4e277bef9a546f585b5bedd" + assert merged_tree.id.decode() == merged_dir_id + self.repo.object_store.add_object(merged_tree) + + merge_commit = self.repo.do_commit( + b"merge.\n", tree=merged_tree.id, merge_heads=[branch1.id] + ) + + assert merge_commit.decode() not in revisions + revisions[merge_commit.decode()] = merged_tree.id.decode() res = self.load() self.assertEqual(res["status"], "eventful") self.assertCountContents(4 + 1) self.assertCountDirectories(7 + 2) - self.assertCountReleases(0) # FIXME: why not 2? + self.assertCountReleases(0) # FIXME: should be 2 after T2059 self.assertCountRevisions(7 + 2) self.assertCountSnapshots(1 + 1 + 1) self.assertRevisionsContain(revisions) - # TODO: how to check the snapshot id? - # self.assertSnapshotEqual(SNAPSHOT1) - self.assertEqual(self.loader.load_status(), {"status": "eventful"}) self.assertEqual(self.loader.visit_status(), "full") @@ -290,6 +300,20 @@ self.assertIsNotNone(visit["snapshot"]) self.assertEqual(visit["status"], "full") + merge_snapshot_id = visit["snapshot"] + assert merge_snapshot_id != snapshot_id + + merge_snapshot = self.storage.snapshot_get(merge_snapshot_id) + merge_branches = merge_snapshot["branches"] + assert merge_branches[b"HEAD"] == { + "target": b"refs/heads/master", + "target_type": "alias", + } + assert merge_branches[b"refs/heads/master"] == { + "target": hash_to_bytes(merge_commit.decode()), + "target_type": "revision", + } + class GitLoaderFromArchiveTest(BaseGitLoaderFromArchiveTest, GitLoaderFromDiskTests): """Tests for GitLoaderFromArchive. Imports the common ones