self._encoding = None
self._needs_parsing = False
self._needs_serialization = True
+ self._extra = {}
@classmethod
def from_file(cls, filename):
def _parse_text(self):
self._parents = []
+ self._extra = {}
self._author = None
f = StringIO(self._text)
for l in f:
elif field == ENCODING_ID:
self._encoding = value
else:
- raise AssertionError("Unknown field %s" % field)
+ if field in self._extra:
+ raise KeyError("%s already exists in extra" % field)
+ self._extra[field] = value
self._message = f.read()
self._needs_parsing = False
f.write("%s %s %s %s\n" % (COMMITTER_ID, self._committer, str(self._commit_time), format_timezone(self._commit_timezone)))
if self.encoding:
f.write("%s %s\n" % (ENCODING_ID, self.encoding))
+ for k in sorted(self.extra.keys()):
+ if "\n" in k or "\n" in self.extra[k]:
+ raise AssertionError("newline in extra data: %r -> %r" % (k, self.extra[k]))
+ f.write("%s %s\n" % (k, self.extra[k]))
f.write("\n") # There must be a new line after the headers
f.write(self._message)
self._text = f.getvalue()
parents = property(get_parents, set_parents)
+ def get_extra(self):
+ """Return extra settings of this commit."""
+ self._ensure_parsed()
+ return self._extra
+
+ def set_extra(self, value):
+ self._ensure_parsed()
+ self._needs_serialization = True
+ self._extra = value
+
+ extra = property(get_extra, set_extra)
+
author = serializable_property("author",
"The name of the author of the commit")
'4cffe90e0a41ad3f5190079d7c8f036bde29cbe6'],
c.parents)
+ def test_custom(self):
+ c = Commit.from_string(
+ 'tree d80c186a03f423a81b39df39dc87fd269736ca86\n'
+ 'parent ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd\n'
+ 'parent 4cffe90e0a41ad3f5190079d7c8f036bde29cbe6\n'
+ 'author James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
+ 'committer James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
+ 'extra-field data\n'
+ '\n'
+ 'Merge ../b\n')
+ self.assertEquals('data', c.extra['extra-field'])
+
class TreeSerializationTests(unittest.TestCase):