From 8a37eb746606194c202ac560f75b40c7044badaa Mon Sep 17 00:00:00 2001 From: milki Date: Fri, 11 Jan 2013 17:28:57 -0800 Subject: [PATCH] Allow for multiple mergetags in a single commit --- dulwich/objects.py | 19 +++++-------- dulwich/tests/test_objects.py | 65 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/dulwich/objects.py b/dulwich/objects.py index 35f0179..dcbf0b6 100644 --- a/dulwich/objects.py +++ b/dulwich/objects.py @@ -1053,7 +1053,7 @@ class Commit(ShaFile): super(Commit, self).__init__() self._parents = [] self._encoding = None - self._mergetag = None + self._mergetag = [] self._extra = [] self._author_timezone_neg_utc = False self._commit_timezone_neg_utc = False @@ -1069,8 +1069,7 @@ class Commit(ShaFile): self._parents = [] self._extra = [] self._author = None - mergetag = False - raw_mergetag = "" + mergetag = "" for field, value in parse_commit(''.join(chunks)): if field == _TREE_HEADER: self._tree = value @@ -1091,19 +1090,15 @@ class Commit(ShaFile): elif field is None: self._message = value elif field == _MERGETAG_HEADER: - mergetag = True - raw_mergetag = "%s\n" % value + mergetag = "%s\n" % value elif field == _INTERNAL_EXTRA_HEADER: if mergetag: - raw_mergetag += value - mergetag = False + self._mergetag.append(Tag.from_string(mergetag + value)) + mergetag = "" else: print('extra field') self._extra.append((field, value)) - if raw_mergetag: - self._mergetag = Tag.from_string(raw_mergetag) - def check(self): """Check this object for internal consistency. @@ -1155,8 +1150,8 @@ class Commit(ShaFile): self._commit_timezone_neg_utc))) if self.encoding: chunks.append("%s %s\n" % (_ENCODING_HEADER, self.encoding)) - if self.mergetag: - mergetag_chunks = self.mergetag.as_raw_string().split("\n") + for mergetag in self.mergetag: + mergetag_chunks = mergetag.as_raw_string().split("\n") chunks.append("%s %s\n" % (_MERGETAG_HEADER, mergetag_chunks[0])) # Embedded extra header needs leading space diff --git a/dulwich/tests/test_objects.py b/dulwich/tests/test_objects.py index 4869bb3..a9b3460 100644 --- a/dulwich/tests/test_objects.py +++ b/dulwich/tests/test_objects.py @@ -322,7 +322,7 @@ class CommitSerializationTests(TestCase): tag_timezone=0, tagger="Linus Torvalds ", message=default_message) - commit = self.make_commit(mergetag=tag) + commit = self.make_commit(mergetag=[tag]) self.assertEqual("""tree d80c186a03f423a81b39df39dc87fd269736ca86 parent ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd @@ -346,6 +346,52 @@ mergetag object a38d6181ff27824c79fc7df825164a212eff6a3f Merge ../b """, commit.as_raw_string()) + def test_serialize_mergetags(self): + tag = make_object(Tag, + object=(Commit, "a38d6181ff27824c79fc7df825164a212eff6a3f"), + object_type_name="commit", + name="v2.6.22-rc7", + tag_time=1183319674, + tag_timezone=0, + tagger="Linus Torvalds ", + message=default_message) + commit = self.make_commit(mergetag=[tag, tag]) + + self.assertEqual("""tree d80c186a03f423a81b39df39dc87fd269736ca86 +parent ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd +parent 4cffe90e0a41ad3f5190079d7c8f036bde29cbe6 +author James Westby 1174773719 +0000 +committer James Westby 1174773719 +0000 +mergetag object a38d6181ff27824c79fc7df825164a212eff6a3f + type commit + tag v2.6.22-rc7 + tagger Linus Torvalds 1183319674 +0000 + + Linux 2.6.22-rc7 + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.7 (GNU/Linux) + + iD8DBQBGiAaAF3YsRnbiHLsRAitMAKCiLboJkQECM/jpYsY3WPfvUgLXkACgg3ql + OK2XeQOiEeXtT76rV4t2WR4= + =ivrA + -----END PGP SIGNATURE----- +mergetag object a38d6181ff27824c79fc7df825164a212eff6a3f + type commit + tag v2.6.22-rc7 + tagger Linus Torvalds 1183319674 +0000 + + Linux 2.6.22-rc7 + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.7 (GNU/Linux) + + iD8DBQBGiAaAF3YsRnbiHLsRAitMAKCiLboJkQECM/jpYsY3WPfvUgLXkACgg3ql + OK2XeQOiEeXtT76rV4t2WR4= + =ivrA + -----END PGP SIGNATURE----- + +Merge ../b +""", commit.as_raw_string()) + def test_deserialize_mergetag(self): tag = make_object(Tag, object=(Commit, "a38d6181ff27824c79fc7df825164a212eff6a3f"), @@ -355,7 +401,22 @@ Merge ../b tag_timezone=0, tagger="Linus Torvalds ", message=default_message) - commit = self.make_commit(mergetag=tag) + commit = self.make_commit(mergetag=[tag]) + + d = Commit() + d._deserialize(commit.as_raw_chunks()) + self.assertEquals(commit, d) + + def test_deserialize_mergetags(self): + tag = make_object(Tag, + object=(Commit, "a38d6181ff27824c79fc7df825164a212eff6a3f"), + object_type_name="commit", + name="v2.6.22-rc7", + tag_time=1183319674, + tag_timezone=0, + tagger="Linus Torvalds ", + message=default_message) + commit = self.make_commit(mergetag=[tag, tag]) d = Commit() d._deserialize(commit.as_raw_chunks()) -- 1.8.1