changeset 561:9f919924bf81

Merge
author Augie Fackler <raf@durin42.com>
date Thu, 25 Oct 2012 23:22:36 -0500
parents 9c71a6f00863 (diff) cac070a4b521 (current diff)
children 64479303803b
files hggit/git_handler.py
diffstat 24 files changed, 130 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/hggit/__init__.py
+++ b/hggit/__init__.py
@@ -184,6 +184,14 @@
     # 1.7+
     pass
 
+def peer(orig, uiorrepo, *args, **opts):
+    newpeer = orig(uiorrepo, *args, **opts)
+    if isinstance(newpeer, gitrepo.gitrepo):
+        if isinstance(uiorrepo, localrepo.localrepository):
+            newpeer.localrepo = uiorrepo
+    return newpeer
+extensions.wrapfunction(hg, 'peer', peer)
+
 def revset_fromgit(repo, subset, x):
     '''``fromgit()``
     Select changesets that originate from Git.
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -279,7 +279,10 @@
         if remote_name and new_refs:
             for ref, new_sha in new_refs.iteritems():
                 if new_sha != old_refs.get(ref):
-                    self.ui.status("    %s::%s => GIT:%s\n" %
+                    self.ui.note("    %s::%s => GIT:%s\n" %
+                                   (remote_name, ref, new_sha[0:8]))
+                else:
+                    self.ui.debug("    %s::%s => GIT:%s\n" %
                                    (remote_name, ref, new_sha[0:8]))
 
             self.update_remote_branches(remote_name, new_refs)
@@ -336,7 +339,7 @@
         export = [node for node in nodes if not hex(node) in self._map_hg]
         total = len(export)
         if total:
-            self.ui.status(_("exporting hg objects to git\n"))
+            self.ui.note(_("exporting hg objects to git\n"))
         for i, rev in enumerate(export):
             util.progress(self.ui, 'exporting', i, total=total)
             ctx = self.repo.changectx(rev)
@@ -887,15 +890,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]
@@ -964,7 +969,7 @@
         return new_refs
 
 
-    def fetch_pack(self, remote_name, heads):
+    def fetch_pack(self, remote_name, heads=None):
         client, path = self.get_transport_and_path(remote_name)
         graphwalker = self.git.get_graph_walker()
         def determine_wants(refs):
--- a/hggit/gitrepo.py
+++ b/hggit/gitrepo.py
@@ -1,3 +1,4 @@
+import os
 from mercurial import util
 try:
     from mercurial.error import RepoError
@@ -11,6 +12,10 @@
 
 from git_handler import GitHandler
 
+from overlay import overlayrepo
+
+from mercurial.node import bin
+
 class gitrepo(peerrepository):
     capabilities = ['lookup']
 
@@ -22,6 +27,13 @@
             raise util.Abort('Cannot create a git repository.')
         self.ui = ui
         self.path = path
+        self.localrepo = None
+        self.handler = None
+
+    def _initializehandler(self):
+        if self.handler is None and self.localrepo is not None:
+            self.handler = GitHandler(self.localrepo, self.localrepo.ui)
+        return self.handler
 
     def url(self):
         return self.path
@@ -38,6 +50,22 @@
         return []
 
     def listkeys(self, namespace):
+        if namespace == 'namespaces':
+            return {'bookmarks':''}
+        elif namespace == 'bookmarks':
+            handler = self._initializehandler()
+            if handler:
+                handler.export_commits()
+                refs = handler.fetch_pack(self.path)
+                reqrefs = refs
+                convertlist, commits = handler.getnewgitcommits(reqrefs)
+                newcommits = [bin(c) for c in commits]
+                b = overlayrepo(handler, newcommits, refs)
+                stripped_refs = dict([
+                    (ref[ref.find('/', ref.find('/')+1)+1:], b.node(refs[ref]))
+                        for ref in refs.keys()
+                            if ref.find('/') != -1])
+                return stripped_refs
         return {}
 
     def pushkey(self, namespace, key, old, new):
--- a/hggit/overlay.py
+++ b/hggit/overlay.py
@@ -227,6 +227,12 @@
             return self.handler.repo[n]
         return overlaychangectx(self, n)
 
+    def node(self, n):
+        """Returns an Hg or Git hash for the specified Git hash"""
+        if bin(n) in self.revmap:
+            return n
+        return self.handler.map_hg_get(n)
+
     def nodebookmarks(self, n):
         return self.refmap.get(n, [])
 
--- a/tests/test-bookmark-workflow.t
+++ b/tests/test-bookmark-workflow.t
@@ -109,6 +109,11 @@
   searching for changes
   no changes found
   [1]
+  $ hg outgoing -B
+  comparing with $TESTTMP/hgremoterepo
+  searching for changed bookmarks
+  no changed bookmarks found
+  [1]
   $ hg push
   pushing to $TESTTMP/hgremoterepo
   searching for changes
@@ -121,9 +126,56 @@
   searching for changes
   no changes found
   [1]
+  $ hg outgoing -B
+  comparing with $TESTTMP/gitremoterepo
+  searching for changed bookmarks
+  no changed bookmarks found
+  [1]
   $ hg push
   pushing to $TESTTMP/gitremoterepo
   searching for changes
   no changes found
   [1]
   $ cd ..
+
+Changed bookmarks, but not revs
+  $ cd purehglocalrepo
+  $ hg bookmark -fr 2 b1
+  $ hg bookmark -r 0 b2
+  $ hgstate
+    3 fc2664cac217 "add delta" bookmarks: [master]
+    2 d85ced7ae9d6 "add gamma" bookmarks: [b1]
+    1 7bcd915dc873 "add beta" bookmarks: []
+    0 3442585be8a6 "add alpha" bookmarks: [b2]
+  $ hg outgoing
+  comparing with $TESTTMP/hgremoterepo
+  searching for changes
+  no changes found
+  [1]
+As of 2.3, Mercurial's outgoing -B doesn't actually show changed bookmarks
+It only shows "new" bookmarks.  Thus, b1 doesn't show up.
+  $ hg outgoing -B
+  comparing with $TESTTMP/hgremoterepo
+  searching for changed bookmarks
+     b2                        3442585be8a6
+  $ cd ..
+  $ cd hggitlocalrepo
+  $ hg bookmark -fr 2 b1
+  $ hg bookmark -r 0 b2
+  $ hgstate
+    3 fc2664cac217 "add delta" bookmarks: [master]
+    2 d85ced7ae9d6 "add gamma" bookmarks: [b1]
+    1 7bcd915dc873 "add beta" bookmarks: []
+    0 3442585be8a6 "add alpha" bookmarks: [b2]
+  $ hg outgoing
+  comparing with $TESTTMP/gitremoterepo
+  searching for changes
+  no changes found
+  [1]
+As of 2.3, Mercurial's outgoing -B doesn't actually show changed bookmarks
+It only shows "new" bookmarks.  Thus, b1 doesn't show up.
+  $ hg outgoing -B
+  comparing with $TESTTMP/gitremoterepo
+  searching for changed bookmarks
+     b2                        3442585be8a6
+  $ cd ..
--- a/tests/test-conflict-1.t
+++ b/tests/test-conflict-1.t
@@ -60,7 +60,6 @@
   $ hg bookmark -r tip master
   $ hg push -r master ../gitrepo
   pushing to ../gitrepo
-  exporting hg objects to git
   searching for changes
   $ cd ..
 
--- a/tests/test-conflict-2.t
+++ b/tests/test-conflict-2.t
@@ -60,7 +60,6 @@
   $ hg bookmark -r tip master
   $ hg push -r master ../gitrepo
   pushing to ../gitrepo
-  exporting hg objects to git
   searching for changes
   $ cd ..
 
--- a/tests/test-convergedmerge.t
+++ b/tests/test-convergedmerge.t
@@ -61,7 +61,6 @@
   $ hg bookmark -r4 master
   $ hg push -r master ../gitrepo
   pushing to ../gitrepo
-  exporting hg objects to git
   searching for changes
   $ cd ..
 
--- a/tests/test-empty-working-tree.t
+++ b/tests/test-empty-working-tree.t
@@ -39,7 +39,6 @@
   clearing out the git cache data
   $ hg push ../gitrepo2
   pushing to ../gitrepo2
-  exporting hg objects to git
   searching for changes
 
   $ cd ../gitrepo2
--- a/tests/test-encoding.t
+++ b/tests/test-encoding.t
@@ -121,7 +121,6 @@
   clearing out the git cache data
   $ hg push ../gitrepo2
   pushing to ../gitrepo2
-  exporting hg objects to git
   searching for changes
 
   $ cd ../gitrepo2
--- a/tests/test-file-removal.t
+++ b/tests/test-file-removal.t
@@ -108,7 +108,6 @@
   clearing out the git cache data
   $ hg push ../gitrepo2
   pushing to ../gitrepo2
-  exporting hg objects to git
   searching for changes
 
   $ cd ../gitrepo2
--- a/tests/test-git-tags.t
+++ b/tests/test-git-tags.t
@@ -71,8 +71,6 @@
   $ hg commit -m 'fix for beta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:3b7fd1b3
 
   $ cd ..
--- a/tests/test-git-workflow.t
+++ b/tests/test-git-workflow.t
@@ -66,7 +66,6 @@
   $ echo "[git]" >> .hg/hgrc
   $ echo "intree = True" >> .hg/hgrc
   $ hg gexport
-  exporting hg objects to git
 
   $ echo % do some work
   % do some work
--- a/tests/test-hg-author.t
+++ b/tests/test-hg-author.t
@@ -54,71 +54,55 @@
   $ hgcommit -u "test" -m 'add beta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:cffa0e8d
 
   $ echo gamma >> beta
   $ hgcommit -u "test <test@example.com> (comment)" -m 'modify beta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:2b9ec6a4
 
   $ echo gamma > gamma
   $ hg add gamma
   $ hgcommit -u "<test@example.com>" -m 'add gamma'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:fee30180
 
   $ echo delta > delta
   $ hg add delta
   $ hgcommit -u "name<test@example.com>" -m 'add delta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:d1659250
 
   $ echo epsilon > epsilon
   $ hg add epsilon
   $ hgcommit -u "name <test@example.com" -m 'add epsilon'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:ee985f12
 
   $ echo zeta > zeta
   $ hg add zeta
   $ hgcommit -u " test " -m 'add zeta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:d21e26b4
 
   $ echo eta > eta
   $ hg add eta
   $ hgcommit -u "test < test@example.com >" -m 'add eta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:8c878c97
 
   $ echo theta > theta
   $ hg add theta
   $ hgcommit -u "test >test@example.com>" -m 'add theta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:1e03e913
 
   $ hg log --graph | egrep -v ': *(not-master|master)'
   @  changeset:   8:d3c51ce68cfd
--- a/tests/test-hg-branch.t
+++ b/tests/test-hg-branch.t
@@ -57,18 +57,14 @@
   $ hgcommit -m 'rename alpha to beta'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:05c2bcbe
 
   $ hg branch gamma | grep -v 'permanent and global'
   marked working directory as branch gamma
   $ hgcommit -m 'started branch gamma'
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:296802ef
 
   $ hg log --graph | $filterhash | egrep -v ': *(not-master|master)'
   @  changeset:   2:05aed681ccb3
--- a/tests/test-hg-tags.t
+++ b/tests/test-hg-tags.t
@@ -52,10 +52,7 @@
   $ hgtag alpha
   $ hg push
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/tags/alpha => GIT:7eeab2ea
-      default::refs/heads/master => GIT:9a2616b9
 
   $ hg log --graph | egrep -v ': *(not-master|master)'
   @  changeset:   1:d529e9229f6d
--- a/tests/test-incoming.t
+++ b/tests/test-incoming.t
@@ -152,7 +152,8 @@
 
   $ echo % nothing incoming after pull
   % nothing incoming after pull
-  $ hg pull
+"adding remote bookmark" message was added in Mercurial 2.3
+  $ hg pull | grep -v "adding remote bookmark"
   pulling from $TESTTMP/gitrepo
   importing git objects into hg
   (run 'hg heads' to see heads, 'hg merge' to merge)
--- a/tests/test-merge.t
+++ b/tests/test-merge.t
@@ -69,7 +69,6 @@
   clearing out the git cache data
   $ hg push ../gitrepo2
   pushing to ../gitrepo2
-  exporting hg objects to git
   searching for changes
 
   $ cd ..
--- a/tests/test-octopus.t
+++ b/tests/test-octopus.t
@@ -96,7 +96,6 @@
   clearing out the git cache data
   $ hg push ../gitrepo2
   pushing to ../gitrepo2
-  exporting hg objects to git
   searching for changes
 
   $ cd ../gitrepo2
--- a/tests/test-outgoing.t
+++ b/tests/test-outgoing.t
@@ -60,7 +60,6 @@
 
   $ hg outgoing | sed 's/bookmark:    /tag:         /' | grep -v 'searching for changes'
   comparing with */gitrepo (glob)
-  exporting hg objects to git
   changeset:   1:0564f526fb0f
   tag:         beta
   user:        test
@@ -126,7 +125,7 @@
   [255]
   $ echo % let\'s pull and try again
   % let's pull and try again
-  $ hg pull
+  $ hg pull 2>&1 | grep -v 'divergent bookmark'
   pulling from */gitrepo (glob)
   importing git objects into hg
   (run 'hg update' to get a working copy)
--- a/tests/test-pull-after-strip.t
+++ b/tests/test-pull-after-strip.t
@@ -114,11 +114,12 @@
   git commit map cleaned
   $ echo % pull works after \'hg git-cleanup\'
   % pull works after 'hg git-cleanup'
-  $ hg pull -r beta
+"adding remote bookmark" message was added in Mercurial 2.3
+  $ hg pull -r beta | grep -v "adding remote bookmark"
   pulling from $TESTTMP/gitrepo
   importing git objects into hg
   (run 'hg update' to get a working copy)
-  $ hg log --graph | egrep -v ': *(beta|master)'
+  $ hg log --graph | egrep -v 'bookmark: *(alpha|beta|master)'
   o  changeset:   2:611948b1ec6a
   |  tag:         default/beta
   |  tag:         tip
--- a/tests/test-push.t
+++ b/tests/test-push.t
@@ -59,9 +59,7 @@
   $ hg book -r 1 beta
   $ hg push -r beta
   pushing to $TESTTMP/gitrepo
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/beta => GIT:cffa0e8d
 
   $ cd ..
 
@@ -102,7 +100,7 @@
   abort: refs/heads/master changed on the server, please pull and merge before pushing
   [255]
 
-  $ hg pull
+  $ hg pull 2>&1 | grep -v 'divergent bookmark'
   pulling from $TESTTMP/gitrepo
   importing git objects into hg
   (run 'hg update' to get a working copy)
@@ -117,7 +115,7 @@
   date:        Mon Jan 01 00:00:12 2007 +0000
   summary:     add gamma
   
-  $ hg log -r default/master
+  $ hg log -r default/master | grep -v 'master@default'
   changeset:   3:1436150b86c2
   tag:         default/master
   tag:         tip
@@ -140,7 +138,6 @@
   $ hg push -fr master
   pushing to $TESTTMP/gitrepo
   searching for changes
-      default::refs/heads/master => GIT:cc119202
 
   $ echo % this should fail, no changes to push
   % this should fail, no changes to push
@@ -153,3 +150,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]
--- a/tests/test-subrepos.t
+++ b/tests/test-subrepos.t
@@ -115,9 +115,7 @@
   $ hg commit -m 'Update subrepo2 from hg' | grep -v "committing subrepository" || true
   $ hg push
   pushing to $TESTTMP/gitrepo1
-  exporting hg objects to git
   searching for changes
-      default::refs/heads/master => GIT:4663c492
   $ cd ..
   $ cd gitrepo1
   $ echo % there shall be two gitlink entries, with values matching that in .hgsubstate
--- a/tests/test-tree-decomposition.t
+++ b/tests/test-tree-decomposition.t
@@ -67,7 +67,6 @@
   clearing out the git cache data
   $ hg push ../gitrepo2
   pushing to ../gitrepo2
-  exporting hg objects to git
   searching for changes
 
   $ cd ../gitrepo2