changeset 555:06a29fdd52a7

push: fix traceback when pushing empty hg repo to empty git repo (issue #58) In the logic that was attempting to handle the case where the local repo doesn't have any bookmarks, the assumption was being made that tip resolved to a non-null revision. In the case of a totally empty local repo, however, that isn't a valid assumption, and resulted in attempting to set the master ref to None, which broke dulwich. The "fix", which avoids the traceback and allows the push to complete (though still do nothing, since in this case there aren't any changes to push), is to not tweak the refs at all if tip is nullid. Leaving the special capabilities ref and not adding a master ref appears to be fine in this case.
author David M. Carr <david@carrclan.us>
date Thu, 25 Oct 2012 00:40:35 -0400
parents f3f344aac42b
children affd119533ae
files hggit/git_handler.py tests/test-push.t
diffstat 2 files changed, 22 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -885,15 +885,17 @@
 
         #The remote repo is empty and the local one doesn't have bookmarks/tags
         if refs.keys()[0] == 'capabilities^{}':
-            del new_refs['capabilities^{}']
             if not self.local_heads():
-                tip = hex(self.repo.lookup('tip'))
-                try:
-                    commands.bookmark(self.ui, self.repo, 'master', tip, force=True)
-                except NameError:
-                    bookmarks.bookmark(self.ui, self.repo, 'master', tip, force=True)
-                bookmarks.setcurrent(self.repo, 'master')
-                new_refs['refs/heads/master'] = self.map_git_get(tip)
+                tip = self.repo.lookup('tip')
+                if tip != nullid:
+                    del new_refs['capabilities^{}']
+                    tip = hex(tip)
+                    try:
+                        commands.bookmark(self.ui, self.repo, 'master', tip, force=True)
+                    except NameError:
+                        bookmarks.bookmark(self.ui, self.repo, 'master', tip, force=True)
+                    bookmarks.setcurrent(self.repo, 'master')
+                    new_refs['refs/heads/master'] = self.map_git_get(tip)
 
         for rev in revs:
             ctx = self.repo[rev]
--- a/tests/test-push.t
+++ b/tests/test-push.t
@@ -153,3 +153,15 @@
   [1]
 
   $ cd ..
+
+Push empty Hg repo to empty Git repo (issue #58)
+Since there aren't any changes, exit code 1 is expected in modern Mercurial.
+However, since it varies between supported Mercurial versions, we need to
+force it to consistency for now. (see issue3228, fixed in Mercurial 2.1)
+  $ hg init hgrepo2
+  $ git init -q --bare gitrepo2
+  $ hg -R hgrepo2 push gitrepo2 && false
+  pushing to gitrepo2
+  searching for changes
+  no changes found
+  [1]