# HG changeset patch # User FUJIWARA Katsunori # Date 2014-05-05 12:26:40 # Node ID 213fd1a99cd9b330652d6fd28e8476f7cfe85e09 # Parent 0768cda8b5799dc803dc0ee27a832cd64e05f28a histedit: use "editor" argument of "commit()" instead of explicit "ui.edit()" Before this patch, "message" action of "hg histedit" uses "ui.edit()" explicitly to get commit message edited manually. This requires explicit "localrepository.savecommitmessage()" invocation to save edited commit message into ".hg/last-message.txt", because unexpected exception raising may abort command execution before saving it in "localrepository.commit()". This patch uses "editor" argument of "localrepository.commit()" instead of explicit "ui.edit()" invocation for "message" action of "hg histedit" "localrepository.commit()" will invoke "editor()" function newly added in this patch, and save edited commit message into ".hg/last-message.txt" automatically. diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -402,12 +402,12 @@ def message(ui, repo, ctx, ha, opts): if stats and stats[3] > 0: raise error.InterventionRequired( _('Fix up the change and run hg histedit --continue')) - message = oldctx.description() + '\n' - message = ui.edit(message, ui.username()) - repo.savecommitmessage(message) + message = oldctx.description() + def editor(repo, ctx, subs): + return ui.edit(ctx.description() + "\n", ctx.user()) commit = commitfuncfor(repo, oldctx) new = commit(text=message, user=oldctx.user(), date=oldctx.date(), - extra=oldctx.extra()) + extra=oldctx.extra(), editor=editor) newctx = repo[new] if oldctx.node() != newctx.node(): return newctx, [(oldctx.node(), (new,))] diff --git a/tests/test-histedit-edit.t b/tests/test-histedit-edit.t --- a/tests/test-histedit-edit.t +++ b/tests/test-histedit-edit.t @@ -200,8 +200,9 @@ check saving last-message.txt, at first > raise util.Abort('emulating unexpected abort') > repo.__class__ = commitfailure > EOF - $ cat > .hg/hgrc <> .hg/hgrc < [extensions] + > # this failure occurs before editor invocation > commitfailure = $TESTTMP/commitfailure.py > EOF @@ -211,6 +212,34 @@ check saving last-message.txt, at first > echo "====" > echo "check saving last-message.txt" >> \$1 > EOF + +(test that editor is not invoked before transaction starting) + + $ rm -f .hg/last-message.txt + $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit tip --commands - 2>&1 << EOF | fixbundle + > mess 1fd3b2fe7754 f + > EOF + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + abort: emulating unexpected abort + $ cat .hg/last-message.txt + cat: .hg/last-message.txt: No such file or directory + [1] + + $ cat >> .hg/hgrc < [extensions] + > commitfailure = ! + > EOF + $ hg histedit --abort -q + +(test that editor is invoked and commit message is saved into +"last-message.txt") + + $ cat >> .hg/hgrc < [hooks] + > # this failure occurs after editor invocation + > pretxncommit.unexpectedabort = false + > EOF + $ rm -f .hg/last-message.txt $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit tip --commands - 2>&1 << EOF | fixbundle > mess 1fd3b2fe7754 f @@ -219,14 +248,17 @@ check saving last-message.txt, at first ==== before editing f ==== - abort: emulating unexpected abort + transaction abort! + rollback completed + note: commit message saved in .hg/last-message.txt + abort: pretxncommit.unexpectedabort hook exited with status 1 $ cat .hg/last-message.txt f check saving last-message.txt - $ cat > .hg/hgrc < [extensions] - > commitfailure = ! + $ cat >> .hg/hgrc < [hooks] + > pretxncommit.unexpectedabort = > EOF $ hg histedit --abort -q