Mercurial > hg > mercurial-source
changeset 10914:b7ca37b90762 stable
revlog: fix lazyparser.__iter__() to return all revisions (issue2137)
Previously, it only returned revisions that were in the revlog when it
was originally opened; revisions added since then were invisible.
This broke revlog._partialmatch() and therefore repo.lookup().
(Credit to Benoit Boissinot for simplifying my original test script
and for the actual fix.)
author | Greg Ward <greg-hg@gerg.ca> |
---|---|
date | Wed, 14 Apr 2010 15:06:40 -0400 |
parents | f2ecc5733c89 |
children | c9543bc6be16 9c84395a338e |
files | mercurial/revlog.py tests/test-issue2137 tests/test-issue2137.out |
diffstat | 3 files changed, 67 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -294,8 +294,7 @@ return key in self.p.map def __iter__(self): yield nullid - for i in xrange(self.p.l): - ret = self.p.index[i] + for i, ret in enumerate(self.p.index): if not ret: self.p.loadindex(i) ret = self.p.index[i]
new file mode 100755 --- /dev/null +++ b/tests/test-issue2137 @@ -0,0 +1,52 @@ +#!/bin/sh + +echo "% setup" + +# create a little extension that has 3 side-effects: +# 1) ensure changelog data is not inlined +# 2) make revlog to use lazyparser +# 3) test that repo.lookup() works +# 1 and 2 are preconditions for the bug; 3 is the bug. +cat > commitwrapper.py <<EOF +from mercurial import extensions, node, revlog + +def reposetup(ui, repo): + def wrapcommit(orig, *args, **kwargs): + result = orig(*args, **kwargs) + tip1 = node.short(repo.changelog.tip()) + tip2 = node.short(repo.lookup(tip1)) + assert tip1 == tip2 + ui.write('new tip: %s\n' % tip1) + return result + + extensions.wrapfunction(repo, 'commit', wrapcommit) + +def extsetup(ui): + revlog._maxinline = 128 # split out 00changelog.d early + revlog._prereadsize = 128 # use revlog.lazyparser +EOF + +cat >> $HGRCPATH <<EOF +[extensions] +commitwrapper = $PWD/commitwrapper.py +EOF + +# use a long username to make sure the changelog is bigger than 128 bytes +export HGUSER='test test test test test test test test test test test' + +hg init repo1 +cd repo1 +echo a > a +hg commit -A -m'add a with a long commit message to make the changelog a bit bigger' + +# This commit puts 00changelog.i over the 128-byte threshold to split +# out 00changelog.d, which is a precondition for reproducing the bug +# with the next commit. +echo b > b +hg commit -A -m'add b and ramble on a bit here too for the same reason' + +echo "" +echo "% test that new changesets are visible to repo.lookup()" +echo a >> a +hg commit -m'one more commit to demonstrate the bug' +hg tip
new file mode 100644 --- /dev/null +++ b/tests/test-issue2137.out @@ -0,0 +1,14 @@ +% setup +adding a +new tip: 685c8b50a4fa +adding b +new tip: 0dc3f194257e + +% test that new changesets are visible to repo.lookup() +new tip: 76721648e605 +changeset: 2:76721648e605 +tag: tip +user: test test test test test test test test test test test +date: Thu Jan 01 00:00:00 1970 +0000 +summary: one more commit to demonstrate the bug +