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.
--- a/hgext/histedit.py Tue Apr 29 12:54:01 2014 +0900
+++ b/hgext/histedit.py Mon May 05 21:26:40 2014 +0900
@@ -402,12 +402,12 @@
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,))]
--- a/tests/test-histedit-edit.t Tue Apr 29 12:54:01 2014 +0900
+++ b/tests/test-histedit-edit.t Mon May 05 21:26:40 2014 +0900
@@ -200,8 +200,9 @@
> raise util.Abort('emulating unexpected abort')
> repo.__class__ = commitfailure
> EOF
- $ cat > .hg/hgrc <<EOF
+ $ cat >> .hg/hgrc <<EOF
> [extensions]
+ > # this failure occurs before editor invocation
> commitfailure = $TESTTMP/commitfailure.py
> EOF
@@ -211,6 +212,34 @@
> 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 <<EOF
+ > [extensions]
+ > commitfailure = !
+ > EOF
+ $ hg histedit --abort -q
+
+(test that editor is invoked and commit message is saved into
+"last-message.txt")
+
+ $ cat >> .hg/hgrc <<EOF
+ > [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 @@
==== 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 <<EOF
- > [extensions]
- > commitfailure = !
+ $ cat >> .hg/hgrc <<EOF
+ > [hooks]
+ > pretxncommit.unexpectedabort =
> EOF
$ hg histedit --abort -q