cext: fix potential memory leaks of list items appended with PyList_Append
Also reduce the duplication in the tricky code that uses PyList_Append by
extracting it into a function `pylist_append_owned`.
test stripping of filelogs where the linkrev doesn't always increase
$ echo '[extensions]' >> $HGRCPATH
$ echo 'strip =' >> $HGRCPATH
$ commit()
> {
> hg up -qC null
> count=1
> for i in "$@"; do
> for f in $i; do
> mkdir -p `dirname $f`
> echo $count > $f
> done
> count=`expr $count + 1`
> done
> hg commit -qAm "$*"
> }
2 1 0 2 0 1 2
$ mkdir files
$ cd files
$ hg init orig
$ cd orig
$ commit '201 210'
$ commit '102 120' '210'
$ commit '021'
$ commit '201' '021 120'
$ commit '012 021' '102 201' '120 210'
$ commit '102 120' '012 210' '021 201'
$ commit '201 210' '021 120' '012 102'
$ cd ..
$ hg clone -q -U -r 4 -r 5 -r 6 orig crossed
$ cd crossed
$ for i in 012 021 102 120 201 210; do
> echo $i
> hg debugindex $i
> echo
> done
012
rev linkrev nodeid p1-nodeid p2-nodeid
0 0 b8e02f643373 000000000000 000000000000
1 1 5d9299349fc0 000000000000 000000000000
2 2 2661d26c6496 000000000000 000000000000
021
rev linkrev nodeid p1-nodeid p2-nodeid
0 0 b8e02f643373 000000000000 000000000000
1 2 5d9299349fc0 000000000000 000000000000
2 1 2661d26c6496 000000000000 000000000000
102
rev linkrev nodeid p1-nodeid p2-nodeid
0 1 b8e02f643373 000000000000 000000000000
1 0 5d9299349fc0 000000000000 000000000000
2 2 2661d26c6496 000000000000 000000000000
120
rev linkrev nodeid p1-nodeid p2-nodeid
0 1 b8e02f643373 000000000000 000000000000
1 2 5d9299349fc0 000000000000 000000000000
2 0 2661d26c6496 000000000000 000000000000
201
rev linkrev nodeid p1-nodeid p2-nodeid
0 2 b8e02f643373 000000000000 000000000000
1 0 5d9299349fc0 000000000000 000000000000
2 1 2661d26c6496 000000000000 000000000000
210
rev linkrev nodeid p1-nodeid p2-nodeid
0 2 b8e02f643373 000000000000 000000000000
1 1 5d9299349fc0 000000000000 000000000000
2 0 2661d26c6496 000000000000 000000000000
$ cd ..
$ for i in 0 1 2; do
> hg clone -q -U --pull crossed $i
> echo "% Trying to strip revision $i"
> hg --cwd $i strip $i
> echo "% Verifying"
> hg --cwd $i verify -q
> echo
> done
% Trying to strip revision 0
saved backup bundle to $TESTTMP/files/0/.hg/strip-backup/cbb8c2f0a2e3-239800b9-backup.hg
% Verifying
% Trying to strip revision 1
saved backup bundle to $TESTTMP/files/1/.hg/strip-backup/124ecc0cbec9-6104543f-backup.hg
% Verifying
% Trying to strip revision 2
saved backup bundle to $TESTTMP/files/2/.hg/strip-backup/f6439b304a1a-c6505a5f-backup.hg
% Verifying
$ cd ..
Do a similar test where the manifest revlog has unordered linkrevs
$ mkdir manifests
$ cd manifests
$ hg init orig
$ cd orig
$ commit 'file'
$ commit 'other'
$ commit '' 'other'
$ HGUSER=another-user; export HGUSER
$ commit 'file'
$ commit 'other' 'file'
$ cd ..
$ hg clone -q -U -r 1 -r 2 -r 3 -r 4 orig crossed
$ cd crossed
$ hg debugindex --manifest
rev linkrev nodeid p1-nodeid p2-nodeid
0 2 6bbc6fee55c2 000000000000 000000000000
1 0 1c556153fe54 000000000000 000000000000
2 1 1f76dba919fd 000000000000 000000000000
3 3 bbee06ad59d5 000000000000 000000000000
$ cd ..
$ for i in 2 3; do
> hg clone -q -U --pull crossed $i
> echo "% Trying to strip revision $i"
> hg --cwd $i strip $i
> echo "% Verifying"
> hg --cwd $i verify -q
> echo
> done
% Trying to strip revision 2
saved backup bundle to $TESTTMP/manifests/2/.hg/strip-backup/f3015ad03c03-4d98bdc2-backup.hg
% Verifying
% Trying to strip revision 3
saved backup bundle to $TESTTMP/manifests/3/.hg/strip-backup/9632aa303aa4-69192e3f-backup.hg
% Verifying
$ cd ..
Now a similar test for a non-root manifest revlog
$ cat >> $HGRCPATH <<EOF
> [experimental]
> treemanifests = yes
> EOF
$ mkdir treemanifests
$ cd treemanifests
$
$ hg --config experimental.treemanifest=True init orig
$ cd orig
$ commit 'dir/file'
$ commit 'dir/other'
$ commit '' 'dir/other'
$ HGUSER=yet-another-user; export HGUSER
$ commit 'otherdir dir/file'
$ commit 'otherdir dir/other' 'otherdir dir/file'
$ cd ..
$ hg --config experimental.treemanifest=True clone -q -U -r 1 -r 2 -r 3 -r 4 orig crossed
$ cd crossed
$ hg debugindex --dir dir
rev linkrev nodeid p1-nodeid p2-nodeid
0 2 6bbc6fee55c2 000000000000 000000000000
1 0 1c556153fe54 000000000000 000000000000
2 1 1f76dba919fd 000000000000 000000000000
3 3 bbee06ad59d5 000000000000 000000000000
$ cd ..
$ for i in 2 3; do
> hg --config experimental.treemanifest=True clone -q -U --pull crossed $i
> echo "% Trying to strip revision $i"
> hg --cwd $i strip $i
> echo "% Verifying"
> hg --cwd $i verify -q
> echo
> done
% Trying to strip revision 2
saved backup bundle to $TESTTMP/treemanifests/2/.hg/strip-backup/145f5c75f9ac-a105cfbe-backup.hg
% Verifying
% Trying to strip revision 3
saved backup bundle to $TESTTMP/treemanifests/3/.hg/strip-backup/e4e3de5c3cb2-f4c70376-backup.hg
% Verifying
$ cd ..