hgext/evolve.py
branchstable
changeset 1244 3249814dabd1
parent 1230 e886bc501796
child 1248 4279ec5ff3a7
child 1249 1556d8fed538
--- a/hgext/evolve.py	Sat Mar 21 19:09:56 2015 -0400
+++ b/hgext/evolve.py	Fri Apr 10 23:24:36 2015 -0400
@@ -2340,12 +2340,14 @@
 @eh.extsetup
 def _installobsmarkersdiscovery(ui):
     hgweb_mod.perms['evoext_obshash'] = 'pull'
+    hgweb_mod.perms['evoext_obshash1'] = 'pull'
     # wrap command content
     oldcap, args = wireproto.commands['capabilities']
     def newcap(repo, proto):
         return discocapabilities(oldcap, repo, proto)
     wireproto.commands['capabilities'] = (newcap, args)
     wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
+    wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes')
     if getattr(exchange, '_pushdiscoveryobsmarkers', None) is None:
         ui.warn('evolve: your mercurial version is too old\n'
                 'evolve: (running in degraded mode, push will includes all markers)\n')
@@ -2360,8 +2362,13 @@
 from mercurial import dagutil
 from mercurial import setdiscovery
 
-def _obshash(repo, nodes):
-    hashs = _obsrelsethashtree(repo)
+def _obshash(repo, nodes, version=0):
+    if version == 0:
+        hashs = _obsrelsethashtreefm0(repo)
+    elif version ==1:
+        hashs = _obsrelsethashtreefm1(repo)
+    else:
+        assert False
     nm = repo.changelog.nodemap
     revs = [nm.get(n) for n in nodes]
     return [r is None and nullid or hashs[r][1] for r in revs]
@@ -2369,10 +2376,17 @@
 def srv_obshash(repo, proto, nodes):
     return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
 
+def srv_obshash1(repo, proto, nodes):
+    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes), version=1))
+
 @eh.addattr(localrepo.localpeer, 'evoext_obshash')
 def local_obshash(peer, nodes):
     return _obshash(peer._repo, nodes)
 
+@eh.addattr(localrepo.localpeer, 'evoext_obshash1')
+def local_obshash1(peer, nodes):
+    return _obshash(peer._repo, nodes, version=1)
+
 @eh.addattr(wireproto.wirepeer, 'evoext_obshash')
 def peer_obshash(self, nodes):
     d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
@@ -2381,6 +2395,14 @@
     except ValueError:
         self._abort(error.ResponseError(_("unexpected response:"), d))
 
+@eh.addattr(wireproto.wirepeer, 'evoext_obshash1')
+def peer_obshash1(self, nodes):
+    d = self._call("evoext_obshash1", nodes=wireproto.encodelist(nodes))
+    try:
+        return wireproto.decodelist(d)
+    except ValueError:
+        self._abort(error.ResponseError(_("unexpected response:"), d))
+
 def findcommonobsmarkers(ui, local, remote, probeset,
                          initialsamplesize=100,
                          fullsamplesize=200):
@@ -2388,11 +2410,16 @@
     roundtrips = 0
     cl = local.changelog
     dag = dagutil.revlogdag(cl)
-    localhash = _obsrelsethashtree(local)
     missing = set()
     common = set()
     undecided = set(probeset)
     _takefullsample = setdiscovery._takefullsample
+    if remote.capable('_evoext_obshash_1'):
+        remotehash = remote.evoext_obshash1
+        localhash = _obsrelsethashtreefm1(local)
+    else:
+        remotehash = remote.evoext_obshash
+        localhash = _obsrelsethashtreefm0(local)
 
     while undecided:
 
@@ -2407,7 +2434,7 @@
                  % (roundtrips, len(undecided), len(sample)))
         # indices between sample and externalized version must match
         sample = list(sample)
-        remotehash = remote.evoext_obshash(dag.externalizeall(sample))
+        remotehash = remotehash(dag.externalizeall(sample))
 
         yesno = [localhash[ix][1] == remotehash[si]
                  for si, ix in enumerate(sample)]
@@ -2738,7 +2765,13 @@
     finaldata.seek(0)
     return wireproto.streamres(proto.groupchunks(finaldata))
 
-def _obsrelsethashtree(repo):
+def _obsrelsethashtreefm0(repo):
+    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
+
+def _obsrelsethashtreefm1(repo):
+    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
+
+def _obsrelsethashtree(repo, encodeonemarker):
     cache = []
     unfi = repo.unfiltered()
     markercache = {}
@@ -2761,7 +2794,7 @@
             bmarkers = []
             for m in tmarkers:
                 if not m in markercache:
-                    markercache[m] = obsolete._fm0encodeonemarker(m)
+                    markercache[m] = encodeonemarker(m)
                 bmarkers.append(markercache[m])
             bmarkers.sort()
             for m in bmarkers:
@@ -2774,14 +2807,24 @@
     return cache
 
 @command('debugobsrelsethashtree',
-        [] , _(''))
-def debugobsrelsethashtree(ui, repo):
+        [('', 'v0', None, 'hash on marker format "0"'),
+         ('', 'v1', None, 'hash on marker format "1" (default)')
+         ,] , _(''))
+def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
     """display Obsolete markers, Relevant Set, Hash Tree
     changeset-node obsrelsethashtree-node
 
     It computed form the "orsht" of its parent and markers
     relevant to the changeset itself."""
-    for chg, obs in _obsrelsethashtree(repo):
+    if v0 and v1:
+        raise util.Abort('cannot only specify one format')
+    elif v0:
+        treefunc = _obsrelsethashtreefm0
+    else:
+        treefunc = _obsrelsethashtreefm1
+
+    treefunc = _obsrelsethashtree
+    for chg, obs in treefunc(repo):
         ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
 
 _bestformat = max(obsolete.formats.keys())
@@ -2840,6 +2883,7 @@
         caps += ' _evoext_pushobsmarkers_0'
         caps += ' _evoext_pullobsmarkers_0'
         caps += ' _evoext_obshash_0'
+        caps += ' _evoext_obshash_1'
         caps += ' _evoext_getbundle_obscommon'
     return caps