Mercurial > evolve
diff 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 |
line wrap: on
line diff
--- a/hgext/evolve.py Wed Aug 27 10:53:09 2014 +0200 +++ b/hgext/evolve.py Wed Aug 27 10:49:58 2014 +0200 @@ -2229,6 +2229,78 @@ +### Set discovery START + +import random +from mercurial import dagutil +from mercurial import setdiscovery + +def _obshash(repo, nodes): + hashs = _obsrelsethashtree(repo) + nm = repo.changelog.nodemap + return [hashs[nm.get(n)][1] for n in nodes] + +def srv_obshash(repo, proto, nodes): + return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes))) + +@eh.addattr(localrepo.localpeer, 'evoext_obshash') +def local_obshash(peer, nodes): + return _obshash(peer._repo, nodes) + +@eh.addattr(wireproto.wirepeer, 'evoext_obshash') +def peer_obshash(self, nodes): + d = self._call("evoext_obshash", 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): + # from discovery + roundtrips = 0 + cl = local.changelog + dag = dagutil.revlogdag(cl) + localhash = _obsrelsethashtree(local) + missing = set() + common = set() + undecided = set(probeset) + _takefullsample = setdiscovery._takefullsample + + while undecided: + + ui.note(_("sampling from both directions\n")) + sample = _takefullsample(dag, undecided, size=fullsamplesize) + + roundtrips += 1 + ui.debug("query %i; still undecided: %i, sample size is: %i\n" + % (roundtrips, len(undecided), len(sample))) + # indices between sample and externalized version must match + sample = list(sample) + remotehash = remote.evoext_obshash(dag.externalizeall(sample)) + + yesno = [localhash[ix][1] == remotehash[si] + for si, ix in enumerate(sample)] + + commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) + common.update(dag.ancestorset(commoninsample, common)) + + missinginsample = [n for i, n in enumerate(sample) if not yesno[i]] + missing.update(dag.descendantset(missinginsample, missing)) + + undecided.difference_update(missing) + undecided.difference_update(common) + + + result = dag.headsetofconnecteds(common) + ui.debug("%d total queries\n" % roundtrips) + + if not result: + return set([nullid]) + return dag.externalizeall(result) + + _pushkeyescape = getattr(obsolete, '_pushkeyescape', None) if _pushkeyescape is None: _maxpayload = 5300 @@ -2676,77 +2748,6 @@ ui.status('%s %s\n' % (node.hex(chg), node.hex(obs))) -### Set discovery START - -import random -from mercurial import dagutil -from mercurial import setdiscovery - -def _obshash(repo, nodes): - hashs = _obsrelsethashtree(repo) - nm = repo.changelog.nodemap - return [hashs[nm.get(n)][1] for n in nodes] - -def srv_obshash(repo, proto, nodes): - return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes))) - -@eh.addattr(localrepo.localpeer, 'evoext_obshash') -def local_obshash(peer, nodes): - return _obshash(peer._repo, nodes) - -@eh.addattr(wireproto.wirepeer, 'evoext_obshash') -def peer_obshash(self, nodes): - d = self._call("evoext_obshash", 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): - # from discovery - roundtrips = 0 - cl = local.changelog - dag = dagutil.revlogdag(cl) - localhash = _obsrelsethashtree(local) - missing = set() - common = set() - undecided = set(probeset) - _takefullsample = setdiscovery._takefullsample - - while undecided: - - ui.note(_("sampling from both directions\n")) - sample = _takefullsample(dag, undecided, size=fullsamplesize) - - roundtrips += 1 - ui.debug("query %i; still undecided: %i, sample size is: %i\n" - % (roundtrips, len(undecided), len(sample))) - # indices between sample and externalized version must match - sample = list(sample) - remotehash = remote.evoext_obshash(dag.externalizeall(sample)) - - yesno = [localhash[ix][1] == remotehash[si] - for si, ix in enumerate(sample)] - - commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) - common.update(dag.ancestorset(commoninsample, common)) - - missinginsample = [n for i, n in enumerate(sample) if not yesno[i]] - missing.update(dag.descendantset(missinginsample, missing)) - - undecided.difference_update(missing) - undecided.difference_update(common) - - - result = dag.headsetofconnecteds(common) - ui.debug("%d total queries\n" % roundtrips) - - if not result: - return set([nullid]) - return dag.externalizeall(result) - @eh.wrapfunction(wireproto, 'capabilities') def capabilities(orig, repo, proto): """wrapper to advertise new capability"""