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)
#require no-chg
Test basic extension support
$ cat > foobar.py <<EOF
> import os
> from mercurial import commands, registrar
> cmdtable = {}
> command = registrar.command(cmdtable)
> configtable = {}
> configitem = registrar.configitem(configtable)
> configitem(b'tests', b'foo', default=b"Foo")
> def uisetup(ui):
> ui.debug(b"uisetup called [debug]\\n")
> ui.write(b"uisetup called\\n")
> ui.status(b"uisetup called [status]\\n")
> ui.flush()
> def reposetup(ui, repo):
> ui.write(b"reposetup called for %s\\n" % os.path.basename(repo.root))
> ui.write(b"ui %s= repo.ui\\n" % (ui == repo.ui and b"=" or b"!"))
> ui.flush()
> @command(b'foo', [], b'hg foo')
> def foo(ui, *args, **kwargs):
> foo = ui.config(b'tests', b'foo')
> ui.write(foo)
> ui.write(b"\\n")
> @command(b'bar', [], b'hg bar', norepo=True)
> def bar(ui, *args, **kwargs):
> ui.write(b"Bar\\n")
> EOF
$ abspath=`pwd`/foobar.py
$ mkdir barfoo
$ cp foobar.py barfoo/__init__.py
$ barfoopath=`pwd`/barfoo
$ hg init a
$ cd a
$ echo foo > file
$ hg add file
$ hg commit -m 'add file'
$ echo '[extensions]' >> $HGRCPATH
$ echo "foobar = $abspath" >> $HGRCPATH
$ filterlog () {
> sed -e 's!^[0-9/]* [0-9:]* ([0-9]*)>!YYYY/MM/DD HH:MM:SS (PID)>!'
> }
Test extension setup timings
$ hg foo --traceback --config devel.debug.extensions=yes --debug 2>&1 | filterlog
YYYY/MM/DD HH:MM:SS (PID)> loading extensions
YYYY/MM/DD HH:MM:SS (PID)> - processing 1 entries
YYYY/MM/DD HH:MM:SS (PID)> - loading extension: foobar
YYYY/MM/DD HH:MM:SS (PID)> > foobar extension loaded in * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - validating extension tables: foobar
YYYY/MM/DD HH:MM:SS (PID)> - invoking registered callbacks: foobar
YYYY/MM/DD HH:MM:SS (PID)> > callbacks completed in * (glob)
YYYY/MM/DD HH:MM:SS (PID)> > loaded 1 extensions, total time * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - loading configtable attributes
YYYY/MM/DD HH:MM:SS (PID)> - executing uisetup hooks
YYYY/MM/DD HH:MM:SS (PID)> - running uisetup for foobar
uisetup called [debug]
uisetup called
uisetup called [status]
YYYY/MM/DD HH:MM:SS (PID)> > uisetup for foobar took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> > all uisetup took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - executing extsetup hooks
YYYY/MM/DD HH:MM:SS (PID)> - running extsetup for foobar
YYYY/MM/DD HH:MM:SS (PID)> > extsetup for foobar took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> > all extsetup took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - executing remaining aftercallbacks
YYYY/MM/DD HH:MM:SS (PID)> > remaining aftercallbacks completed in * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - loading extension registration objects
YYYY/MM/DD HH:MM:SS (PID)> > extension registration object loading took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> > extension foobar take a total of * to load (glob)
YYYY/MM/DD HH:MM:SS (PID)> extension loading complete
YYYY/MM/DD HH:MM:SS (PID)> loading additional extensions
YYYY/MM/DD HH:MM:SS (PID)> - processing 1 entries
YYYY/MM/DD HH:MM:SS (PID)> > loaded 0 extensions, total time * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - loading configtable attributes
YYYY/MM/DD HH:MM:SS (PID)> - executing uisetup hooks
YYYY/MM/DD HH:MM:SS (PID)> > all uisetup took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - executing extsetup hooks
YYYY/MM/DD HH:MM:SS (PID)> > all extsetup took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - executing remaining aftercallbacks
YYYY/MM/DD HH:MM:SS (PID)> > remaining aftercallbacks completed in * (glob)
YYYY/MM/DD HH:MM:SS (PID)> - loading extension registration objects
YYYY/MM/DD HH:MM:SS (PID)> > extension registration object loading took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> extension loading complete
YYYY/MM/DD HH:MM:SS (PID)> - executing reposetup hooks
YYYY/MM/DD HH:MM:SS (PID)> - running reposetup for foobar
reposetup called for a
ui == repo.ui
YYYY/MM/DD HH:MM:SS (PID)> > reposetup for foobar took * (glob)
YYYY/MM/DD HH:MM:SS (PID)> > all reposetup took * (glob)
Foo
$ cd ..
$ echo 'foobar = !' >> $HGRCPATH