comparison hgext/evolve.py @ 1072:1639810c11c2

code movement: gather discovery code together The discovery code is the one thing that will survive the great purge.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Wed, 27 Aug 2014 10:49:58 +0200
parents 3009e6eaea4c
children f15f02007a0b
comparison
equal deleted inserted replaced
1071:3009e6eaea4c 1072:1639810c11c2
2225 if ui.configbool('experimental', 'verbose-obsolescence-exchange', False): 2225 if ui.configbool('experimental', 'verbose-obsolescence-exchange', False):
2226 topic = 'OBSEXC' 2226 topic = 'OBSEXC'
2227 ui.progress(topic, *args, **kwargs) 2227 ui.progress(topic, *args, **kwargs)
2228 2228
2229 2229
2230
2231
2232 ### Set discovery START
2233
2234 import random
2235 from mercurial import dagutil
2236 from mercurial import setdiscovery
2237
2238 def _obshash(repo, nodes):
2239 hashs = _obsrelsethashtree(repo)
2240 nm = repo.changelog.nodemap
2241 return [hashs[nm.get(n)][1] for n in nodes]
2242
2243 def srv_obshash(repo, proto, nodes):
2244 return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
2245
2246 @eh.addattr(localrepo.localpeer, 'evoext_obshash')
2247 def local_obshash(peer, nodes):
2248 return _obshash(peer._repo, nodes)
2249
2250 @eh.addattr(wireproto.wirepeer, 'evoext_obshash')
2251 def peer_obshash(self, nodes):
2252 d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
2253 try:
2254 return wireproto.decodelist(d)
2255 except ValueError:
2256 self._abort(error.ResponseError(_("unexpected response:"), d))
2257
2258 def findcommonobsmarkers(ui, local, remote, probeset,
2259 initialsamplesize=100,
2260 fullsamplesize=200):
2261 # from discovery
2262 roundtrips = 0
2263 cl = local.changelog
2264 dag = dagutil.revlogdag(cl)
2265 localhash = _obsrelsethashtree(local)
2266 missing = set()
2267 common = set()
2268 undecided = set(probeset)
2269 _takefullsample = setdiscovery._takefullsample
2270
2271 while undecided:
2272
2273 ui.note(_("sampling from both directions\n"))
2274 sample = _takefullsample(dag, undecided, size=fullsamplesize)
2275
2276 roundtrips += 1
2277 ui.debug("query %i; still undecided: %i, sample size is: %i\n"
2278 % (roundtrips, len(undecided), len(sample)))
2279 # indices between sample and externalized version must match
2280 sample = list(sample)
2281 remotehash = remote.evoext_obshash(dag.externalizeall(sample))
2282
2283 yesno = [localhash[ix][1] == remotehash[si]
2284 for si, ix in enumerate(sample)]
2285
2286 commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
2287 common.update(dag.ancestorset(commoninsample, common))
2288
2289 missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
2290 missing.update(dag.descendantset(missinginsample, missing))
2291
2292 undecided.difference_update(missing)
2293 undecided.difference_update(common)
2294
2295
2296 result = dag.headsetofconnecteds(common)
2297 ui.debug("%d total queries\n" % roundtrips)
2298
2299 if not result:
2300 return set([nullid])
2301 return dag.externalizeall(result)
2230 2302
2231 2303
2232 _pushkeyescape = getattr(obsolete, '_pushkeyescape', None) 2304 _pushkeyescape = getattr(obsolete, '_pushkeyescape', None)
2233 if _pushkeyescape is None: 2305 if _pushkeyescape is None:
2234 _maxpayload = 5300 2306 _maxpayload = 5300
2674 relevant to the changeset itself.""" 2746 relevant to the changeset itself."""
2675 for chg, obs in _obsrelsethashtree(repo): 2747 for chg, obs in _obsrelsethashtree(repo):
2676 ui.status('%s %s\n' % (node.hex(chg), node.hex(obs))) 2748 ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
2677 2749
2678 2750
2679 ### Set discovery START
2680
2681 import random
2682 from mercurial import dagutil
2683 from mercurial import setdiscovery
2684
2685 def _obshash(repo, nodes):
2686 hashs = _obsrelsethashtree(repo)
2687 nm = repo.changelog.nodemap
2688 return [hashs[nm.get(n)][1] for n in nodes]
2689
2690 def srv_obshash(repo, proto, nodes):
2691 return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
2692
2693 @eh.addattr(localrepo.localpeer, 'evoext_obshash')
2694 def local_obshash(peer, nodes):
2695 return _obshash(peer._repo, nodes)
2696
2697 @eh.addattr(wireproto.wirepeer, 'evoext_obshash')
2698 def peer_obshash(self, nodes):
2699 d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
2700 try:
2701 return wireproto.decodelist(d)
2702 except ValueError:
2703 self._abort(error.ResponseError(_("unexpected response:"), d))
2704
2705 def findcommonobsmarkers(ui, local, remote, probeset,
2706 initialsamplesize=100,
2707 fullsamplesize=200):
2708 # from discovery
2709 roundtrips = 0
2710 cl = local.changelog
2711 dag = dagutil.revlogdag(cl)
2712 localhash = _obsrelsethashtree(local)
2713 missing = set()
2714 common = set()
2715 undecided = set(probeset)
2716 _takefullsample = setdiscovery._takefullsample
2717
2718 while undecided:
2719
2720 ui.note(_("sampling from both directions\n"))
2721 sample = _takefullsample(dag, undecided, size=fullsamplesize)
2722
2723 roundtrips += 1
2724 ui.debug("query %i; still undecided: %i, sample size is: %i\n"
2725 % (roundtrips, len(undecided), len(sample)))
2726 # indices between sample and externalized version must match
2727 sample = list(sample)
2728 remotehash = remote.evoext_obshash(dag.externalizeall(sample))
2729
2730 yesno = [localhash[ix][1] == remotehash[si]
2731 for si, ix in enumerate(sample)]
2732
2733 commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
2734 common.update(dag.ancestorset(commoninsample, common))
2735
2736 missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
2737 missing.update(dag.descendantset(missinginsample, missing))
2738
2739 undecided.difference_update(missing)
2740 undecided.difference_update(common)
2741
2742
2743 result = dag.headsetofconnecteds(common)
2744 ui.debug("%d total queries\n" % roundtrips)
2745
2746 if not result:
2747 return set([nullid])
2748 return dag.externalizeall(result)
2749
2750 @eh.wrapfunction(wireproto, 'capabilities') 2751 @eh.wrapfunction(wireproto, 'capabilities')
2751 def capabilities(orig, repo, proto): 2752 def capabilities(orig, repo, proto):
2752 """wrapper to advertise new capability""" 2753 """wrapper to advertise new capability"""
2753 caps = orig(repo, proto) 2754 caps = orig(repo, proto)
2754 if obsolete._enabled: 2755 if obsolete._enabled: