[PATCH 1 of 2] histedit: add stop verb

Augie Fackler raf at durin42.com
Tue Sep 9 10:57:02 CDT 2014


On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
> # 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.

What happens if I do 'stop' but don't make changes? Does the user get
to retain the original, non-fussed-with hash?

(I'm not 100% sure it's a showstopper if the answer is "no", but I'd
really like the answer to be "yes".)

>
> 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
> +
> +
> +
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list