Selaa lähdekoodia

Support serializing tags.

Jelmer Vernooij 16 vuotta sitten
vanhempi
commit
e7236d8725
2 muutettua tiedostoa jossa 44 lisäystä ja 2 poistoa
  1. 26 2
      dulwich/objects.py
  2. 18 0
      dulwich/tests/test_objects.py

+ 26 - 2
dulwich/objects.py

@@ -269,6 +269,11 @@ class Tag(ShaFile):
     _type = TAG_ID
     _num_type = 4
 
+    def __init__(self):
+        super(Tag, self).__init__()
+        self._needs_parsing = False
+        self._needs_serialization = True
+
     @classmethod
     def from_file(cls, filename):
         blob = ShaFile.from_file(filename)
@@ -283,6 +288,18 @@ class Tag(ShaFile):
         shafile.set_raw_string(string)
         return shafile
 
+    def serialize(self):
+        f = StringIO()
+        f.write("%s %s\n" % (OBJECT_ID, self._object_sha))
+        f.write("%s %s\n" % (TYPE_ID, num_type_map[self._object_type]._type))
+        f.write("%s %s\n" % (TAG_ID, self._name))
+        if self._tagger:
+            f.write("%s %s %d %s\n" % (TAGGER_ID, self._tagger, self._tag_time, format_timezone(self._tag_timezone)))
+        f.write("\n") # To close headers
+        f.write(self._message)
+        self._text = f.getvalue()
+        self._needs_serialization = False
+
     def _parse_text(self):
         """Grab the metadata attached to the tag"""
         self._tagger = None
@@ -306,7 +323,7 @@ class Tag(ShaFile):
                     self._tag_time = int(timetext)
                 except ValueError: #Not a unix timestamp
                     self._tag_time = time.strptime(timetext)
-                self._timezonetext = parse_timezone(timezonetext)
+                self._tag_timezone = parse_timezone(timezonetext)
             else:
                 raise AssertionError("Unknown field %s" % field)
         self._message = f.read()
@@ -317,13 +334,20 @@ class Tag(ShaFile):
         self._ensure_parsed()
         return (self._object_type, self._object_sha)
 
-    object = property(get_object)
+    def set_object(self, value):
+        self._ensure_parsed()
+        (self._object_type, self._object_sha) = value
+        self._needs_serialization = True
+
+    object = property(get_object, set_object)
 
     name = serializable_property("name", "The name of this tag")
     tagger = serializable_property("tagger", 
         "Returns the name of the person who created this tag")
     tag_time = serializable_property("tag_time", 
         "The creation timestamp of the tag.  As the number of seconds since the epoch")
+    tag_timezone = serializable_property("tag_timezone", 
+        "The timezone that tag_time is in.")
     message = serializable_property("message", "The message attached to this tag")
 
 

+ 18 - 0
dulwich/tests/test_objects.py

@@ -205,6 +205,23 @@ class TreeSerializationTests(unittest.TestCase):
         self.assertEquals(["a.c", "a", "a/c"], [p[0] for p in x.iteritems()])
 
 
+class TagSerializeTests(unittest.TestCase):
+
+    def test_serialize_simple(self):
+        x = Tag()
+        x.tagger = "Jelmer Vernooij <jelmer@samba.org>"
+        x.name = "0.1"
+        x.message = "Tag 0.1"
+        x.object = (3, "d80c186a03f423a81b39df39dc87fd269736ca86")
+        x.tag_time = 423423423
+        x.tag_timezone = 0
+        self.assertEquals("""object d80c186a03f423a81b39df39dc87fd269736ca86
+type blob
+tag 0.1
+tagger Jelmer Vernooij <jelmer@samba.org> 423423423 +0000
+
+Tag 0.1""", x.as_raw_string())
+
 
 class TagParseTests(unittest.TestCase):
 
@@ -245,3 +262,4 @@ OK2XeQOiEeXtT76rV4t2WR4=
         self.assertEquals(None, x.tagger)
         self.assertEquals("v2.6.22-rc7", x.name)
 
+