diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -5684,15 +5684,18 @@ def tag(ui, repo, name1, *names, **opts) date = util.parsedate(date) if opts.get('edit'): - message = ui.edit(message, ui.username()) - repo.savecommitmessage(message) + def editor(repo, ctx, subs): + return ui.edit(ctx.description() + "\n", ctx.user()) + else: + editor = False # don't allow tagging the null rev if (not opts.get('remove') and scmutil.revsingle(repo, rev_).rev() == nullrev): raise util.Abort(_("cannot tag null revision")) - repo.tag(names, r, message, opts.get('local'), opts.get('user'), date) + repo.tag(names, r, message, opts.get('local'), opts.get('user'), date, + editor=editor) finally: release(lock, wlock) diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -479,7 +479,8 @@ class localrepository(object): return hook.hook(self.ui, self, name, throw, **args) @unfilteredmethod - def _tag(self, names, node, message, local, user, date, extra={}): + def _tag(self, names, node, message, local, user, date, extra={}, + editor=False): if isinstance(names, str): names = (names,) @@ -539,14 +540,15 @@ class localrepository(object): self[None].add(['.hgtags']) m = matchmod.exact(self.root, '', ['.hgtags']) - tagnode = self.commit(message, user, date, extra=extra, match=m) + tagnode = self.commit(message, user, date, extra=extra, match=m, + editor=editor) for name in names: self.hook('tag', node=hex(node), tag=name, local=local) return tagnode - def tag(self, names, node, message, local, user, date): + def tag(self, names, node, message, local, user, date, editor=False): '''tag a revision with one or more symbolic names. names is a list of strings or, when adding a single tag, names may be a @@ -574,7 +576,7 @@ class localrepository(object): '(please commit .hgtags manually)')) self.tags() # instantiate the cache - self._tag(names, node, message, local, user, date) + self._tag(names, node, message, local, user, date, editor=editor) @filteredpropertycache def _tagscache(self): diff --git a/tests/test-tag.t b/tests/test-tag.t --- a/tests/test-tag.t +++ b/tests/test-tag.t @@ -225,8 +225,11 @@ test custom commit messages at first, test saving last-message.txt +(test that editor is not invoked before transaction starting) + $ cat > .hg/hgrc << '__EOF__' > [hooks] + > # this failure occurs before editor invocation > pretag.test-saving-lastmessage = false > __EOF__ $ rm -f .hg/last-message.txt @@ -234,12 +237,37 @@ at first, test saving last-message.txt abort: pretag.test-saving-lastmessage hook exited with status 1 [255] $ cat .hg/last-message.txt + cat: .hg/last-message.txt: No such file or directory + [1] + +(test that editor is invoked and commit message is saved into +"last-message.txt") + + $ cat >> .hg/hgrc << '__EOF__' + > [hooks] + > pretag.test-saving-lastmessage = + > # this failure occurs after editor invocation + > pretxncommit.unexpectedabort = false + > __EOF__ + + $ rm -f .hg/last-message.txt + $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg tag custom-tag -e + transaction abort! + rollback completed + note: commit message saved in .hg/last-message.txt + abort: pretxncommit.unexpectedabort hook exited with status 1 + [255] + $ cat .hg/last-message.txt custom tag message second line - $ cat > .hg/hgrc << '__EOF__' + + $ cat >> .hg/hgrc << '__EOF__' > [hooks] - > pretag.test-saving-lastmessage = + > pretxncommit.unexpectedabort = > __EOF__ + $ hg status .hgtags + M .hgtags + $ hg revert --no-backup -q .hgtags then, test custom commit message itself