revlog: fix lazyparser.__iter__() to return all revisions (issue2137) stable
authorGreg Ward <greg-hg@gerg.ca>
Wed, 14 Apr 2010 15:06:40 -0400
branchstable
changeset 10914 b7ca37b90762
parent 10913 f2ecc5733c89
child 10915 c9543bc6be16
child 10916 9c84395a338e
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.)
mercurial/revlog.py
tests/test-issue2137
tests/test-issue2137.out
--- a/mercurial/revlog.py	Tue Apr 13 17:58:38 2010 -0400
+++ b/mercurial/revlog.py	Wed Apr 14 15:06:40 2010 -0400
@@ -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]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue2137	Wed Apr 14 15:06:40 2010 -0400
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue2137.out	Wed Apr 14 15:06:40 2010 -0400
@@ -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
+