# test_grafts.py -- Tests for graftpoints # # Dulwich is dual-licensed under the Apache License, Version 2.0 and the GNU # General Public License as public by the Free Software Foundation; version 2.0 # or (at your option) any later version. You can redistribute it and/or # modify it under the terms of either of these two licenses. # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # You should have received a copy of the licenses; if not, see # for a copy of the GNU General Public License # and for a copy of the Apache # License, Version 2.0. # """Tests for graftpoints.""" import os import shutil import tempfile from dulwich.errors import ObjectFormatException from dulwich.objects import Tree from dulwich.repo import MemoryRepo, Repo, parse_graftpoints, serialize_graftpoints from . import TestCase def makesha(digit): return (str(digit).encode("ascii") * 40)[:40] class GraftParserTests(TestCase): def assertParse(self, expected, graftpoints): self.assertEqual(expected, parse_graftpoints(iter(graftpoints))) def test_no_grafts(self): self.assertParse({}, []) def test_no_parents(self): self.assertParse({makesha(0): []}, [makesha(0)]) def test_parents(self): self.assertParse( {makesha(0): [makesha(1), makesha(2)]}, [b" ".join([makesha(0), makesha(1), makesha(2)])], ) def test_multiple_hybrid(self): self.assertParse( { makesha(0): [], makesha(1): [makesha(2)], makesha(3): [makesha(4), makesha(5)], }, [ makesha(0), b" ".join([makesha(1), makesha(2)]), b" ".join([makesha(3), makesha(4), makesha(5)]), ], ) class GraftSerializerTests(TestCase): def assertSerialize(self, expected, graftpoints): self.assertEqual(sorted(expected), sorted(serialize_graftpoints(graftpoints))) def test_no_grafts(self): self.assertSerialize(b"", {}) def test_no_parents(self): self.assertSerialize(makesha(0), {makesha(0): []}) def test_parents(self): self.assertSerialize( b" ".join([makesha(0), makesha(1), makesha(2)]), {makesha(0): [makesha(1), makesha(2)]}, ) def test_multiple_hybrid(self): self.assertSerialize( b"\n".join( [ makesha(0), b" ".join([makesha(1), makesha(2)]), b" ".join([makesha(3), makesha(4), makesha(5)]), ] ), { makesha(0): [], makesha(1): [makesha(2)], makesha(3): [makesha(4), makesha(5)], }, ) class GraftsInRepositoryBase: def tearDown(self): super().tearDown() def get_repo_with_grafts(self, grafts): r = self._repo r._add_graftpoints(grafts) return r def test_no_grafts(self): r = self.get_repo_with_grafts({}) shas = [e.commit.id for e in r.get_walker()] self.assertEqual(shas, self._shas[::-1]) def test_no_parents_graft(self): r = self.get_repo_with_grafts({self._repo.head(): []}) self.assertEqual([e.commit.id for e in r.get_walker()], [r.head()]) def test_existing_parent_graft(self): r = self.get_repo_with_grafts({self._shas[-1]: [self._shas[0]]}) self.assertEqual( [e.commit.id for e in r.get_walker()], [self._shas[-1], self._shas[0]], ) def test_remove_graft(self): r = self.get_repo_with_grafts({self._repo.head(): []}) r._remove_graftpoints([self._repo.head()]) self.assertEqual([e.commit.id for e in r.get_walker()], self._shas[::-1]) def test_object_store_fail_invalid_parents(self): r = self._repo self.assertRaises( ObjectFormatException, r._add_graftpoints, {self._shas[-1]: ["1"]} ) class GraftsInRepoTests(GraftsInRepositoryBase, TestCase): def setUp(self): super().setUp() self._repo_dir = os.path.join(tempfile.mkdtemp()) r = self._repo = Repo.init(self._repo_dir) self.addCleanup(shutil.rmtree, self._repo_dir) self._shas = [] commit_kwargs = { "committer": b"Test Committer ", "author": b"Test Author ", "commit_timestamp": 12395, "commit_timezone": 0, "author_timestamp": 12395, "author_timezone": 0, } self._shas.append(r.do_commit(b"empty commit", **commit_kwargs)) self._shas.append(r.do_commit(b"empty commit", **commit_kwargs)) self._shas.append(r.do_commit(b"empty commit", **commit_kwargs)) def test_init_with_empty_info_grafts(self): r = self._repo r._put_named_file(os.path.join("info", "grafts"), b"") r = Repo(self._repo_dir) self.assertEqual({}, r._graftpoints) def test_init_with_info_grafts(self): r = self._repo r._put_named_file( os.path.join("info", "grafts"), self._shas[-1] + b" " + self._shas[0], ) r = Repo(self._repo_dir) self.assertEqual({self._shas[-1]: [self._shas[0]]}, r._graftpoints) class GraftsInMemoryRepoTests(GraftsInRepositoryBase, TestCase): def setUp(self): super().setUp() r = self._repo = MemoryRepo() self._shas = [] tree = Tree() commit_kwargs = { "committer": b"Test Committer ", "author": b"Test Author ", "commit_timestamp": 12395, "commit_timezone": 0, "author_timestamp": 12395, "author_timezone": 0, "tree": tree.id, } self._shas.append(r.do_commit(b"empty commit", **commit_kwargs)) self._shas.append(r.do_commit(b"empty commit", **commit_kwargs)) self._shas.append(r.do_commit(b"empty commit", **commit_kwargs))