--- a/mercurial/commands.py Fri Mar 23 01:04:21 2007 -0500
+++ b/mercurial/commands.py Sat Mar 24 02:45:08 2007 -0500
@@ -2499,6 +2499,9 @@
rev_ = nullid
if not message:
message = _('Removed tag %s') % name
+ elif name in repo.tags() and not opts['force']:
+ raise util.Abort(_('a tag named %s already exists (use -f to force)')
+ % name)
if not rev_ and repo.dirstate.parents()[1] != nullid:
raise util.Abort(_('uncommitted merge - please provide a '
'specific revision'))
@@ -2962,7 +2965,8 @@
_('hg status [OPTION]... [FILE]...')),
"tag":
(tag,
- [('l', 'local', None, _('make the tag local')),
+ [('f', 'force', None, _('replace existing tag')),
+ ('l', 'local', None, _('make the tag local')),
('m', 'message', '', _('message for tag commit log entry')),
('d', 'date', '', _('record datecode as commit date')),
('u', 'user', '', _('record user as commiter')),
--- a/mercurial/localrepo.py Fri Mar 23 01:04:21 2007 -0500
+++ b/mercurial/localrepo.py Sat Mar 24 02:45:08 2007 -0500
@@ -289,10 +289,10 @@
warn(_("tag '%s' refers to unknown node") % key)
continue
- h = {}
+ h = []
if key in filetags:
n, h = filetags[key]
- h[n] = True
+ h.append(n)
filetags[key] = (bin_n, h)
for k,nh in filetags.items():
@@ -308,7 +308,7 @@
if bn != an and an in bh and \
(bn not in ah or len(bh) > len(ah)):
an = bn
- ah.update(bh)
+ ah.append([n for n in bh if n not in ah])
globaltags[k] = an, ah
# read the tags file from each head, ending with the tip
--- a/tests/test-tags Fri Mar 23 01:04:21 2007 -0500
+++ b/tests/test-tags Sat Mar 24 02:45:08 2007 -0500
@@ -74,12 +74,34 @@
echo >> foo
hg ci -m 'change foo 1' -d '1000000 0' # rev 2
hg up -C 1
-hg tag -r 1 -d '1000000 0' bar # rev 3
+hg tag -r 1 -d '1000000 0' -f bar # rev 3
hg up -C 1
echo >> foo
hg ci -m 'change foo 2' -d '1000000 0' # rev 4
hg tags
+# test tag removal
hg tag --remove -d '1000000 0' bar
hg tip
hg tags
+
+# test tag rank
+cd ..
+hg init t3
+cd t3
+echo foo > foo
+hg add foo
+hg ci -m 'add foo' -d '1000000 0' # rev 0
+hg tag -d '1000000 0' -f bar # rev 1 bar -> 0
+hg tag -d '1000000 0' -f bar # rev 2 bar -> 1
+hg tag -d '1000000 0' -fr 0 bar # rev 3 bar -> 0
+hg tag -d '1000000 0' -fr 1 bar # rev 3 bar -> 1
+hg tag -d '1000000 0' -fr 0 bar # rev 4 bar -> 0
+hg tags
+hg co 3
+echo barbar > foo
+hg ci -m 'change foo' -d '1000000 0' # rev 0
+hg tags
+
+hg tag -d '1000000 0' -r 3 bar # should complain
+hg tags
\ No newline at end of file
--- a/tests/test-tags.out Fri Mar 23 01:04:21 2007 -0500
+++ b/tests/test-tags.out Sat Mar 24 02:45:08 2007 -0500
@@ -49,3 +49,11 @@
summary: Removed tag bar
tip 5:57e1983b4a60
+tip 5:d8bb4d1eff25
+bar 0:b409d9da318e
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+tip 6:b5ff9d142648
+bar 0:b409d9da318e
+abort: a tag named bar already exists (use -f to force)
+tip 6:b5ff9d142648
+bar 0:b409d9da318e