outgoing: add a simple fastpath when there is no common
This further speed up case like `hg bundle --all` for larger repository.
### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.bundle
# bin-env-vars.hg.flavor = default
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.revs = all
# benchmark.variants.type = none-streamv2
before: 316.749699
after: 311.165461 (-1.76%, -5.58)
There is further work to be done in this area like not doing any outgoing
computation in the stream case for example. however the recent changes already
gives use a large win for a small amount of local work.
### benchmark.name = hg.command.bundle
# bin-env-vars.hg.flavor = default
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.revs = all
# benchmark.variants.type = none-streamv2
## data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
pre-%ln-change: 1.263859
the-%ln-change: 0.700229 (-44.60%, -0.56)
prev-changeset: 0.496050 (-60.75%, -0.77)
this-changeset: 0.495243 (-60.81%, -0.77)
## data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
pre-%ln-change: 2.975765
the-%ln-change: 1.870798 (-37.13%, -1.10)
prev-changeset: 1.461583 (-50.88%, -1.51)
this-changeset: 1.469185 (-50.63%, -1.51)
## data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
pre-%ln-change: 4.540080
the-%ln-change: 3.401700 (-25.07%, -1.14)
prev-changeset: 2.915810 (-35.78%, -1.62)
this-changeset: 2.911643 (-35.87%, -1.63)
## data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
pre-%ln-change: 10.138396
the-%ln-change: 7.750458 (-23.55%, -2.39)
prev-changeset: 6.665565 (-34.25%, -3.47)
this-changeset: 6.672078 (-34.19%, -3.47)
## data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog
pre-%ln-change: 399.484481
the-%ln-change: 346.508952 (-13.26%, -52.98)
prev-changeset: 316.749699 (-20.71%, -82.73)
this-changeset: 311.165461 (-22.11%, -88.32)
--- a/mercurial/discovery.py Tue Apr 09 22:36:35 2024 +0200
+++ b/mercurial/discovery.py Tue Apr 09 22:37:15 2024 +0200
@@ -104,16 +104,28 @@
m = 'commonheads and missingroots arguments are mutually exclusive'
raise error.ProgrammingError(m)
cl = repo.changelog
+ unfi = repo.unfiltered()
+ ucl = unfi.changelog
+ to_node = ucl.node
missing = None
common = None
+ arg_anc = ancestorsof
if ancestorsof is None:
ancestorsof = cl.heads()
- if missingroots:
+
+ # XXX-perf: do we need all this to be node-list? They would be simpler
+ # as rev-num sets (and smartset)
+ if missingroots == [nodemod.nullrev] or missingroots == []:
+ commonheads = [repo.nullid]
+ common = set()
+ if arg_anc is None:
+ missing = [to_node(r) for r in cl]
+ else:
+ missing_rev = repo.revs('::%ln', missingroots, ancestorsof)
+ missing = [to_node(r) for r in missing_rev]
+ elif missingroots is not None:
# TODO remove call to nodesbetween.
missing_rev = repo.revs('%ln::%ln', missingroots, ancestorsof)
- unfi = repo.unfiltered()
- ucl = unfi.changelog
- to_node = ucl.node
ancestorsof = [to_node(r) for r in ucl.headrevs(missing_rev)]
parent_revs = ucl.parentrevs
common_legs = set()