Patchwork [1,of,2] histedit: add stop verb

login
register
mail settings
Submitter David Soria Parra
Date Sept. 8, 2014, 4:35 p.m.
Message ID <e79544cdfb81f88d782e.1410194154@davidsp-mbp.dhcp.thefacebook.com>
Download mbox | patch
Permalink /patch/5722/
State Changes Requested
Headers show

Comments

David Soria Parra - Sept. 8, 2014, 4:35 p.m.
# HG changeset patch
# User David Soria Parra <davidsp@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.
Augie Fackler - Sept. 9, 2014, 3:57 p.m.
On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
> # HG changeset patch
> # User David Soria Parra <davidsp@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@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
David Soria Parra - Sept. 9, 2014, 4:34 p.m.
Am 9/9/14, 8:57 AM, schrieb Augie Fackler:
> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
>> # HG changeset patch
>> # User David Soria Parra <davidsp@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".)

The answer here is "no". When we are recreating the node, we are getting
a new hash. We would need to be able to compare afterwards if the new
node and the original node "match", consdering they have different
hashes. As far as I can tell we don't have any way to do that at the
moment, so I opted that we always recreate the node if you use stop and
have obsolence markers disabled.

- David
Augie Fackler - Sept. 9, 2014, 4:35 p.m.
On Sep 9, 2014, at 12:34 PM, David Soria Parra <davidsp@fb.com> wrote:

> 
> 
> Am 9/9/14, 8:57 AM, schrieb Augie Fackler:
>> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
>>> # HG changeset patch
>>> # User David Soria Parra <davidsp@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".)
> 
> The answer here is "no". When we are recreating the node, we are getting
> a new hash. We would need to be able to compare afterwards if the new
> node and the original node "match", consdering they have different
> hashes. As far as I can tell we don't have any way to do that at the
> moment, so I opted that we always recreate the node if you use stop and
> have obsolence markers disabled.

Could you compare the manifest node? Would that always be the same?

> 
> - David
David Soria Parra - Sept. 9, 2014, 4:54 p.m.
Am 9/9/14, 9:35 AM, schrieb Augie Fackler:
> 
> On Sep 9, 2014, at 12:34 PM, David Soria Parra <davidsp@fb.com
> <mailto:davidsp@fb.com>> wrote:
> 
>>
>>
>> Am 9/9/14, 8:57 AM, schrieb Augie Fackler:
>>> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
>>>> # HG changeset patch
>>>> # User David Soria Parra <davidsp@fb.com <mailto:davidsp@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".)
>>
>> The answer here is "no". When we are recreating the node, we are getting
>> a new hash. We would need to be able to compare afterwards if the new
>> node and the original node "match", consdering they have different
>> hashes. As far as I can tell we don't have any way to do that at the
>> moment, so I opted that we always recreate the node if you use stop and
>> have obsolence markers disabled.
> 
> Could you compare the manifest node? Would that always be the same?

Yes. But this assumes that the user didn't change just the commit
message or author.
Augie Fackler - Sept. 9, 2014, 5:32 p.m.
On Sep 9, 2014, at 12:54 PM, David Soria Parra <davidsp@fb.com> wrote:

> 
> 
> Am 9/9/14, 9:35 AM, schrieb Augie Fackler:
>> 
>> On Sep 9, 2014, at 12:34 PM, David Soria Parra <davidsp@fb.com
>> <mailto:davidsp@fb.com>> wrote:
>> 
>>> 
>>> 
>>> Am 9/9/14, 8:57 AM, schrieb Augie Fackler:
>>>> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
>>>>> # HG changeset patch
>>>>> # User David Soria Parra <davidsp@fb.com <mailto:davidsp@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".)
>>> 
>>> The answer here is "no". When we are recreating the node, we are getting
>>> a new hash. We would need to be able to compare afterwards if the new
>>> node and the original node "match", consdering they have different
>>> hashes. As far as I can tell we don't have any way to do that at the
>>> moment, so I opted that we always recreate the node if you use stop and
>>> have obsolence markers disabled.
>> 
>> Could you compare the manifest node? Would that always be the same?
> 
> Yes. But this assumes that the user didn't change just the commit
> message or author.


Hm.

Could we just only offer 'stop' if the user has obsolete enabled? Would that be sufficient for Facebook today, and not put weird edge cases into the behavior of histedit?

(I'm not sure I want to do that either, I'm just mulling over which of the handful of terrible options is the least awful.)
David Soria Parra - Sept. 9, 2014, 5:34 p.m.
Am 9/9/14, 10:32 AM, schrieb Augie Fackler:
> 
> On Sep 9, 2014, at 12:54 PM, David Soria Parra <davidsp@fb.com> wrote:
> 
>>
>>
>> Am 9/9/14, 9:35 AM, schrieb Augie Fackler:
>>>
>>> On Sep 9, 2014, at 12:34 PM, David Soria Parra <davidsp@fb.com
>>> <mailto:davidsp@fb.com>> wrote:
>>>
>>>>
>>>>
>>>> Am 9/9/14, 8:57 AM, schrieb Augie Fackler:
>>>>> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
>>>>>> # HG changeset patch
>>>>>> # User David Soria Parra <davidsp@fb.com <mailto:davidsp@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".)
>>>>
>>>> The answer here is "no". When we are recreating the node, we are getting
>>>> a new hash. We would need to be able to compare afterwards if the new
>>>> node and the original node "match", consdering they have different
>>>> hashes. As far as I can tell we don't have any way to do that at the
>>>> moment, so I opted that we always recreate the node if you use stop and
>>>> have obsolence markers disabled.
>>>
>>> Could you compare the manifest node? Would that always be the same?
>>
>> Yes. But this assumes that the user didn't change just the commit
>> message or author.
> 
> 
> Hm.
> 
> Could we just only offer 'stop' if the user has obsolete enabled? Would that be sufficient for Facebook today, and not put weird edge cases into the behavior of histedit?

I don't think that will be sufficient. Obsolence markers have too much
of a perf impact these days to be enabled.
Durham Goode - Sept. 9, 2014, 5:52 p.m.
On 9/9/14, 5:34 PM, "David Soria Parra" <davidsp@fb.com> wrote:

>

>

>Am 9/9/14, 10:32 AM, schrieb Augie Fackler:

>> 

>> On Sep 9, 2014, at 12:54 PM, David Soria Parra <davidsp@fb.com> wrote:

>> 

>>>

>>>

>>> Am 9/9/14, 9:35 AM, schrieb Augie Fackler:

>>>>

>>>> On Sep 9, 2014, at 12:34 PM, David Soria Parra <davidsp@fb.com

>>>> <mailto:davidsp@fb.com>> wrote:

>>>>

>>>>>

>>>>>

>>>>> Am 9/9/14, 8:57 AM, schrieb Augie Fackler:

>>>>>> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:

>>>>>>> # HG changeset patch

>>>>>>> # User David Soria Parra <davidsp@fb.com <mailto:davidsp@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".)

>>>>>

>>>>> The answer here is "no". When we are recreating the node, we are 

>>>>>getting

>>>>> a new hash. We would need to be able to compare afterwards if the new

>>>>> node and the original node "match", consdering they have different

>>>>> hashes. As far as I can tell we don't have any way to do that at the

>>>>> moment, so I opted that we always recreate the node if you use stop 

>>>>>and

>>>>> have obsolence markers disabled.

>>>>

>>>> Could you compare the manifest node? Would that always be the same?

>>>

>>> Yes. But this assumes that the user didn't change just the commit

>>> message or author.

>> 

>> 

>> Hm.

>> 

>> Could we just only offer 'stop' if the user has obsolete enabled? Would 

>>that be sufficient for Facebook today, and not put weird edge cases into 

>>the behavior of histedit?

>

>I don't think that will be sufficient. Obsolence markers have too much

>of a perf impact these days to be enabled.

>


I think stop must always change the hash, because if the user records that 
hash (ex: by running a code review tool) it needs to remain valid, even if 
the user didn’t change the commit.

I also think the feature is useful enough to put in core, even with the 
weirdisms.  Alternatively we could pop the entire histedit stack off 
before doing anything, then apply the commits fresh, one by one.  Thus 
allowing users to amend a commit before the children are applied.
Augie Fackler - Sept. 9, 2014, 5:54 p.m.
On Sep 9, 2014, at 1:52 PM, Durham Goode <durham@fb.com> wrote:

> On 9/9/14, 5:34 PM, "David Soria Parra" <davidsp@fb.com> wrote:
> 
>> 
>> 
>> Am 9/9/14, 10:32 AM, schrieb Augie Fackler:
>>> 
>>> On Sep 9, 2014, at 12:54 PM, David Soria Parra <davidsp@fb.com> wrote:
>>> 
>>>> 
>>>> 
>>>> Am 9/9/14, 9:35 AM, schrieb Augie Fackler:
>>>>> 
>>>>> On Sep 9, 2014, at 12:34 PM, David Soria Parra <davidsp@fb.com
>>>>> <mailto:davidsp@fb.com>> wrote:
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Am 9/9/14, 8:57 AM, schrieb Augie Fackler:
>>>>>>> On Mon, Sep 08, 2014 at 09:35:54AM -0700, David Soria Parra wrote:
>>>>>>>> # HG changeset patch
>>>>>>>> # User David Soria Parra <davidsp@fb.com <mailto:davidsp@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".)
>>>>>> 
>>>>>> The answer here is "no". When we are recreating the node, we are 
>>>>>> getting
>>>>>> a new hash. We would need to be able to compare afterwards if the new
>>>>>> node and the original node "match", consdering they have different
>>>>>> hashes. As far as I can tell we don't have any way to do that at the
>>>>>> moment, so I opted that we always recreate the node if you use stop 
>>>>>> and
>>>>>> have obsolence markers disabled.
>>>>> 
>>>>> Could you compare the manifest node? Would that always be the same?
>>>> 
>>>> Yes. But this assumes that the user didn't change just the commit
>>>> message or author.
>>> 
>>> 
>>> Hm.
>>> 
>>> Could we just only offer 'stop' if the user has obsolete enabled? Would 
>>> that be sufficient for Facebook today, and not put weird edge cases into 
>>> the behavior of histedit?
>> 
>> I don't think that will be sufficient. Obsolence markers have too much
>> of a perf impact these days to be enabled.
>> 
> 
> I think stop must always change the hash, because if the user records that 
> hash (ex: by running a code review tool) it needs to remain valid, even if 
> the user didn’t change the commit.

Hm, interesting point. That probably applies to 'exec' as well?

The reason I'm dithering about this so much is that we've already got some open bugs (that I'd like to fix) that histedit causes hashes to change even when you make no edits, so it's kind of a bummer to make some more of that behavior. I'm starting to be convinced we can't avoid it though, which is a little tragic.

> I also think the feature is useful enough to put in core, even with the 
> weirdisms.  Alternatively we could pop the entire histedit stack off 
> before doing anything, then apply the commits fresh, one by one.  Thus 
> allowing users to amend a commit before the children are applied.
Durham Goode - Sept. 9, 2014, 6:02 p.m.
On 9/9/14, 10:54 AM, Augie Fackler wrote:
> On Sep 9, 2014, at 1:52 PM, Durham Goode <durham@fb.com> wrote:
>
>> I think stop must always change the hash, because if the user records that
>> hash (ex: by running a code review tool) it needs to remain valid, even if
>> the user didn’t change the commit.
> Hm, interesting point. That probably applies to 'exec' as well?
>
> The reason I'm dithering about this so much is that we've already got some open bugs (that I'd like to fix) that histedit causes hashes to change even when you make no edits, so it's kind of a bummer to make some more of that behavior. I'm starting to be convinced we can't avoid it though, which is a little tragic.
How crazy is my idea to strip everything first?  That solves our hash 
problem and we're going to have to do the strip eventually anyway.  It 
might remove the ability for someone to diff against the original 
version, but that's a capability they don't actually have today, so we 
wouldn't be removing functionality.
>> I also think the feature is useful enough to put in core, even with the
>> weirdisms.  Alternatively we could pop the entire histedit stack off
>> before doing anything, then apply the commits fresh, one by one.  Thus
>> allowing users to amend a commit before the children are applied.
David Soria Parra - Sept. 9, 2014, 7:07 p.m.
Am 9/9/14, 11:02 AM, schrieb Durham Goode:
> 
> On 9/9/14, 10:54 AM, Augie Fackler wrote:
>> On Sep 9, 2014, at 1:52 PM, Durham Goode <durham@fb.com> wrote:
>>
>>> I think stop must always change the hash, because if the user records
>>> that
>>> hash (ex: by running a code review tool) it needs to remain valid,
>>> even if
>>> the user didn’t change the commit.
>> Hm, interesting point. That probably applies to 'exec' as well?
>>
>> The reason I'm dithering about this so much is that we've already got
>> some open bugs (that I'd like to fix) that histedit causes hashes to
>> change even when you make no edits, so it's kind of a bummer to make
>> some more of that behavior. I'm starting to be convinced we can't
>> avoid it though, which is a little tragic.
> How crazy is my idea to strip everything first?  That solves our hash
> problem and we're going to have to do the strip eventually anyway.  It
> might remove the ability for someone to diff against the original
> version, but that's a capability they don't actually have today, so we
> wouldn't be removing functionality.

I am not too happy about that. It would mean that pick, etc behaviour
changes significantly for current users. The stop behaviour is far from
ideal but it does not tinker with the current behaviours of pick & co.

>>> I also think the feature is useful enough to put in core, even with the
>>> weirdisms.  Alternatively we could pop the entire histedit stack off
>>> before doing anything, then apply the commits fresh, one by one.  Thus
>>> allowing users to amend a commit before the children are applied.
>
Augie Fackler - Sept. 10, 2014, 6:46 p.m.
On Tue, Sep 9, 2014 at 3:07 PM, David Soria Parra <davidsp@fb.com> wrote:
>
>
> Am 9/9/14, 11:02 AM, schrieb Durham Goode:
>>
>> On 9/9/14, 10:54 AM, Augie Fackler wrote:
>>> On Sep 9, 2014, at 1:52 PM, Durham Goode <durham@fb.com> wrote:
>>>
>>>> I think stop must always change the hash, because if the user records
>>>> that
>>>> hash (ex: by running a code review tool) it needs to remain valid,
>>>> even if
>>>> the user didn’t change the commit.
>>> Hm, interesting point. That probably applies to 'exec' as well?
>>>
>>> The reason I'm dithering about this so much is that we've already got
>>> some open bugs (that I'd like to fix) that histedit causes hashes to
>>> change even when you make no edits, so it's kind of a bummer to make
>>> some more of that behavior. I'm starting to be convinced we can't
>>> avoid it though, which is a little tragic.
>> How crazy is my idea to strip everything first?  That solves our hash
>> problem and we're going to have to do the strip eventually anyway.  It
>> might remove the ability for someone to diff against the original
>> version, but that's a capability they don't actually have today, so we
>> wouldn't be removing functionality.
>
> I am not too happy about that. It would mean that pick, etc behaviour
> changes significantly for current users. The stop behaviour is far from
> ideal but it does not tinker with the current behaviours of pick & co.

marmoute had a good idea on irc: see if we can allow amending changes
during histedit, and then have the histedit machinery clean up after
itself when done. dsop said he'd investigate, so I'm going to unflag
this series for now.

>
>>>> I also think the feature is useful enough to put in core, even with the
>>>> weirdisms.  Alternatively we could pop the entire histedit stack off
>>>> before doing anything, then apply the commits fresh, one by one.  Thus
>>>> allowing users to amend a commit before the children are applied.
>>

Patch

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
+  
+  
+