# HG changeset patch # User Matt Mackall # Date 1174722308 18000 # Node ID f38f90a177dc41db48aa0babb1469772366f839a # Parent 94bb953b43e501ddc467613b33485b9e9d4000c4# Parent 8185a1ca86287807ce55a149551396caf7bf3b6a Merge with -stable diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2499,6 +2499,9 @@ def tag(ui, repo, name, rev_=None, **opt 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 @@ table = { _('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')), diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -289,10 +289,10 @@ class localrepository(repo.repository): 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 @@ class localrepository(repo.repository): 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 diff --git a/tests/test-tags b/tests/test-tags --- a/tests/test-tags +++ b/tests/test-tags @@ -74,12 +74,34 @@ hg tag -d '1000000 0' bar # 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 diff --git a/tests/test-tags.out b/tests/test-tags.out --- a/tests/test-tags.out +++ b/tests/test-tags.out @@ -49,3 +49,11 @@ date: Mon Jan 12 13:46:40 1970 +0 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