--- a/hgext/histedit.py Sat Mar 15 15:44:51 2014 +0100
+++ b/hgext/histedit.py Tue Mar 18 14:25:28 2014 -0500
@@ -299,6 +299,7 @@
date=date,
extra=extra)
new._text = cmdutil.commitforceeditor(repo, new, [])
+ repo.savecommitmessage(new.description())
return repo.commitctx(new)
def pick(ui, repo, ctx, ha, opts):
--- a/hgext/mq.py Sat Mar 15 15:44:51 2014 +0100
+++ b/hgext/mq.py Tue Mar 18 14:25:28 2014 -0500
@@ -1083,6 +1083,7 @@
p.write("# Date %s %s\n\n" % date)
if util.safehasattr(msg, '__call__'):
msg = msg()
+ repo.savecommitmessage(msg)
commitmsg = msg and msg or ("[mq]: %s" % patchfn)
n = newcommit(repo, None, commitmsg, user, date, match=match,
force=True)
@@ -2577,6 +2578,7 @@
if opts.get('edit'):
message = ui.edit(message, user or ui.username())
+ repo.savecommitmessage(message)
diffopts = q.patchopts(q.diffopts(), *patches)
wlock = repo.wlock()
--- a/hgext/rebase.py Sat Mar 15 15:44:51 2014 +0100
+++ b/hgext/rebase.py Tue Mar 18 14:25:28 2014 -0500
@@ -369,7 +369,7 @@
for rebased in state:
if rebased not in skipped and state[rebased] > nullmerge:
commitmsg += '\n* %s' % repo[rebased].description()
- commitmsg = ui.edit(commitmsg, repo.ui.username())
+ editor = cmdutil.commitforceeditor
newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
extrafn=extrafn, editor=editor)
for oldrev in state.iterkeys():
--- a/mercurial/cmdutil.py Sat Mar 15 15:44:51 2014 +0100
+++ b/mercurial/cmdutil.py Tue Mar 18 14:25:28 2014 -0500
@@ -1962,6 +1962,7 @@
extra=extra)
if editmsg:
new._text = commitforceeditor(repo, new, [])
+ repo.savecommitmessage(new.description())
newdesc = changelog.stripdesc(new.description())
if ((not node)
--- a/mercurial/commands.py Sat Mar 15 15:44:51 2014 +0100
+++ b/mercurial/commands.py Tue Mar 18 14:25:28 2014 -0500
@@ -1437,11 +1437,14 @@
try:
if opts.get('secret'):
ui.setconfig('phases', 'new-commit', 'secret')
+ # Propagate to subrepos
+ repo.baseui.setconfig('phases', 'new-commit', 'secret')
return repo.commit(message, opts.get('user'), opts.get('date'),
match, editor=e, extra=extra)
finally:
ui.setconfig('phases', 'new-commit', oldcommitphase)
+ repo.baseui.setconfig('phases', 'new-commit', oldcommitphase)
node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
@@ -5645,6 +5648,7 @@
if opts.get('edit'):
message = ui.edit(message, ui.username())
+ repo.savecommitmessage(message)
# don't allow tagging the null rev
if (not opts.get('remove') and
--- a/mercurial/localrepo.py Sat Mar 15 15:44:51 2014 +0100
+++ b/mercurial/localrepo.py Tue Mar 18 14:25:28 2014 -0500
@@ -1280,6 +1280,11 @@
cctx._text = editor(self, cctx, subs)
edited = (text != cctx._text)
+ # Save commit message in case this transaction gets rolled back
+ # (e.g. by a pretxncommit hook). Leave the content alone on
+ # the assumption that the user will use the same editor again.
+ msgfn = self.savecommitmessage(cctx._text)
+
# commit subs and write new state
if subs:
for s in sorted(commitsubs):
@@ -1290,11 +1295,6 @@
newstate[s] = (newstate[s][0], sr)
subrepo.writestate(self, newstate)
- # Save commit message in case this transaction gets rolled back
- # (e.g. by a pretxncommit hook). Leave the content alone on
- # the assumption that the user will use the same editor again.
- msgfn = self.savecommitmessage(cctx._text)
-
p1, p2 = self.dirstate.parents()
hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or '')
try:
--- a/tests/test-commit-amend.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-commit-amend.t Tue Mar 18 14:25:28 2014 -0500
@@ -165,6 +165,57 @@
> cat $1
> echo "another precious commit message" > "$1"
> __EOF__
+
+at first, test saving last-message.txt
+
+ $ cat > .hg/hgrc << '__EOF__'
+ > [hooks]
+ > pretxncommit.test-saving-last-message = false
+ > __EOF__
+
+ $ rm -f .hg/last-message.txt
+ $ hg commit --amend -v -m "message given from command line"
+ amending changeset 5f357c7560ab
+ copying changeset 5f357c7560ab to ad120869acf0
+ a
+ running hook pretxncommit.test-saving-last-message: false
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.test-saving-last-message hook exited with status 1
+ [255]
+ $ cat .hg/last-message.txt
+ message given from command line (no-eol)
+
+ $ rm -f .hg/last-message.txt
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
+ amending changeset 5f357c7560ab
+ copying changeset 5f357c7560ab to ad120869acf0
+ no changes, new message
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: foo
+ HG: branch 'default'
+ HG: changed a
+ a
+ running hook pretxncommit.test-saving-last-message: false
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.test-saving-last-message hook exited with status 1
+ [255]
+
+ $ cat .hg/last-message.txt
+ another precious commit message
+
+ $ cat > .hg/hgrc << '__EOF__'
+ > [hooks]
+ > pretxncommit.test-saving-last-message =
+ > __EOF__
+
+then, test editing custom commit message
+
$ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
amending changeset 5f357c7560ab
copying changeset 5f357c7560ab to ad120869acf0
--- a/tests/test-commit.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-commit.t Tue Mar 18 14:25:28 2014 -0500
@@ -285,6 +285,52 @@
HG: removed removed
abort: empty commit message
[255]
+
+test saving last-message.txt
+
+ $ hg init sub
+ $ echo a > sub/a
+ $ hg -R sub add sub/a
+ $ cat > sub/.hg/hgrc <<EOF
+ > [hooks]
+ > precommit.test-saving-last-message = false
+ > EOF
+
+ $ echo 'sub = sub' > .hgsub
+ $ hg add .hgsub
+
+ $ cat > $TESTDIR/editor.sh <<EOF
+ > echo "==== before editing:"
+ > cat \$1
+ > echo "===="
+ > echo "test saving last-message.txt" >> \$1
+ > EOF
+
+ $ rm -f .hg/last-message.txt
+ $ HGEDITOR="sh $TESTDIR/editor.sh" hg commit -S -q
+ ==== before editing:
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: test
+ HG: branch 'default'
+ HG: bookmark 'currentbookmark'
+ HG: subrepo sub
+ HG: added .hgsub
+ HG: added added
+ HG: changed .hgsubstate
+ HG: changed changed
+ HG: removed removed
+ ====
+ abort: precommit.test-saving-last-message hook exited with status 1 (in subrepo sub)
+ [255]
+ $ cat .hg/last-message.txt
+
+
+ test saving last-message.txt
+
$ cd ..
--- a/tests/test-histedit-fold.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-histedit-fold.t Tue Mar 18 14:25:28 2014 -0500
@@ -105,6 +105,69 @@
+check saving last-message.txt
+
+ $ cat > $TESTDIR/abortfolding.py <<EOF
+ > from mercurial import util
+ > def abortfolding(ui, repo, hooktype, **kwargs):
+ > ctx = repo[kwargs.get('node')]
+ > if set(ctx.files()) == set(['c', 'd', 'f']):
+ > return True # abort folding commit only
+ > ui.warn('allow non-folding commit\\n')
+ > EOF
+ $ cat > .hg/hgrc <<EOF
+ > [hooks]
+ > pretxncommit.abortfolding = python:$TESTDIR/abortfolding.py:abortfolding
+ > EOF
+
+ $ cat > $TESTDIR/editor.sh << EOF
+ > echo "==== before editing"
+ > cat \$1
+ > echo "===="
+ > echo "check saving last-message.txt" >> \$1
+ > EOF
+
+ $ rm -f .hg/last-message.txt
+ $ HGEDITOR="sh $TESTDIR/editor.sh" hg histedit 6de59d13424a --commands - 2>&1 <<EOF | fixbundle
+ > pick 6de59d13424a f
+ > fold 9c277da72c9b d
+ > EOF
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ allow non-folding commit
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ ==== before editing
+ f
+ ***
+ c
+ ***
+ d
+
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: test
+ HG: branch 'default'
+ HG: changed c
+ HG: changed d
+ HG: changed f
+ ====
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.abortfolding hook failed
+
+ $ cat .hg/last-message.txt
+ f
+ ***
+ c
+ ***
+ d
+
+
+
+ check saving last-message.txt
+
$ cd ..
folding and creating no new change doesn't break:
--- a/tests/test-mq-qfold.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-mq-qfold.t Tue Mar 18 14:25:28 2014 -0500
@@ -140,5 +140,41 @@
b
+b
+Test saving last-message.txt:
+
+ $ hg qrefresh -m "original message"
+
+ $ cat > $TESTDIR/commitfailure.py <<EOF
+ > from mercurial import util
+ > def reposetup(ui, repo):
+ > class commitfailure(repo.__class__):
+ > def commit(self, *args, **kwargs):
+ > raise util.Abort('emulating unexpected abort')
+ > repo.__class__ = commitfailure
+ > EOF
+
+ $ cat > .hg/hgrc <<EOF
+ > [extensions]
+ > commitfailure = $TESTDIR/commitfailure.py
+ > EOF
+
+ $ cat > $TESTDIR/editor.sh << EOF
+ > echo "==== before editing"
+ > cat \$1
+ > echo "===="
+ > (echo; echo "test saving last-message.txt") >> \$1
+ > EOF
+
+ $ rm -f .hg/last-message.txt
+ $ HGEDITOR="sh $TESTDIR/editor.sh" hg qfold -e p3
+ ==== before editing
+ original message====
+ refresh interrupted while patch was popped! (revert --all, qpush to recover)
+ abort: emulating unexpected abort
+ [255]
+ $ cat .hg/last-message.txt
+ original message
+ test saving last-message.txt
+
$ cd ..
--- a/tests/test-mq-qnew.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-mq-qnew.t Tue Mar 18 14:25:28 2014 -0500
@@ -233,3 +233,39 @@
use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
abort: cannot manage merge changesets
$ rm -r sandbox
+
+Test saving last-message.txt
+
+ $ hg init repo
+ $ cd repo
+
+ $ cat > $TESTDIR/commitfailure.py <<EOF
+ > from mercurial import util
+ > def reposetup(ui, repo):
+ > class commitfailure(repo.__class__):
+ > def commit(self, *args, **kwargs):
+ > raise util.Abort('emulating unexpected abort')
+ > repo.__class__ = commitfailure
+ > EOF
+ $ cat > .hg/hgrc <<EOF
+ > [extensions]
+ > commitfailure = $TESTDIR/commitfailure.py
+ > EOF
+
+ $ cat > $TESTDIR/editor.sh << EOF
+ > echo "==== before editing"
+ > cat \$1
+ > echo "===="
+ > echo "test saving last-message.txt" >> \$1
+ > EOF
+
+ $ rm -f .hg/last-message.txt
+ $ HGEDITOR="sh $TESTDIR/editor.sh" hg qnew -e patch
+ ==== before editing
+ ====
+ abort: emulating unexpected abort
+ [255]
+ $ cat .hg/last-message.txt
+ test saving last-message.txt
+
+ $ cd ..
--- a/tests/test-rebase-collapse.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-rebase-collapse.t Tue Mar 18 14:25:28 2014 -0500
@@ -52,14 +52,39 @@
$ hg phase --force --secret 3
- $ hg rebase --collapse --keepbranches
+ $ cat > $TESTTMP/editor.sh <<EOF
+ > echo "==== before editing"
+ > cat \$1
+ > echo "===="
+ > echo "edited manually" >> \$1
+ > EOF
+ $ HGEDITOR="sh $TESTTMP/editor.sh" hg rebase --collapse --keepbranches -e
+ ==== before editing
+ Collapsed revision
+ * B
+ * C
+ * D
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ HG: branch 'default'
+ HG: changed B
+ HG: changed C
+ HG: changed D
+ ====
saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
$ hg tglogp
@ 5:secret 'Collapsed revision
| * B
| * C
- | * D'
+ | * D
+ |
+ |
+ | edited manually'
o 4:draft 'H'
|
| o 3:draft 'G'
--- a/tests/test-subrepo.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-subrepo.t Tue Mar 18 14:25:28 2014 -0500
@@ -1294,3 +1294,18 @@
15: secret
$ cd ..
+
+
+Test that comit --secret works on both repo and subrepo (issue4182)
+
+ $ cd main
+ $ echo secret >> b
+ $ echo secret >> s/b
+ $ hg commit --secret --subrepo -m "secret"
+ committing subrepository s
+ $ hg phase -r .
+ 6: secret
+ $ cd s
+ $ hg phase -r .
+ 6: secret
+ $ cd ../../
--- a/tests/test-tag.t Sat Mar 15 15:44:51 2014 +0100
+++ b/tests/test-tag.t Tue Mar 18 14:25:28 2014 -0500
@@ -222,6 +222,27 @@
> echo "custom tag message" > "$1"
> echo "second line" >> "$1"
> __EOF__
+
+at first, test saving last-message.txt
+
+ $ cat > .hg/hgrc << '__EOF__'
+ > [hooks]
+ > pretag.test-saving-lastmessage = false
+ > __EOF__
+ $ rm -f .hg/last-message.txt
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg tag custom-tag -e
+ abort: pretag.test-saving-lastmessage hook exited with status 1
+ [255]
+ $ cat .hg/last-message.txt
+ custom tag message
+ second line
+ $ cat > .hg/hgrc << '__EOF__'
+ > [hooks]
+ > pretag.test-saving-lastmessage =
+ > __EOF__
+
+then, test custom commit message itself
+
$ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg tag custom-tag -e
$ hg log -l1 --template "{desc}\n"
custom tag message