index parser: fix refcounting in case of errors, refactor
due to incorrect refcounting, on a bad revlog it was failing with:
*** glibc detected *** /usr/bin/python: corrupted double-linked list: 0x0816d318 ***
and a backtrace.
#!/bin/sh
hg init
echo a > a
hg add a
hg commit -m "test" -d "1000000 0"
hg history
hg tag -d "1000000 0" "bleah"
hg history
echo foo >> .hgtags
hg tag -d "1000000 0" "bleah2" || echo "failed"
hg revert .hgtags
hg tag -d "1000000 0" -r 0 x y z y y z || echo "failed"
hg tag -d "1000000 0" tap nada dot tip null . || echo "failed"
hg tag -d "1000000 0" "bleah" || echo "failed"
hg tag -d "1000000 0" "blecch" "bleah" || echo "failed"
hg tag -d "1000000 0" --remove "blecch" || echo "failed"
hg tag -d "1000000 0" --remove "bleah" "blecch" "blough" || echo "failed"
hg tag -d "1000000 0" -r 0 "bleah0"
hg tag -l -d "1000000 0" -r 1 "bleah1"
hg tag -d "1000000 0" gack gawk gorp
hg tag -d "1000000 0" -f gack
hg tag -d "1000000 0" --remove gack gorp
cat .hgtags
cat .hg/localtags
hg update 0
hg tag -d "1000000 0" "foobar"
cat .hgtags
cat .hg/localtags
hg tag -l 'xx
newline'
hg tag -l 'xx:xx'
echo % issue 601
python << EOF
f = file('.hg/localtags'); last = f.readlines()[-1][:-1]; f.close()
f = file('.hg/localtags', 'w'); f.write(last); f.close()
EOF
cat .hg/localtags
hg tag -l localnewline
cat .hg/localtags
python << EOF
f = file('.hgtags'); last = f.readlines()[-1][:-1]; f.close()
f = file('.hgtags', 'w'); f.write(last); f.close()
EOF
hg ci -d '1000000 0' -m'broken manual edit of .hgtags'
cat .hgtags
hg tag -d '1000000 0' newline
cat .hgtags