Mercurial > hg
view tests/test-tags @ 9151:f528d1a93491
tags: implement persistent tag caching (issue548).
- rename findglobaltags() to findglobaltags1() (so the "no cache"
implementation is still there if we need it)
- add findglobaltags2() and make findglobaltags() an alias for it
(disabling tag caching is a one-line patch)
- factor out tagcache class with methods readcache() and writecache();
the expensive part of tag finding (iterate over heads and find
.hgtags filenode) is now in tagcache.readcache()
author | Greg Ward <greg-hg@gerg.ca> |
---|---|
date | Thu, 16 Jul 2009 10:39:42 -0400 |
parents | ad72e3b08bc0 |
children | 4017291c4c48 |
line wrap: on
line source
#!/bin/sh cacheexists() { [ -f .hg/tags.cache ] && echo "tag cache exists" || echo "no tag cache" } 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 rm -f .hg/tags.cache hg identify 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