diff --git a/hgext/fetch.py b/hgext/fetch.py --- a/hgext/fetch.py +++ b/hgext/fetch.py @@ -124,10 +124,11 @@ def fetch(ui, repo, source='default', ** message = (cmdutil.logmessage(opts) or (_('Automated merge with %s') % url.removeauth(other.url()))) - force_editor = opts.get('force_editor') or opts.get('edit') - n = repo.commit(mod + add + rem, message, - opts['user'], opts['date'], force=True, - force_editor=force_editor) + editor = cmdutil.commiteditor + if opts.get('force_editor') or opts.get('edit'): + editor = cmdutil.commitforceeditor + n = repo.commit(mod + add + rem, message, opts['user'], + opts['date'], force=True, editor=editor) ui.status(_('new changeset %d:%s merges remote changes ' 'with local\n') % (repo.changelog.rev(n), short(n))) diff --git a/hgext/keyword.py b/hgext/keyword.py --- a/hgext/keyword.py +++ b/hgext/keyword.py @@ -450,8 +450,7 @@ def reposetup(ui, repo): return kwt.wread(filename, data) def commit(self, files=None, text='', user=None, date=None, - match=None, force=False, force_editor=False, - extra={}, empty_ok=False): + match=None, force=False, editor=None, extra={}): wlock = lock = None _p1 = _p2 = None try: @@ -473,8 +472,7 @@ def reposetup(ui, repo): _p2 = hex(_p2) n = super(kwrepo, self).commit(files, text, user, date, match, - force, force_editor, - extra, empty_ok) + force, editor, extra) # restore commit hooks for name, cmd in commithooks.iteritems(): diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -1221,3 +1221,40 @@ def commit(ui, repo, commitfunc, pats, o return commitfunc(ui, repo, message, m, opts) except ValueError, inst: raise util.Abort(str(inst)) + +def commiteditor(repo, ctx, added, updated, removed): + if ctx.description(): + return ctx.description() + return commitforceeditor(repo, ctx, added, updated, removed) + +def commitforceeditor(repo, ctx, added, updated, removed): + edittext = [] + if ctx.description(): + edittext.append(ctx.description()) + edittext.append("") + edittext.append("") # Empty line between message and comments. + edittext.append(_("HG: Enter commit message." + " Lines beginning with 'HG:' are removed.")) + edittext.append("HG: --") + edittext.append(_("HG: user: %s") % ctx.user()) + if ctx.p2(): + edittext.append(_("HG: branch merge")) + if ctx.branch(): + edittext.append(_("HG: branch '%s'") + % encoding.tolocal(ctx.branch())) + edittext.extend([_("HG: added %s") % f for f in added]) + edittext.extend([_("HG: changed %s") % f for f in updated]) + edittext.extend([_("HG: removed %s") % f for f in removed]) + if not added and not updated and not removed: + edittext.append(_("HG: no files changed")) + edittext.append("") + # run editor in the repository root + olddir = os.getcwd() + os.chdir(repo.root) + text = repo.ui.edit("\n".join(edittext), ctx.user()) + os.chdir(olddir) + + if not text.strip(): + raise util.Abort(_("empty commit message")) + + return text diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -642,10 +642,13 @@ def commit(ui, repo, *pats, **opts): extra = {} if opts.get('close_branch'): extra['close'] = 1 + e = cmdutil.commiteditor + if opts.get('force_editor'): + e = cmdutil.commitforceeditor + def commitfunc(ui, repo, message, match, opts): return repo.commit(match.files(), message, opts.get('user'), - opts.get('date'), match, force_editor=opts.get('force_editor'), - extra=extra) + opts.get('date'), match, editor=e, extra=extra) node = cmdutil.commit(ui, repo, commitfunc, pats, opts) if not node: @@ -1741,7 +1744,8 @@ def import_(ui, repo, patch1, *patches, files = patch.updatedir(ui, repo, files, similarity=sim/100.) if not opts.get('no_commit'): n = repo.commit(files, message, opts.get('user') or user, - opts.get('date') or date) + opts.get('date') or date, + editor=cmdutil.commiteditor) if opts.get('exact'): if hex(n) != nodeid: repo.rollback() diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -768,7 +768,7 @@ class localrepository(repo.repository): return fparent1 def commit(self, files=None, text="", user=None, date=None, match=None, - force=False, force_editor=False, extra={}, empty_ok=False): + force=False, editor=False, extra={}): wlock = lock = None if extra.get("close"): force = True @@ -811,7 +811,7 @@ class localrepository(repo.repository): "(see hg resolve)")) wctx = context.workingctx(self, (p1, p2), text, user, date, extra, changes) - r = self._commitctx(wctx, force, force_editor, empty_ok, True) + r = self._commitctx(wctx, force, editor, True) ms.reset() return r @@ -824,11 +824,9 @@ class localrepository(repo.repository): Revision information is passed in the context.memctx argument. commitctx() does not touch the working directory. """ - return self._commitctx(ctx, force=True, force_editor=False, - empty_ok=True, working=False) + return self._commitctx(ctx, force=True, editor=None, working=False) - def _commitctx(self, ctx, force=False, force_editor=False, empty_ok=False, - working=True): + def _commitctx(self, ctx, force=False, editor=None, working=True): lock = self.lock() tr = None valid = 0 # don't save the dirstate if this isn't set @@ -895,39 +893,12 @@ class localrepository(repo.repository): mn = self.manifest.add(m1, trp, linkrev, c1[0], c2[0], (new, removed1)) - # add changeset - if (not empty_ok and not text) or force_editor: - edittext = [] - if text: - edittext.append(text) - edittext.append("") - edittext.append("") # Empty line between message and comments. - edittext.append(_("HG: Enter commit message." - " Lines beginning with 'HG:' are removed.")) - edittext.append("HG: --") - edittext.append(_("HG: user: %s") % user) - if p2 != nullid: - edittext.append(_("HG: branch merge")) - if branchname: - edittext.append(_("HG: branch '%s'") - % encoding.tolocal(branchname)) - edittext.extend([_("HG: added %s") % f for f in added]) - edittext.extend([_("HG: changed %s") % f for f in updated]) - edittext.extend([_("HG: removed %s") % f for f in removed]) - if not added and not updated and not removed: - edittext.append(_("HG: no files changed")) - edittext.append("") - # run editor in the repository root - olddir = os.getcwd() - os.chdir(self.root) - text = self.ui.edit("\n".join(edittext), user) - os.chdir(olddir) + if editor: + text = editor(self, ctx, added, updated, removed) lines = [line.rstrip() for line in text.rstrip().splitlines()] while lines and not lines[0]: del lines[0] - if not lines and working: - raise util.Abort(_("empty commit message")) text = '\n'.join(lines) self.changelog.delayupdate()