Mercurial > hg
diff mercurial/changegroup.py @ 51395:a0d88b021a98
unbundle: faster computation of changed heads
To compute the set of changed heads it's sufficient to look at the recent commits,
instead of looking at all heads currently in existence.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Thu, 21 Dec 2023 17:38:04 +0000 |
parents | d718eddf01d9 |
children | 493034cc3265 |
line wrap: on
line diff
--- a/mercurial/changegroup.py Wed Feb 21 11:53:30 2024 +0100 +++ b/mercurial/changegroup.py Thu Dec 21 17:38:04 2023 +0000 @@ -518,7 +518,7 @@ # will not see an inconsistent view cl = repo.changelog cl.delayupdate(tr) - oldheads = set(cl.heads()) + oldrevcount = len(cl) trp = weakref.proxy(tr) # pull off the changeset group @@ -673,12 +673,12 @@ tr.changes[b'changegroup-count-files'] += newfiles deltaheads = 0 - if oldheads: - heads = cl.heads() - deltaheads += len(heads) - len(oldheads) - for h in heads: - if h not in oldheads and repo[h].closesbranch(): - deltaheads -= 1 + newrevcount = len(cl) + heads_removed, heads_added = cl.diffheads(oldrevcount, newrevcount) + deltaheads += len(heads_added) - len(heads_removed) + for h in heads_added: + if repo[h].closesbranch(): + deltaheads -= 1 # see previous comment about checking ui.quiet if not repo.ui.quiet: @@ -746,12 +746,11 @@ del args[b'node_last'] repo.hook(b"incoming", **pycompat.strkwargs(args)) - newheads = [h for h in repo.heads() if h not in oldheads] repo.ui.log( b"incoming", b"%d incoming changes - new heads: %s\n", len(added), - b', '.join([hex(c[:6]) for c in newheads]), + b', '.join([hex(c[:6]) for c in heads_added]), ) tr.addpostclose( @@ -1735,7 +1734,6 @@ x in self._fullclnodes or cl.rev(x) in self._precomputedellipsis ): - manifestnode = c.manifest # Record the first changeset introducing this manifest # version. @@ -1994,6 +1992,7 @@ clrevtolocalrev.clear() linkrevnodes = linknodes(filerevlog, fname) + # Lookup for filenodes, we collected the linkrev nodes above in the # fastpath case and with lookupmf in the slowpath case. def lookupfilelog(x):