##// END OF EJS Templates
tags: don't crash if unable to write tag cache...
tags: don't crash if unable to write tag cache This happens with hgweb in real life, if the httpd user is unable to write in the repository directory. Another case is doing 'hg incoming' on a repository in the filesystem owned by someone else.

File last commit:

r9366:9ff178e7 default
r9366:9ff178e7 default
Show More
test-tags
214 lines | 4.2 KiB | text/plain | TextLexer
#!/bin/sh
cacheexists() {
[ -f .hg/tags.cache ] && echo "tag cache exists" || echo "no tag cache"
}
# XXX need to test that the tag cache works when we strip an old head
# and add a new one rooted off non-tip: i.e. node and rev of tip are the
# same, but stuff has changed behind tip.
echo "% setup"
mkdir t
cd t
hg init
cacheexists
hg id
cacheexists
echo a > a
hg add a
hg commit -m "test"
hg co
hg identify
cacheexists
echo "% create local tag with long name"
T=`hg identify --debug --id`
hg tag -l "This is a local tag with a really long name!"
hg tags
rm .hg/localtags
echo "% create a tag behind hg's back"
echo "$T first" > .hgtags
cat .hgtags
hg add .hgtags
hg commit -m "add tags"
hg tags
hg identify
# repeat with cold tag cache
echo "% identify with cold cache"
rm -f .hg/tags.cache
hg identify
# and again, but now unable to write tag cache
echo "% identify with unwritable cache"
rm -f .hg/tags.cache
chmod 555 .hg
hg identify
chmod 755 .hg
echo "% create a branch"
echo bb > a
hg status
hg identify
hg co first
hg id
hg -v id
hg status
echo 1 > b
hg add b
hg commit -m "branch"
hg id
echo "% merge the two heads"
hg merge 1
hg id
hg status
hg commit -m "merge"
echo "% create fake head, make sure tag not visible afterwards"
cp .hgtags tags
hg tag last
hg rm .hgtags
hg commit -m "remove"
mv tags .hgtags
hg add .hgtags
hg commit -m "readd"
hg tags
echo "% add invalid tags"
echo "spam" >> .hgtags
echo >> .hgtags
echo "foo bar" >> .hgtags
echo "$T invalid" | sed "s/..../a5a5/" >> .hg/localtags
echo "committing .hgtags:"
cat .hgtags
hg commit -m "tags"
echo "% report tag parse error on other head"
hg up 3
echo 'x y' >> .hgtags
hg commit -m "head"
hg tags
hg tip
echo "% test tag precedence rules"
cd ..
hg init t2
cd t2
echo foo > foo
hg add foo
hg ci -m 'add foo' # rev 0
hg tag bar # rev 1
echo >> foo
hg ci -m 'change foo 1' # rev 2
hg up -C 1
hg tag -r 1 -f bar # rev 3
hg up -C 1
echo >> foo
hg ci -m 'change foo 2' # rev 4
hg tags
hg tags # repeat in case of cache effects
dumptags() {
rev=$1
echo "rev $rev: .hgtags:"
hg cat -r$rev .hgtags
}
echo "% detailed dump of tag info"
echo "heads:"
hg heads -q # expect 4, 3, 2
dumptags 2
dumptags 3
dumptags 4
echo ".hg/tags.cache:"
[ -f .hg/tags.cache ] && cat .hg/tags.cache || echo "no such file"
echo "% test tag removal"
hg tag --remove bar # rev 5
hg tip -vp
hg tags
hg tags # again, try to expose cache bugs
echo '% remove nonexistent tag'
hg tag --remove foobar
hg tip
echo "% rollback undoes tag operation"
hg rollback # destroy rev 5 (restore bar)
hg tags
hg tags
echo "% test tag rank"
cd ..
hg init t3
cd t3
echo foo > foo
hg add foo
hg ci -m 'add foo' # rev 0
hg tag -f bar # rev 1 bar -> 0
hg tag -f bar # rev 2 bar -> 1
hg tag -fr 0 bar # rev 3 bar -> 0
hg tag -fr 1 bar # rev 4 bar -> 1
hg tag -fr 0 bar # rev 5 bar -> 0
hg tags
hg co 3
echo barbar > foo
hg ci -m 'change foo' # rev 6
hg tags
echo "% don't allow moving tag without -f"
hg tag -r 3 bar
hg tags
echo "% strip 1: expose an old head"
hg --config extensions.mq= strip 5 > /dev/null 2>&1
hg tags # partly stale cache
hg tags # up-to-date cache
echo "% strip 2: destroy whole branch, no old head exposed"
hg --config extensions.mq= strip 4 > /dev/null 2>&1
hg tags # partly stale
rm -f .hg/tags.cache
hg tags # cold cache
echo "% test tag rank with 3 heads"
cd ..
hg init t4
cd t4
echo foo > foo
hg add
hg ci -m 'add foo' # rev 0
hg tag bar # rev 1 bar -> 0
hg tag -f bar # rev 2 bar -> 1
hg up -qC 0
hg tag -fr 2 bar # rev 3 bar -> 2
hg tags
hg up -qC 0
hg tag -m 'retag rev 0' -fr 0 bar # rev 4 bar -> 0, but bar stays at 2
echo "% bar should still point to rev 2"
hg tags
echo "% remove local as global and global as local"
# test that removing global/local tags does not get confused when trying
# to remove a tag of type X which actually only exists as a type Y
cd ..
hg init t5
cd t5
echo foo > foo
hg add
hg ci -m 'add foo' # rev 0
hg tag -r 0 -l localtag
hg tag --remove localtag
hg tag -r 0 globaltag
hg tag --remove -l globaltag
hg tags -v
exit 0