2
0
Эх сурвалжийг харах

Support creating unannotated tags.

Jelmer Vernooij 11 жил өмнө
parent
commit
516709ead6

+ 10 - 1
bin/dulwich

@@ -218,7 +218,15 @@ def cmd_diff_tree(args):
 
 def cmd_rev_list(args):
     opts, args = getopt(args, "", [])
-    porcelain.rev_list(".", args)
+    if len(args) < 2:
+        print "Usage: dulwich tag NAME"
+        sys.exit(1)
+    porcelain.tag(".", args[0])
+
+
+def cmd_tag(args):
+    opts, args = getopt(args, "", [])
+    porcelain.tag(".", args[0])
 
 
 commands = {
@@ -240,6 +248,7 @@ commands = {
     "rm": cmd_rm,
     "show": cmd_show,
     "rev-list": cmd_rev_list,
+    "tag": cmd_tag,
     }
 
 if len(sys.argv) < 2:

+ 22 - 15
dulwich/porcelain.py

@@ -359,29 +359,36 @@ def rev_list(repo, commits, outstream=sys.stdout):
         outstream.write("%s\n" % entry.commit.id)
 
 
-def tag(repo, tag, author, message):
+def tag(repo, tag, author=None, message=None, annotated=False):
     """Creates a tag in git via dulwich calls:
 
     :param repo: Path to repository
     :param tag: tag string
-    :param author: tag author
-    :param repo: tag message
+    :param author: tag author (optional, if annotated is set)
+    :param message: tag message (optional)
+    :param annotated: whether to create an annotated tag
     """
 
     r = open_repo(repo)
 
-    # Create the tag object
-    tag_obj = Tag()
-    tag_obj.tagger = author
-    tag_obj.message = message
-    tag_obj.name = tag
-    tag_obj.object = (Commit, r.refs['HEAD'])
-    tag_obj.tag_time = int(time.time())
-    tag_obj.tag_timezone = parse_timezone('-0200')[0]
-
-    # Add tag to the object store
-    r.object_store.add_object(tag_obj)
-    r.refs['refs/tags/' + tag] = tag_obj.id
+    if annotated:
+        # Create the tag object
+        tag_obj = Tag()
+        if author is None:
+            # TODO(jelmer): Don't use repo private method.
+            author = r._get_user_identity()
+        tag_obj.tagger = author
+        tag_obj.message = message
+        tag_obj.name = tag
+        tag_obj.object = (Commit, r.refs['HEAD'])
+        tag_obj.tag_time = int(time.time())
+        tag_obj.tag_timezone = parse_timezone('-0200')[0]
+        r.object_store.add_object(tag_obj)
+        tag_id = tag_obj.id
+    else:
+        tag_id = r.refs['HEAD']
+
+    r.refs['refs/tags/' + tag] = tag_id
 
 
 def list_tags(repo, outstream=sys.stdout):

+ 20 - 6
dulwich/tests/test_porcelain.py

@@ -28,6 +28,7 @@ from dulwich import porcelain
 from dulwich.diff_tree import tree_changes
 from dulwich.objects import (
     Blob,
+    Tag,
     Tree,
     )
 from dulwich.repo import Repo
@@ -349,19 +350,32 @@ class RevListTests(PorcelainTestCase):
 
 class TagTests(PorcelainTestCase):
 
-    def test_simple(self):
-        tag = 'tryme'
-        author = 'foo'
-        message = 'bar'
+    def test_annotated(self):
+        c1, c2, c3 = build_commit_graph(self.repo.object_store, [[1], [2, 1],
+            [3, 1, 2]])
+        self.repo.refs["HEAD"] = c3.id
+
+        porcelain.tag(self.repo.path, "tryme", 'foo <foo@bar.com>', 'bar',
+                annotated=True)
+
+        tags = self.repo.refs.as_dict("refs/tags")
+        self.assertEquals(tags.keys(), ["tryme"])
+        tag = self.repo['refs/tags/tryme']
+        self.assertTrue(isinstance(tag, Tag))
+        self.assertEquals("foo <foo@bar.com>", tag.tagger)
+        self.assertEquals("bar", tag.message)
 
+    def test_unannotated(self):
         c1, c2, c3 = build_commit_graph(self.repo.object_store, [[1], [2, 1],
             [3, 1, 2]])
         self.repo.refs["HEAD"] = c3.id
 
-        porcelain.tag(self.repo.path, tag, author, message)
+        porcelain.tag(self.repo.path, "tryme", annotated=False)
 
         tags = self.repo.refs.as_dict("refs/tags")
-        self.assertEquals(tags.keys()[0], tag)
+        self.assertEquals(tags.keys(), ["tryme"])
+        tag = self.repo['refs/tags/tryme']
+        self.assertEquals(tags.values(), [self.repo.head()])
 
 
 class ListTagsTests(PorcelainTestCase):