[PATCH 1 of 1 RFC] tag: abort if not at a branch head

Adrian Buehlmann adrian at cadifra.com
Mon Dec 6 18:07:41 CST 2010


On 2010-12-06 20:56, Kevin Bullock wrote:
> # HG changeset patch
> # User Kevin Bullock <kbullock at ringworld.org>
> # Date 1291665075 21600
> # Node ID f52e752c6d5f90352bb29ba6c2543656f6e4531e
> # Parent  8c6b7a5f38c4585b1b2c2ceaffa8023f36a18479
> tag: abort if not at a branch head
> 
> 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.
> 
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -3665,16 +3665,23 @@
>  
>      Tags are used to name particular revisions of the repository and are
>      very useful to compare different revisions, to go back to significant
> -    earlier versions or to mark branch points as releases, etc.
> +    earlier versions or to mark branch points as releases, etc. Changing
> +    an existing tag is normally disallowed; use -f/--force to override.
>  
>      If no revision is given, the parent of the working directory is
>      used, or tip if no revision is checked out.
>  
>      To facilitate version control, distribution, and merging of tags,
> -    they are stored as a file named ".hgtags" which is managed
> -    similarly to other project files and can be hand-edited if
> -    necessary. The file '.hg/localtags' is used for local tags (not
> -    shared among repositories).
> +    they are stored as a file named ".hgtags" which is managed similarly
> +    to other project files and can be hand-edited if necessary. This
> +    also means that tagging creates a new commit. The file
> +    ".hg/localtags" is used for local tags (not shared among
> +    repositories).
> +
> +    Tag commits are usually made at the head of a branch. If the parent
> +    of the working directory is not a branch head, :hg:`tag` aborts; use
> +    -f/--force to force the tag commit to be based on a non-head
> +    changeset.
>  
>      See :hg:`help dates` for a list of formats valid for -d/--date.
>  
> @@ -3713,6 +3720,11 @@
>              # we don't translate commit messages
>              message = 'Removed tag %s' % ', '.join(names)
>      elif not opts.get('force'):
> +        wctx = repo[None]
> +        bheads = repo.branchheads()
> +        if bheads and not [x for x in wctx.parents()
> +                           if x.node() in bheads]:
> +            raise util.Abort(_('not at a branch head (use -f to force)'))

(1) [x for ..] looks convoluted, '... in repo.branchheads():' should
    do (compare with commit)

(2) for x in wctx.parents() looks weird, tagging a merge should give a
    nice error message. Maybe "abort: outstanding uncommitted merges"
    like we already have elsewhere -> create a separate first patch
    to fix this.

(3) Did you think about local tags?

>          for n in names:
>              if n in repo.tags():
>                  raise util.Abort(_('tag \'%s\' already exists '

Maybe this check should be done first.

> @@ -4481,7 +4493,7 @@
>           _('[OPTION]... [FILE]...')),
>      "tag":
>          (tag,
> -         [('f', 'force', None, _('replace existing tag')),
> +         [('f', 'force', None, _('force tag')),
>            ('l', 'local', None, _('make the tag local')),
>            ('r', 'rev', '',
>             _('revision to tag'), _('REV')),
> diff --git a/tests/test-tag.t b/tests/test-tag.t
> --- a/tests/test-tag.t
> +++ b/tests/test-tag.t
> @@ -81,6 +81,9 @@
>    $ hg update 0
>    0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>    $ hg tag "foobar"
> +  abort: not at a branch head (use -f to force)
> +  [255]
> +  $ hg tag -f "foobar"
>    $ cat .hgtags
>    acb14030fe0a21b60322c440ad2d20cf7685a376 foobar
>    $ cat .hg/localtags
> @@ -196,3 +199,18 @@
>    $ hg log -l1 --template "{desc}\n"
>    custom tag message
>    second line
> +
> +
> +tagging when at named-branch-head that's not a topo-head
> +
> +  $ hg parents -q
> +  11:7d32ded1f932
> +  $ hg up default
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg merge -t internal:local
> +  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
> +  (branch merge, don't forget to commit)
> +  $ hg ci -m 'merge named branch'
> +  $ hg up 11
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg tag new-topo-head


More information about the Mercurial-devel mailing list