comparison mercurial/commands.py @ 13135:1c1ca9d393f4 stable

tag: abort if not at a branch head (issue2552) Since it's usually only desirable to make tag commits on top of branch heads, abort if the working dir parent is not a branch head. -f/--force may be passed to commit at a non-head anyway. Does not abort if working dir parent is a named branch head but not a topological head.
author Kevin Bullock <kbullock@ringworld.org>
date Mon, 06 Dec 2010 22:04:10 -0600
parents ea3c93b53fdb
children 6320101a638c 827a1cc127bf
comparison
equal deleted inserted replaced
13134:ea3c93b53fdb 13135:1c1ca9d393f4
3658 3658
3659 Name a particular revision using <name>. 3659 Name a particular revision using <name>.
3660 3660
3661 Tags are used to name particular revisions of the repository and are 3661 Tags are used to name particular revisions of the repository and are
3662 very useful to compare different revisions, to go back to significant 3662 very useful to compare different revisions, to go back to significant
3663 earlier versions or to mark branch points as releases, etc. 3663 earlier versions or to mark branch points as releases, etc. Changing
3664 an existing tag is normally disallowed; use -f/--force to override.
3664 3665
3665 If no revision is given, the parent of the working directory is 3666 If no revision is given, the parent of the working directory is
3666 used, or tip if no revision is checked out. 3667 used, or tip if no revision is checked out.
3667 3668
3668 To facilitate version control, distribution, and merging of tags, 3669 To facilitate version control, distribution, and merging of tags,
3669 they are stored as a file named ".hgtags" which is managed 3670 they are stored as a file named ".hgtags" which is managed similarly
3670 similarly to other project files and can be hand-edited if 3671 to other project files and can be hand-edited if necessary. This
3671 necessary. The file '.hg/localtags' is used for local tags (not 3672 also means that tagging creates a new commit. The file
3672 shared among repositories). 3673 ".hg/localtags" is used for local tags (not shared among
3674 repositories).
3675
3676 Tag commits are usually made at the head of a branch. If the parent
3677 of the working directory is not a branch head, :hg:`tag` aborts; use
3678 -f/--force to force the tag commit to be based on a non-head
3679 changeset.
3673 3680
3674 See :hg:`help dates` for a list of formats valid for -d/--date. 3681 See :hg:`help dates` for a list of formats valid for -d/--date.
3675 3682
3676 Since tag names have priority over branch names during revision 3683 Since tag names have priority over branch names during revision
3677 lookup, using an existing branch name as a tag name is discouraged. 3684 lookup, using an existing branch name as a tag name is discouraged.
3710 elif not opts.get('force'): 3717 elif not opts.get('force'):
3711 for n in names: 3718 for n in names:
3712 if n in repo.tags(): 3719 if n in repo.tags():
3713 raise util.Abort(_('tag \'%s\' already exists ' 3720 raise util.Abort(_('tag \'%s\' already exists '
3714 '(use -f to force)') % n) 3721 '(use -f to force)') % n)
3715 if not opts.get('local') and repo.dirstate.parents()[1] != nullid: 3722 if not opts.get('local'):
3716 raise util.Abort(_('uncommitted merge')) 3723 p1, p2 = repo.dirstate.parents()
3724 if p2 != nullid:
3725 raise util.Abort(_('uncommitted merge'))
3726 bheads = repo.branchheads()
3727 if not opts.get('force') and bheads and p1 not in bheads:
3728 raise util.Abort(_('not at a branch head (use -f to force)'))
3717 r = repo[rev_].node() 3729 r = repo[rev_].node()
3718 3730
3719 if not message: 3731 if not message:
3720 # we don't translate commit messages 3732 # we don't translate commit messages
3721 message = ('Added tag %s for changeset %s' % 3733 message = ('Added tag %s for changeset %s' %
4473 _('list the changed files of a revision'), _('REV')), 4485 _('list the changed files of a revision'), _('REV')),
4474 ] + walkopts + subrepoopts, 4486 ] + walkopts + subrepoopts,
4475 _('[OPTION]... [FILE]...')), 4487 _('[OPTION]... [FILE]...')),
4476 "tag": 4488 "tag":
4477 (tag, 4489 (tag,
4478 [('f', 'force', None, _('replace existing tag')), 4490 [('f', 'force', None, _('force tag')),
4479 ('l', 'local', None, _('make the tag local')), 4491 ('l', 'local', None, _('make the tag local')),
4480 ('r', 'rev', '', 4492 ('r', 'rev', '',
4481 _('revision to tag'), _('REV')), 4493 _('revision to tag'), _('REV')),
4482 ('', 'remove', None, _('remove a tag')), 4494 ('', 'remove', None, _('remove a tag')),
4483 # -l/--local is already there, commitopts cannot be used 4495 # -l/--local is already there, commitopts cannot be used