[PATCH v2] histedit: use one editor when multiple folds happen in a row (issue3524) (BC)

Augie Fackler raf at durin42.com
Tue Sep 1 12:17:26 CDT 2015


Yeah, I can do that. Sounds a little overengineered for the current
case, but I can see it being useful. I'll roll a v3 soon. Thanks!

On Tue, Sep 1, 2015 at 1:13 PM, Durham Goode <durham at fb.com> wrote:
>
>
> On 8/31/15 9:56 PM, Augie Fackler wrote:
>>
>> # HG changeset patch
>> # User Augie Fackler <augie at google.com>
>> # Date 1440701186 14400
>> #      Thu Aug 27 14:46:26 2015 -0400
>> # Node ID 6d4eb98524de846543455102dfe4aaa3c8c8af45
>> # Parent  049005de325ea400893f45bd6221215cc9b26db0
>> histedit: use one editor when multiple folds happen in a row (issue3524)
>> (BC)
>>
>> This was the first ever feature request for histedit, originally filed
>> back on April 4, 2009. Finally fixed.
>>
>> diff --git a/hgext/histedit.py b/hgext/histedit.py
>> --- a/hgext/histedit.py
>> +++ b/hgext/histedit.py
>> @@ -559,6 +559,9 @@ class fold(histeditaction):
>>       def skipprompt(self):
>>           return False
>>   +    def mergedescs(self):
>> +        return True
>> +
>>       def finishfold(self, ui, repo, ctx, oldctx, newnode,
>> internalchanges):
>>           parent = ctx.parents()[0].node()
>>           hg.update(repo, parent)
>> @@ -566,7 +569,7 @@ class fold(histeditaction):
>>           commitopts = {}
>>           commitopts['user'] = ctx.user()
>>           # commit message
>> -        if self.skipprompt():
>> +        if not self.mergedescs():
>>               newmessage = ctx.description()
>>           else:
>>               newmessage = '\n***\n'.join(
>> @@ -601,7 +604,22 @@ class fold(histeditaction):
>>               replacements.append((ich, (n,)))
>>           return repo[n], replacements
>>   +class _multifold(fold):
>> +    """fold subclass used for when multiple folds happen in a row
>> +
>> +    We only want to fire the editor for the folded message once when
>> +    (say) four CLs are folded down into a single change. This is
>> +    similar to rollup, but we should preserve both messages so that
>> +    when the last fold operation runs we can show the user all the
>> +    commit messages in their editor.
>> +    """
>> +    def skipprompt(self):
>> +        return True
>> +
>>   class rollup(fold):
>> +    def mergedescs(self):
>> +        return False
>> +
>>       def skipprompt(self):
>>           return True
>>   @@ -644,6 +662,7 @@ actiontable = {'p': pick,
>>                  'edit': edit,
>>                  'f': fold,
>>                  'fold': fold,
>> +               '_multifold': _multifold,
>>                  'r': rollup,
>>                  'roll': rollup,
>>                  'd': drop,
>> @@ -850,6 +869,14 @@ def _histedit(ui, repo, state, *freeargs
>>                                           'histedit')
>>           state.backupfile = backupfile
>>   +    # preprocess rules so that we can hide inner folds from the user
>> +    # and only show one editor
>> +    rules = state.rules[:]
>> +    for idx, ((action, ha), (nextact, unused)) in enumerate(
>> +            zip(rules, rules[1:] + [(None, None)])):
>> +        if action == 'fold' and nextact == 'fold':
>> +            state.rules[idx] = '_multifold', ha
>
> This is moving us a bit back towards the world where there are hard coded
> special cases all over the place.  Can we add a preprocess() function to
> each histeditaction class and put this logic inside the multifold class?
> Then just call preprocess on every action class.
>
>> +
>>       while state.rules:
>>           state.write()
>>           action, ha = state.rules.pop(0)
>> @@ -995,7 +1022,7 @@ def verifyrules(rules, repo, ctxs):
>>               raise util.Abort(_('duplicated command for changeset %s') %
>>                       ha[:12])
>>           seen.add(ha)
>> -        if action not in actiontable:
>> +        if action not in actiontable or action.startswith('_'):
>>               raise util.Abort(_('unknown action "%s"') % action)
>>           parsed.append([action, ha])
>>       missing = sorted(expected - seen)  # sort to stabilize output
>> diff --git a/tests/test-histedit-fold.t b/tests/test-histedit-fold.t
>> --- a/tests/test-histedit-fold.t
>> +++ b/tests/test-histedit-fold.t
>> @@ -509,4 +509,44 @@ into the hook command.
>>     $ hg add amended.txt
>>     $ hg ci -q --config extensions.largefiles= --amend -I amended.txt
>>   +  $ echo foo >> foo
>> +  $ hg add foo
>> +  $ hg ci -m foo1
>> +  $ echo foo >> foo
>> +  $ hg ci -m foo2
>> +  $ echo foo >> foo
>> +  $ hg ci -m foo3
>> +  $ hg logt
>> +  4:21679ff7675c foo3
>> +  3:b7389cc4d66e foo2
>> +  2:0e01aeef5fa8 foo1
>> +  1:578c7455730c a
>> +  0:79b99e9c8e49 b
>> +  $ cat > $TESTTMP/editor.sh <<EOF
>> +  > echo merged foos > $$1
>> +  > echo ran editor >> $TESTTMP/editorlog.txt
>> +  > EOF
>> +  $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit 1 --commands - 2>&1
>> <<EOF | fixbundle
>> +  > pick 578c7455730c 1 a
>> +  > pick 0e01aeef5fa8 2 foo1
>> +  > fold b7389cc4d66e 3 foo2
>> +  > fold 21679ff7675c 4 foo3
>> +  > EOF
>> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  reverting foo
>> +  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  merging foo
>> +  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  $ hg logt
>> +  2:f7c59a6ef880 foo1
>> +  1:578c7455730c a
>> +  0:79b99e9c8e49 b
>> +Editor should have run only once
>> +  $ cat $TESTTMP/editorlog.txt
>> +  ran editor
>> +
>>     $ cd ..
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> https://selenic.com/mailman/listinfo/mercurial-devel
>
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list