revset: add depth limit to descendants() (issue5374)
This is naive implementation using two-pass scanning. Tracking descendants
isn't an easy problem if both start and stop depths are specified. It's
impractical to remember all possible depths of each node while scanning from
roots to descendants because the number of depths explodes. Instead, we could
cache (min, max) depths as a good approximation and track ancestors back when
needed, but that's likely to have off-by-one bug.
Since this implementation appears not significantly slower, and is quite
straightforward, I think it's good enough for practical use cases. The time
and space complexity is O(n) ish.
revisions:
0) 1-pass scanning with (min, max)-depth cache (worst-case quadratic)
1) 2-pass scanning (this version)
repository:
mozilla-central
# descendants(0) (for reference)
*) 0.430353
# descendants(0, depth=1000)
0) 0.264889
1) 0.398289
# descendants(limit(tip:0, 1, offset=10000), depth=1000)
0) 0.025478
1) 0.029099
# descendants(0, depth=2000, startdepth=1000)
0) painfully slow (due to quadratic backtracking of ancestors)
1) 1.531138
APE=/sys/src/ape
<$APE/config
PYTHON=python
PYTHONBIN=/rc/bin
SH=ape/psh
PURE=--pure
ROOT=../..
# This is slightly underhanded; Plan 9 does not support GNU gettext nor
# does it support dynamically loaded extension modules. We work around
# this by calling build_py and build_scripts directly; this avoids
# additional platform hacks in setup.py.
build:VQ:
@{
cd $ROOT
$SH -c '$PYTHON setup.py $PURE build_py build_scripts'
}
clean:VQ:
@{
cd $ROOT
$SH -c '$PYTHON setup.py $PURE clean --all'
}
install:VQ: build
@{
cd $ROOT
$SH -c '$PYTHON setup.py $PURE install \
--install-scripts $PYTHONBIN \
--skip-build \
--force'
}
mkdir -p /lib/mercurial/hgrc.d
dircp hgrc.d /lib/mercurial/hgrc.d/
cp 9diff /rc/bin/