view tests/test-tags @ 10301:56b50194617f

templates: rename `Last change' column in hgwebdir repository list. This patch changes column headers in the templates that previously said `Last change' to `Last modified'. Neither code nor functionality are changed other than that. For some time now, I have been annoyed by the fact the `Last change' column didn't list the age of the youngest changeset in the repository, or at least tip. It just occurred to me that this is because the wording is slightly misleading; what the column in fact lists is when the repository was last *modified*, that is, when changesets was last added or removed from it. The word `change' can be understood as referring to the changeset itself. Using `changed' would be ever so slightly less amigous. However, the standard nomenclature in this case is `modification date' and `Last modified', which is incidentally entirely unambigous. Hence, `Last modified' is the wording used.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Sun, 24 Jan 2010 20:51:53 +0100
parents 9ff178e7b627
children
line wrap: on
line source

#!/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