Commits

David Carr  committed ab29c1c

fix a minor bug

  • Participants
  • Parent commits d934fbc

Comments (0)

Files changed (2)

File fix-empty-push.diff

+# HG changeset patch
+# Parent cac070a4b5219b86d4999722bbe1ca7f34e55697
+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.
+
+diff -r cac070a4b521 hggit/git_handler.py
+--- a/hggit/git_handler.py	Thu Oct 18 12:25:04 2012 -0400
++++ b/hggit/git_handler.py	Thu Oct 25 00:40:35 2012 -0400
+@@ -887,15 +887,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]
+diff -r cac070a4b521 tests/test-push.t
+--- a/tests/test-push.t	Thu Oct 18 12:25:04 2012 -0400
++++ b/tests/test-push.t	Thu Oct 25 00:40:35 2012 -0400
+@@ -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]
+fix-empty-push.diff
 populate-gitrepo-localrepo.diff
 gitrepo-support-listkeys.diff
 test-changes-bookmarks-outgoing.diff