revset: optimize "draft() & ::x" pattern
The `draft() & ::x` type query could be common for selecting one or more
draft feature branches being worked on.
Before this patch, `::x` may travel through the changelog DAG for a long
distance until it gets a smaller revision number than `min(draft())`. It
could be very slow on long changelog with distant (in terms of revision
numbers) drafts.
This patch adds a fast path for this situation, and will stop traveling the
changelog DAG once `::x` hits a non-draft revision.
The fast path also works for `secret()` and `not public()`.
To measure the performance difference, I used drawdag to create a repo that
emulates distant drafts:
DRAFT4
|
DRAFT3 # draft
/
PUBLIC9999 # public
|
PUBLIC9998
|
. DRAFT2
. |
. DRAFT1 # draft
| /
PUBLIC0001 # public
And measured the performance using the repo:
(BEFORE)
$ hg perfrevset 'draft() & ::(DRAFT2+DRAFT4)'
! wall 0.017132 comb 0.010000 user 0.010000 sys 0.000000 (best of 156)
$ hg perfrevset 'draft() & ::(all())'
! wall 0.024221 comb 0.030000 user 0.030000 sys 0.000000 (best of 113)
(AFTER)
$ hg perfrevset 'draft() & ::(DRAFT2+DRAFT4)'
! wall 0.000243 comb 0.000000 user 0.000000 sys 0.000000 (best of 9303)
$ hg perfrevset 'draft() & ::(all())'
! wall 0.004319 comb 0.000000 user 0.000000 sys 0.000000 (best of 655)
Differential Revision: https://phab.mercurial-scm.org/D441
#require test-repo slow osx osxpackaging
$ . "$TESTDIR/helpers-testrepo.sh"
$ testrepohgenv
$ OUTPUTDIR="`pwd`"
$ export OUTPUTDIR
$ KEEPMPKG=yes
$ export KEEPMPKG
$ cd "$TESTDIR"/..
$ contrib/genosxversion.py --selftest ignoredarg
$ make osx > "$OUTPUTDIR/build.log" 2>&1
$ cd "$OUTPUTDIR"
$ ls -d *.pkg
Mercurial-*-macosx10.*.pkg (glob)
$ xar -xf Mercurial*.pkg
Gather list of all installed files:
$ lsbom mercurial.pkg/Bom > boms.txt
We've had problems with the filter logic in the past. Make sure no
.DS_Store files ended up in the final package:
$ grep DS_S boms.txt
[1]
Spot-check some randomly selected files:
$ grep bdiff boms.txt | cut -d ' ' -f 1,2,3
./Library/Python/2.7/site-packages/mercurial/cext/bdiff.so 100755 0/0
./Library/Python/2.7/site-packages/mercurial/cffi/bdiff.py 100644 0/0
./Library/Python/2.7/site-packages/mercurial/cffi/bdiff.pyc 100644 0/0
./Library/Python/2.7/site-packages/mercurial/cffi/bdiff.pyo 100644 0/0
./Library/Python/2.7/site-packages/mercurial/cffi/bdiffbuild.py 100644 0/0
./Library/Python/2.7/site-packages/mercurial/cffi/bdiffbuild.pyc 100644 0/0
./Library/Python/2.7/site-packages/mercurial/cffi/bdiffbuild.pyo 100644 0/0
./Library/Python/2.7/site-packages/mercurial/pure/bdiff.py 100644 0/0
./Library/Python/2.7/site-packages/mercurial/pure/bdiff.pyc 100644 0/0
./Library/Python/2.7/site-packages/mercurial/pure/bdiff.pyo 100644 0/0
$ grep zsh/site-functions/_hg boms.txt | cut -d ' ' -f 1,2,3
./usr/local/share/zsh/site-functions/_hg 100644 0/0
$ grep hg-completion.bash boms.txt | cut -d ' ' -f 1,2,3
./usr/local/hg/contrib/hg-completion.bash 100644 0/0
$ egrep 'man[15]' boms.txt | cut -d ' ' -f 1,2,3
./usr/local/share/man/man1 40755 0/0
./usr/local/share/man/man1/chg.1 100644 0/0
./usr/local/share/man/man1/hg.1 100644 0/0
./usr/local/share/man/man5 40755 0/0
./usr/local/share/man/man5/hgignore.5 100644 0/0
./usr/local/share/man/man5/hgrc.5 100644 0/0
$ grep bser boms.txt | cut -d ' ' -f 1,2,3
./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/bser.so 100755 0/0
./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.py 100644 0/0
./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.pyc 100644 0/0
./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.pyo 100644 0/0
$ grep localrepo boms.txt | cut -d ' ' -f 1,2,3
./Library/Python/2.7/site-packages/mercurial/localrepo.py 100644 0/0
./Library/Python/2.7/site-packages/mercurial/localrepo.pyc 100644 0/0
./Library/Python/2.7/site-packages/mercurial/localrepo.pyo 100644 0/0
$ egrep 'bin/' boms.txt | cut -d ' ' -f 1,2,3
./usr/local/bin/chg 100755 0/0
./usr/local/bin/hg 100755 0/0
Make sure the built binary uses the system Python interpreter
$ bsdtar xf mercurial.pkg/Payload usr/local/bin
Use a glob to find this to avoid check-code whining about a fixed path.
$ head -n 1 usr/local/b?n/hg
#!/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Note that we're not currently installing any /etc/mercurial stuff,
including merge-tool configurations.