# HG changeset patch # User Pierre-Yves David # Date 1712695035 -7200 # Node ID 3a6fae3bef356f5cc57e0ac2fc5b0a49ad0a791e # Parent e3a5ec2d236aad5a77f82b186ab039bfd178bc8d 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) diff -r e3a5ec2d236a -r 3a6fae3bef35 mercurial/discovery.py --- 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()