We don't need to use dagutil to perform a simple rev -> node
conversion.
I haven't measured, but the new code is likely faster, as we
avoid extra function calls and avoid some attribute lookups.
hg-reviewers |
We don't need to use dagutil to perform a simple rev -> node
conversion.
I haven't measured, but the new code is likely faster, as we
avoid extra function calls and avoid some attribute lookups.
Automatic diff as part of commit; lint not applicable. |
Automatic diff as part of commit; unit tests not applicable. |
Path | Packages | |||
---|---|---|---|---|
M | mercurial/debugcommands.py (6 lines) | |||
M | mercurial/setdiscovery.py (15 lines) |
Status | Author | Revision | |
---|---|---|---|
Closed | indygreg | D4330 dagutil: remove module | |
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg | ||
Closed | indygreg |
# enable in-client legacy support | # enable in-client legacy support | ||||
remote = localrepo.locallegacypeer(remote.local()) | remote = localrepo.locallegacypeer(remote.local()) | ||||
common, _in, hds = treediscovery.findcommonincoming(repo, remote, | common, _in, hds = treediscovery.findcommonincoming(repo, remote, | ||||
force=True) | force=True) | ||||
common = set(common) | common = set(common) | ||||
if not opts.get('nonheads'): | if not opts.get('nonheads'): | ||||
ui.write(("unpruned common: %s\n") % | ui.write(("unpruned common: %s\n") % | ||||
" ".join(sorted(short(n) for n in common))) | " ".join(sorted(short(n) for n in common))) | ||||
dag = dagutil.revlogdag(repo.changelog) | cl = repo.changelog | ||||
clnode = cl.node | |||||
dag = dagutil.revlogdag(cl) | |||||
all = dag.ancestorset(dag.internalizeall(common)) | all = dag.ancestorset(dag.internalizeall(common)) | ||||
common = dag.externalizeall(dag.headsetofconnecteds(all)) | common = {clnode(r) for r in dag.headsetofconnecteds(all)} | ||||
else: | else: | ||||
nodes = None | nodes = None | ||||
if pushedrevs: | if pushedrevs: | ||||
revs = scmutil.revrange(repo, pushedrevs) | revs = scmutil.revrange(repo, pushedrevs) | ||||
nodes = [repo[r].node() for r in revs] | nodes = [repo[r].node() for r in revs] | ||||
common, any, hds = setdiscovery.findcommonheads(ui, repo, remote, | common, any, hds = setdiscovery.findcommonheads(ui, repo, remote, | ||||
ancestorsof=nodes) | ancestorsof=nodes) | ||||
common = set(common) | common = set(common) |
ancestorsof=None): | ancestorsof=None): | ||||
'''Return a tuple (common, anyincoming, remoteheads) used to identify | '''Return a tuple (common, anyincoming, remoteheads) used to identify | ||||
missing nodes from or in remote. | missing nodes from or in remote. | ||||
''' | ''' | ||||
start = util.timer() | start = util.timer() | ||||
roundtrips = 0 | roundtrips = 0 | ||||
cl = local.changelog | cl = local.changelog | ||||
clnode = cl.node | |||||
localsubset = None | localsubset = None | ||||
if ancestorsof is not None: | if ancestorsof is not None: | ||||
rev = local.changelog.rev | rev = local.changelog.rev | ||||
localsubset = [rev(n) for n in ancestorsof] | localsubset = [rev(n) for n in ancestorsof] | ||||
dag = dagutil.revlogdag(cl, localsubset=localsubset) | dag = dagutil.revlogdag(cl, localsubset=localsubset) | ||||
# early exit if we know all the specified remote heads already | # early exit if we know all the specified remote heads already | ||||
ui.debug("query 1; heads\n") | ui.debug("query 1; heads\n") | ||||
roundtrips += 1 | roundtrips += 1 | ||||
ownheads = dag.heads() | ownheads = dag.heads() | ||||
sample = _limitsample(ownheads, initialsamplesize) | sample = _limitsample(ownheads, initialsamplesize) | ||||
# indices between sample and externalized version must match | # indices between sample and externalized version must match | ||||
sample = list(sample) | sample = list(sample) | ||||
with remote.commandexecutor() as e: | with remote.commandexecutor() as e: | ||||
fheads = e.callcommand('heads', {}) | fheads = e.callcommand('heads', {}) | ||||
fknown = e.callcommand('known', { | fknown = e.callcommand('known', { | ||||
'nodes': dag.externalizeall(sample), | 'nodes': [clnode(r) for r in sample], | ||||
}) | }) | ||||
srvheadhashes, yesno = fheads.result(), fknown.result() | srvheadhashes, yesno = fheads.result(), fknown.result() | ||||
if cl.tip() == nullid: | if cl.tip() == nullid: | ||||
if srvheadhashes != [nullid]: | if srvheadhashes != [nullid]: | ||||
return [nullid], True, srvheadhashes | return [nullid], True, srvheadhashes | ||||
return [nullid], False, [] | return [nullid], False, [] | ||||
# start actual discovery (we note this before the next "if" for | # start actual discovery (we note this before the next "if" for | ||||
# compatibility reasons) | # compatibility reasons) | ||||
ui.status(_("searching for changes\n")) | ui.status(_("searching for changes\n")) | ||||
srvheads = dag.internalizeall(srvheadhashes, filterunknown=True) | srvheads = dag.internalizeall(srvheadhashes, filterunknown=True) | ||||
if len(srvheads) == len(srvheadhashes): | if len(srvheads) == len(srvheadhashes): | ||||
ui.debug("all remote heads known locally\n") | ui.debug("all remote heads known locally\n") | ||||
return (srvheadhashes, False, srvheadhashes,) | return srvheadhashes, False, srvheadhashes | ||||
if len(sample) == len(ownheads) and all(yesno): | if len(sample) == len(ownheads) and all(yesno): | ||||
ui.note(_("all local heads known remotely\n")) | ui.note(_("all local heads known remotely\n")) | ||||
ownheadhashes = dag.externalizeall(ownheads) | ownheadhashes = [clnode(r) for r in ownheads] | ||||
return (ownheadhashes, True, srvheadhashes,) | return ownheadhashes, True, srvheadhashes | ||||
# full blown discovery | # full blown discovery | ||||
# own nodes I know we both know | # own nodes I know we both know | ||||
# treat remote heads (and maybe own heads) as a first implicit sample | # treat remote heads (and maybe own heads) as a first implicit sample | ||||
# response | # response | ||||
common = cl.incrementalmissingrevs(srvheads) | common = cl.incrementalmissingrevs(srvheads) | ||||
commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) | commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) | ||||
progress.update(roundtrips) | progress.update(roundtrips) | ||||
ui.debug("query %i; still undecided: %i, sample size is: %i\n" | ui.debug("query %i; still undecided: %i, sample size is: %i\n" | ||||
% (roundtrips, len(undecided), len(sample))) | % (roundtrips, len(undecided), len(sample))) | ||||
# indices between sample and externalized version must match | # indices between sample and externalized version must match | ||||
sample = list(sample) | sample = list(sample) | ||||
with remote.commandexecutor() as e: | with remote.commandexecutor() as e: | ||||
yesno = e.callcommand('known', { | yesno = e.callcommand('known', { | ||||
'nodes': dag.externalizeall(sample), | 'nodes': [clnode(r) for r in sample], | ||||
}).result() | }).result() | ||||
full = True | full = True | ||||
if sample: | if sample: | ||||
commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) | commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) | ||||
common.addbases(commoninsample) | common.addbases(commoninsample) | ||||
common.removeancestorsfrom(undecided) | common.removeancestorsfrom(undecided) | ||||
if not result and srvheadhashes != [nullid]: | if not result and srvheadhashes != [nullid]: | ||||
if abortwhenunrelated: | if abortwhenunrelated: | ||||
raise error.Abort(_("repository is unrelated")) | raise error.Abort(_("repository is unrelated")) | ||||
else: | else: | ||||
ui.warn(_("warning: repository is unrelated\n")) | ui.warn(_("warning: repository is unrelated\n")) | ||||
return ({nullid}, True, srvheadhashes,) | return ({nullid}, True, srvheadhashes,) | ||||
anyincoming = (srvheadhashes != [nullid]) | anyincoming = (srvheadhashes != [nullid]) | ||||
return dag.externalizeall(result), anyincoming, srvheadhashes | result = {clnode(r) for r in result} | ||||
return result, anyincoming, srvheadhashes |