[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