changeset 312:b1d6c7fe2f81

Merge branch 'rc/push-tag' into rc/master
author Tay Ray Chuan <rctay89@gmail.com>
date Sun, 04 Apr 2010 23:26:46 +0800
parents dda51b4e5238 (current diff) 53b0d608dcd5 (diff)
children 3aa43b60697c
files hggit/git_handler.py
diffstat 3 files changed, 39 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -568,6 +568,30 @@
                 raise hgutil.Abort("revision %s cannot be pushed since"
                                    " it doesn't have a ref" % ctx)
 
+            # Check if the tags the server is advertising are annotated tags,
+            # by attempting to retrieve it from the our git repo, and building a
+            # list of these tags.
+            #
+            # This is possible, even though (currently) annotated tags are
+            # dereferenced and stored as lightweight ones, as the annotated tag
+            # is still stored in the git repo.
+            uptodate_annotated_tags = []
+            for r in tags:
+                ref = 'refs/tags/'+r
+                # Check tag.
+                if not ref in refs:
+                    continue
+                try:
+                    # We're not using Repo.tag(), as it's deprecated.
+                    tag = self.git.get_object(refs[ref])
+                    if not isinstance(tag, Tag):
+                        continue
+                except KeyError:
+                    continue
+
+                # If we've reached here, the tag's good.
+                uptodate_annotated_tags.append(ref)
+
             for r in heads + tags:
                 if r in heads:
                     ref = 'refs/heads/'+r
@@ -583,6 +607,9 @@
                     else:
                         raise hgutil.Abort("pushing %s overwrites %s"
                                            % (ref, ctx))
+                elif ref in uptodate_annotated_tags:
+                    # we already have the annotated tag.
+                    pass
                 else:
                     raise hgutil.Abort("%s changed on the server, please pull "
                                        "and merge before pushing" % ref)
--- a/tests/test-git-tags
+++ b/tests/test-git-tags
@@ -40,6 +40,7 @@
 mkdir gitrepo
 cd gitrepo
 git init | python -c "import sys; print sys.stdin.read().replace('$(dirname $(pwd))/', '')"
+git config receive.denyCurrentBranch ignore
 echo alpha > alpha
 git add alpha
 commit -m 'add alpha'
@@ -56,12 +57,16 @@
  --listen=localhost\
  --export-all\
  --pid-file=gitdaemon.pid \
- --detach --reuseaddr
+ --detach --reuseaddr \
+ --enable=receive-pack
 
 hg clone git://localhost/gitrepo hgrepo | grep -v '^updating'
 
 cd hgrepo
 hg log --graph
+echo beta-fix >> beta
+hg commit -m 'fix for beta'
+hg push
 
 cd ..
 kill `cat gitdaemon.pid`
--- a/tests/test-git-tags.out
+++ b/tests/test-git-tags.out
@@ -21,3 +21,9 @@
    date:        Mon Jan 01 00:00:10 2007 +0000
    summary:     add alpha
 
+pushing to git://localhost/gitrepo
+importing Hg objects into Git
+creating and sending data
+    default::refs/tags/beta => GIT:e6f255c6
+    default::refs/tags/alpha => GIT:7eeab2ea
+    default::refs/heads/master => GIT:3b7fd1b3