[PATCH 1 of 2] histedit: add stop verb
David Soria Parra
davidsp at fb.com
Mon Sep 8 16:35:54 UTC 2014
# HG changeset patch
# User David Soria Parra <davidsp at fb.com>
# Date 1409941197 -7200
# Fri Sep 05 20:19:57 2014 +0200
# Node ID e79544cdfb81f88d782e923d96e8ad63303aec94
# Parent c4b1d0db14c257e9fbb58e0f044c28f12dade3dd
histedit: add stop verb
We are adding a 'stop' verb for histedit. This applies the changes
and drops the user into a shell after committing the changes. This allows to
amend or modify the commit with external tooling. However, as a changeset can
have potential children which would dissallow amending, we have to recreate the
commit and therefore all hashes after a first stop are changing.
diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -35,6 +35,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -57,6 +58,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -180,6 +182,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+# s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -402,6 +405,23 @@
def drop(ui, repo, ctx, ha, opts):
return ctx, [(repo[ha].node(), ())]
+def stop(ui, repo, ctx, ha, opts):
+ oldctx = repo[ha]
+
+ hg.update(repo, ctx.node())
+ stats = applychanges(ui, repo, oldctx, opts)
+ if stats and stats[3] > 0:
+ raise error.InterventionRequired(
+ _('Fix up the change and run hg histedit --continue'))
+
+ commit = commitfuncfor(repo, oldctx)
+ new = commit(text=oldctx.description(), user=oldctx.user(),
+ date=oldctx.date(), extra=oldctx.extra())
+
+ raise error.InterventionRequired(
+ _('Changes commited as %s. You may amend the commit now.\n'
+ 'When you are finished, run hg histedit --continue to resume.') %
+ repo[new])
def message(ui, repo, ctx, ha, opts):
oldctx = repo[ha]
@@ -458,6 +478,8 @@
'drop': drop,
'm': message,
'mess': message,
+ 's': stop,
+ 'stop': stop,
}
@command('histedit',
diff --git a/tests/test-histedit-arguments.t b/tests/test-histedit-arguments.t
--- a/tests/test-histedit-arguments.t
+++ b/tests/test-histedit-arguments.t
@@ -56,6 +56,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -255,6 +256,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
diff --git a/tests/test-histedit-bookmark-motion.t b/tests/test-histedit-bookmark-motion.t
--- a/tests/test-histedit-bookmark-motion.t
+++ b/tests/test-histedit-bookmark-motion.t
@@ -72,6 +72,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -133,6 +134,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
diff --git a/tests/test-histedit-commute.t b/tests/test-histedit-commute.t
--- a/tests/test-histedit-commute.t
+++ b/tests/test-histedit-commute.t
@@ -66,6 +66,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -344,6 +345,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
diff --git a/tests/test-histedit-obsolete.t b/tests/test-histedit-obsolete.t
--- a/tests/test-histedit-obsolete.t
+++ b/tests/test-histedit-obsolete.t
@@ -56,6 +56,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
diff --git a/tests/test-histedit-outgoing.t b/tests/test-histedit-outgoing.t
--- a/tests/test-histedit-outgoing.t
+++ b/tests/test-histedit-outgoing.t
@@ -48,6 +48,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -80,6 +81,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
@@ -104,6 +106,7 @@
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
+ # s, stop = use commit, and stop after committing changes
# f, fold = use commit, but combine it with the one above
# r, roll = like fold, but discard this commit's description
# d, drop = remove commit from history
diff --git a/tests/test-histedit-stop.t b/tests/test-histedit-stop.t
new file mode 100644
--- /dev/null
+++ b/tests/test-histedit-stop.t
@@ -0,0 +1,164 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > histedit=
+ > EOF
+
+ $ initrepo ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > }
+
+ $ initrepo
+
+log before edit
+
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+stop & continue cannot preserve hashes without obsolence
+
+ $ hg histedit 177f92b77385 --commands - 2>&1 << EOF| fixbundle
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > stop e860deea161a e
+ > pick 652413bf663e f
+ > EOF
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ Changes commited as 04d2fab98077. You may amend the commit now.
+ When you are finished, run hg histedit --continue to resume.
+
+ $ hg histedit --continue
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/r/.hg/strip-backup/e860deea161a-backup.hg
+
+ $ hg log --graph
+ @ changeset: 5:794fe033d0a0
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:04d2fab98077
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+stop on a commit
+
+ $ hg histedit 177f92b77385 --commands - 2>&1 << EOF| fixbundle
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > stop 04d2fab98077 e
+ > pick 794fe033d0a0 f
+ > EOF
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ Changes commited as d28623a90f2b. You may amend the commit now.
+ When you are finished, run hg histedit --continue to resume.
+
+ $ hg id -r . -i
+ d28623a90f2b
+ $ echo added > added
+ $ hg add added
+ $ hg commit --amend
+ saved backup bundle to $TESTTMP/r/.hg/strip-backup/d28623a90f2b-amend-backup.hg
+
+ $ hg log -v -r '.' --template '{files}\n'
+ added e
+ $ hg histedit --continue
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/r/.hg/strip-backup/04d2fab98077-backup.hg
+
+ $ hg log --graph --template '{node|short} {desc} {files}\n'
+ @ 099559071076 f f
+ |
+ o d51720eb7a13 e added e
+ |
+ o 055a42cdd887 d d
+ |
+ o 177f92b77385 c c
+ |
+ o d2ae7f538514 b b
+ |
+ o cb9a9f314b8b a a
+
+
+check histedit_source
+
+ $ hg log --debug --rev 4
+ changeset: 4:d51720eb7a133e2dabf74a445e509a3900e9c0b5
+ phase: draft
+ parent: 3:055a42cdd88768532f9cf79daa407fc8d138de9b
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 4:b2ebbc42649134e3236996c0a3b1c6ec526e8f2e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: added e
+ extra: amend_source=d28623a90f2b5c38b6c3ca503c86847b34c9bfdf
+ extra: branch=default
+ extra: histedit_source=04d2fab980779f332dec458cc944f28de8b43435
+ description:
+ e
+
+
+
More information about the Mercurial-devel
mailing list