tests/test-issue660
author Nicolas Dumazet <nicdumz.commits@gmail.com>
Sat, 03 Jul 2010 18:11:15 +0900
changeset 11608 183e63112698
parent 11551 4484a7b661f2
permissions -rwxr-xr-x
log: remove increasing windows usage in fastpath The purpose of increasing windows is to allow backwards iteration on the filelog at a reasonable cost. But is it needed? - if follow is False, we have no reason to iterate backwards. We basically just want to walk the complete filelog and yield all revisions within the revision range. We can do this forward or backwards, as it only reads the index. - when follow is True, we need to examine the contents of the filelog, and to do this efficiently we need to read the filelog forward. And on the other hand, to track ancestors and copies, we need to process revisions backwards. But is it necessary to use increasing windows for this? We can iterate over the complete filelog forward, stack the revisions, and read the reversed(pile), it does the same thing with a more readable code.

#!/bin/sh
# http://mercurial.selenic.com/bts/issue660


hg init a
cd a
echo a > a
mkdir b
echo b > b/b
hg commit -A -m "a is file, b is dir"

echo % file replaced with directory

rm a
mkdir a
echo a > a/a

echo % should fail - would corrupt dirstate
hg add a/a

echo % removing shadow
hg rm --after a

echo % should succeed - shadow removed
hg add a/a

echo % directory replaced with file

rm -r b
echo b > b

echo % should fail - would corrupt dirstate
hg add b

echo % removing shadow
hg rm --after b/b

echo % should succeed - shadow removed
hg add b

echo % look what we got
hg st

echo % revert reintroducing shadow - should fail
rm -r a b
hg revert b/b

echo % revert all - should succeed
hg revert --all
hg st

echo % addremove

rm -r a b
mkdir a
echo a > a/a
echo b > b

hg addremove -s 0
hg st

echo % commit
hg ci -A -m "a is dir, b is file"
hg st --all

echo % long directory replaced with file

mkdir d
mkdir d/d
echo d > d/d/d
hg commit -A -m "d is long directory"
rm -r d
echo d > d

echo % should fail - would corrupt dirstate
hg add d

echo % removing shadow
hg rm --after d/d/d

echo % should succeed - shadow removed
hg add d
hg ci -md

echo % update should work at least with clean workdir

rm -r a b d
hg up -r 0
hg st --all
rm -r a b
hg up -r 1
hg st --all

exit 0