Mercurial > hg
changeset 51581:e0194b3ea312
phases: use revision number in analyze_remote_phases
Same logic as the previous change to `new_heads`, see rationnal there.
This avoids a small number of `nodes -> revs` conversion speeding thing up in
the 100 milliseconds order of magnitude for the worses cases. However, the rest
of the logic is noisy enough that it hardly matters for now.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 05 Apr 2024 12:02:43 +0200 |
parents | b70628a9aa7e |
children | d8287e43540f |
files | mercurial/exchange.py mercurial/phases.py |
diffstat | 2 files changed, 33 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/exchange.py Fri Apr 05 11:33:47 2024 +0200 +++ b/mercurial/exchange.py Fri Apr 05 12:02:43 2024 +0200 @@ -1308,8 +1308,16 @@ _localphasemove(pushop, cheads) # don't push any phase data as there is nothing to push else: - ana = phases.analyzeremotephases(pushop.repo, cheads, remotephases) - pheads, droots = ana + unfi = pushop.repo.unfiltered() + to_rev = unfi.changelog.index.rev + to_node = unfi.changelog.node + cheads_revs = [to_rev(n) for n in cheads] + pheads_revs, _dr = phases.analyze_remote_phases( + pushop.repo, + cheads_revs, + remotephases, + ) + pheads = [to_node(r) for r in pheads_revs] ### Apply remote phase on local if remotephases.get(b'publishing', False): _localphasemove(pushop, cheads) @@ -2063,10 +2071,17 @@ pullop.stepsdone.add(b'phases') publishing = bool(remotephases.get(b'publishing', False)) if remotephases and not publishing: + unfi = pullop.repo.unfiltered() + to_rev = unfi.changelog.index.rev + to_node = unfi.changelog.node + pulledsubset_revs = [to_rev(n) for n in pullop.pulledsubset] # remote is new and non-publishing - pheads, _dr = phases.analyzeremotephases( - pullop.repo, pullop.pulledsubset, remotephases + pheads_revs, _dr = phases.analyze_remote_phases( + pullop.repo, + pulledsubset_revs, + remotephases, ) + pheads = [to_node(r) for r in pheads_revs] dheads = pullop.pulledsubset else: # Remote is old or publishing all common changesets
--- a/mercurial/phases.py Fri Apr 05 11:33:47 2024 +0200 +++ b/mercurial/phases.py Fri Apr 05 12:02:43 2024 +0200 @@ -1095,7 +1095,11 @@ advanceboundary(repo, trgetter(), phase, heads) -def analyzeremotephases(repo, subset, roots): +def analyze_remote_phases( + repo, + subset: Collection[int], + roots: Dict[bytes, bytes], +) -> Tuple[Collection[int], Collection[int]]: """Compute phases heads and root in a subset of node from root dict * subset is heads of the subset @@ -1107,7 +1111,6 @@ # build list from dictionary draft_roots = [] to_rev = repo.changelog.index.get_rev - to_node = repo.changelog.node for nhex, phase in roots.items(): if nhex == b'publishing': # ignore data related to publish option continue @@ -1125,11 +1128,8 @@ msg = _(b'ignoring unexpected root from remote: %i %s\n') repo.ui.warn(msg % (phase, nhex)) # compute heads - subset_revs = [to_rev(n) for n in subset] - public_heads = new_heads(repo, subset_revs, draft_roots) - draft_nodes = [to_node(r) for r in draft_roots] - public_nodes = [to_node(r) for r in public_heads] - return public_nodes, draft_nodes + public_heads = new_heads(repo, subset, draft_roots) + return public_heads, draft_roots class remotephasessummary: @@ -1143,14 +1143,18 @@ def __init__(self, repo, remotesubset, remoteroots): unfi = repo.unfiltered() + to_rev = unfi.changelog.index.rev + to_node = unfi.changelog.node self._allremoteroots = remoteroots self.publishing = remoteroots.get(b'publishing', False) - ana = analyzeremotephases(repo, remotesubset, remoteroots) - self.publicheads, self.draftroots = ana + remote_subset = [to_rev(n) for n in remotesubset] + heads, roots = analyze_remote_phases(repo, remote_subset, remoteroots) + self.publicheads = [to_node(r) for r in heads] + self.draftroots = [to_node(r) for r in roots] # Get the list of all "heads" revs draft on remote - dheads = unfi.set(b'heads(%ln::%ln)', self.draftroots, remotesubset) + dheads = unfi.set(b'heads(%ld::%ld)', roots, remote_subset) self.draftheads = [c.node() for c in dheads]