diff options
Diffstat (limited to 'tests/test-tags.t')
-rw-r--r-- | tests/test-tags.t | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/tests/test-tags.t b/tests/test-tags.t new file mode 100644 index 0000000..557c076 --- /dev/null +++ b/tests/test-tags.t @@ -0,0 +1,384 @@ +Helper functions: + + $ cacheexists() { + > [ -f .hg/cache/tags ] && echo "tag cache exists" || echo "no tag cache" + > } + + $ dumptags() { + > rev=$1 + > echo "rev $rev: .hgtags:" + > hg cat -r$rev .hgtags + > } + +# 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. + +Setup: + + $ hg init t + $ cd t + $ cacheexists + no tag cache + $ hg id + 000000000000 tip + $ cacheexists + no tag cache + $ echo a > a + $ hg add a + $ hg commit -m "test" + $ hg co + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg identify + acb14030fe0a tip + $ cacheexists + tag cache exists + +Try corrupting the cache + + $ printf 'a b' > .hg/cache/tags + $ hg identify + .hg/cache/tags is corrupt, rebuilding it + acb14030fe0a tip + $ cacheexists + tag cache exists + $ hg identify + acb14030fe0a tip + +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 + tip 0:acb14030fe0a + This is a local tag with a really long name! 0:acb14030fe0a + $ rm .hg/localtags + +Create a tag behind hg's back: + + $ echo "$T first" > .hgtags + $ cat .hgtags + acb14030fe0a21b60322c440ad2d20cf7685a376 first + $ hg add .hgtags + $ hg commit -m "add tags" + $ hg tags + tip 1:b9154636be93 + first 0:acb14030fe0a + $ hg identify + b9154636be93 tip + +Repeat with cold tag cache: + + $ rm -f .hg/cache/tags + $ hg identify + b9154636be93 tip + +And again, but now unable to write tag cache: + +#if unix-permissions + $ rm -f .hg/cache/tags + $ chmod 555 .hg + $ hg identify + b9154636be93 tip + $ chmod 755 .hg +#endif + +Create a branch: + + $ echo bb > a + $ hg status + M a + $ hg identify + b9154636be93+ tip + $ hg co first + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg id + acb14030fe0a+ first + $ hg -v id + acb14030fe0a+ first + $ hg status + M a + $ echo 1 > b + $ hg add b + $ hg commit -m "branch" + created new head + $ hg id + c8edf04160c7 tip + +Merge the two heads: + + $ hg merge 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg id + c8edf04160c7+b9154636be93+ tip + $ hg status + M .hgtags + $ hg commit -m "merge" + +Create a 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 + tip 6:35ff301afafe + first 0:acb14030fe0a + +Add invalid tags: + + $ echo "spam" >> .hgtags + $ echo >> .hgtags + $ echo "foo bar" >> .hgtags + $ echo "a5a5 invalid" >> .hg/localtags + $ cat .hgtags + acb14030fe0a21b60322c440ad2d20cf7685a376 first + spam + + foo bar + $ hg commit -m "tags" + +Report tag parse error on other head: + + $ hg up 3 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo 'x y' >> .hgtags + $ hg commit -m "head" + created new head + + $ hg tags + .hgtags@75d9f02dfe28, line 2: cannot parse entry + .hgtags@75d9f02dfe28, line 4: node 'foo' is not well formed + .hgtags@c4be69a18c11, line 2: node 'x' is not well formed + tip 8:c4be69a18c11 + first 0:acb14030fe0a + $ hg tip + changeset: 8:c4be69a18c11 + tag: tip + parent: 3:ac5e980c4dc0 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: head + + +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 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg tag -r 1 -f bar # rev 3 + $ hg up -C 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo >> foo + $ hg ci -m 'change foo 2' # rev 4 + created new head + $ hg tags + tip 4:0c192d7d5e6b + bar 1:78391a272241 + +Repeat in case of cache effects: + + $ hg tags + tip 4:0c192d7d5e6b + bar 1:78391a272241 + +Detailed dump of tag info: + + $ hg heads -q # expect 4, 3, 2 + 4:0c192d7d5e6b + 3:6fa450212aeb + 2:7a94127795a3 + $ dumptags 2 + rev 2: .hgtags: + bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar + $ dumptags 3 + rev 3: .hgtags: + bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar + bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar + 78391a272241d70354aa14c874552cad6b51bb42 bar + $ dumptags 4 + rev 4: .hgtags: + bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar + +Dump cache: + + $ cat .hg/cache/tags + 4 0c192d7d5e6b78a714de54a2e9627952a877e25a 0c04f2a8af31de17fab7422878ee5a2dadbc943d + 3 6fa450212aeb2a21ed616a54aea39a4a27894cd7 7d3b718c964ef37b89e550ebdafd5789e76ce1b0 + 2 7a94127795a33c10a370c93f731fd9fea0b79af6 0c04f2a8af31de17fab7422878ee5a2dadbc943d + + 78391a272241d70354aa14c874552cad6b51bb42 bar + +Test tag removal: + + $ hg tag --remove bar # rev 5 + $ hg tip -vp + changeset: 5:5f6e8655b1c7 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + files: .hgtags + description: + Removed tag bar + + + diff -r 0c192d7d5e6b -r 5f6e8655b1c7 .hgtags + --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000 + +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,3 @@ + bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar + +78391a272241d70354aa14c874552cad6b51bb42 bar + +0000000000000000000000000000000000000000 bar + + $ hg tags + tip 5:5f6e8655b1c7 + $ hg tags # again, try to expose cache bugs + tip 5:5f6e8655b1c7 + +Remove nonexistent tag: + + $ hg tag --remove foobar + abort: tag 'foobar' does not exist + [255] + $ hg tip + changeset: 5:5f6e8655b1c7 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: Removed tag bar + + +Undo a tag with rollback: + + $ hg rollback # destroy rev 5 (restore bar) + repository tip rolled back to revision 4 (undo commit) + working directory now based on revision 4 + $ hg tags + tip 4:0c192d7d5e6b + bar 1:78391a272241 + $ hg tags + tip 4:0c192d7d5e6b + bar 1:78391a272241 + +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 + tip 5:85f05169d91d + bar 0:bbd179dfa0a7 + $ hg co 3 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo barbar > foo + $ hg ci -m 'change foo' # rev 6 + created new head + $ hg tags + tip 6:735c3ca72986 + bar 0:bbd179dfa0a7 + +Don't allow moving tag without -f: + + $ hg tag -r 3 bar + abort: tag 'bar' already exists (use -f to force) + [255] + $ hg tags + tip 6:735c3ca72986 + bar 0:bbd179dfa0a7 + +Strip 1: expose an old head: + + $ hg --config extensions.mq= strip 5 + saved backup bundle to $TESTTMP/t3/.hg/strip-backup/*-backup.hg (glob) + $ hg tags # partly stale cache + tip 5:735c3ca72986 + bar 1:78391a272241 + $ hg tags # up-to-date cache + tip 5:735c3ca72986 + bar 1:78391a272241 + +Strip 2: destroy whole branch, no old head exposed + + $ hg --config extensions.mq= strip 4 + saved backup bundle to $TESTTMP/t3/.hg/strip-backup/*-backup.hg (glob) + $ hg tags # partly stale + tip 4:735c3ca72986 + bar 0:bbd179dfa0a7 + $ rm -f .hg/cache/tags + $ hg tags # cold cache + tip 4:735c3ca72986 + bar 0:bbd179dfa0a7 + +Test tag rank with 3 heads: + + $ cd .. + $ hg init t4 + $ cd t4 + $ echo foo > foo + $ hg add + adding foo + $ 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 + tip 3:197c21bbbf2c + bar 2:6fa450212aeb + $ hg up -qC 0 + $ hg tag -m 'retag rev 0' -fr 0 bar # rev 4 bar -> 0, but bar stays at 2 + +Bar should still point to rev 2: + + $ hg tags + tip 4:3b4b14ed0202 + bar 2:6fa450212aeb + +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 + adding foo + $ hg ci -m 'add foo' # rev 0 + + $ hg tag -r 0 -l localtag + $ hg tag --remove localtag + abort: tag 'localtag' is not a global tag + [255] + $ + $ hg tag -r 0 globaltag + $ hg tag --remove -l globaltag + abort: tag 'globaltag' is not a local tag + [255] + $ hg tags -v + tip 1:a0b6fe111088 + localtag 0:bbd179dfa0a7 local + globaltag 0:bbd179dfa0a7 + + $ cd .. |