changeset 557:4f4ab2d89375

gitrepo: initial support for listkeys This changeset adds test coverage for comparing "hg outgoing -B" in normal Mercurial usage with Hg-Git usage. This didn't match, since previously, gitrepo didn't provide a meaningful listkeys implementation. Now, it does. gitrepo now has access to a GitHandler when a localrepo is available. This handler is used to access the information needed to implement listkeys for namespaces (currently, only bookmarks) and bookmarks. A couple of other tests were testing "divergent bookmark" scenarios. These tests have been updated to filter out the divergent bookmark output, as it isn't consistent across the supported Mercurial versions.
author David M. Carr <david@carrclan.us>
date Thu, 25 Oct 2012 20:49:08 -0400
parents affd119533ae
children ab8061d9942b
files hggit/git_handler.py hggit/gitrepo.py hggit/overlay.py tests/test-bookmark-workflow.t tests/test-incoming.t tests/test-outgoing.t tests/test-pull-after-strip.t tests/test-push.t
diffstat 8 files changed, 52 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -964,7 +964,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']
 
@@ -23,6 +28,12 @@
         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
@@ -39,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,6 +126,11 @@
   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
--- 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-outgoing.t
+++ b/tests/test-outgoing.t
@@ -126,7 +126,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
@@ -102,7 +102,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 +117,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