[PATCH 3 of 3] histedit: replace @addhisteditaction with @action

Mateusz Kwapich mitrandir at fb.com
Tue Jan 5 15:24:27 CST 2016


I’m back from my christmas vacation :) I’m fine with this change - it’s even better than my previous change
Which was supposed to be queued but somehow was skipped  ( http://patchwork.serpentine.com/patch/11938/ )

My goal with histedit architectural changes was to make sure that adding a new command doesn’t require any
soccery. This patch fits nicely into that plan so it looks good to me. 

Best,
Mateusz




On 1/5/16, 10:31 AM, "Mercurial-devel on behalf of timeless" <mercurial-devel-bounces at selenic.com on behalf of timeless at mozdev.org> wrote:

># HG changeset patch
># User timeless <timeless at mozdev.org>
># Date 1450906238 0
>#      Wed Dec 23 21:30:38 2015 +0000
># Node ID 5b616db6e64040d138152297bff3b62245167917
># Parent  0e22d25a49546b65a4eb53ef53f555634afdbef9
>histedit: replace @addhisteditaction with @action
>
>@action supports verbs, messages, priority, and internal
>
>messages should be translated.
>internal means the action should not be listed.
>
>geteditcomment will construct the verbs list based on
>@actions (prefering priority over non priority, otherwise
>favoring verbs with short forms over verbs without).
>
>diff --git a/hgext/histedit.py b/hgext/histedit.py
>--- a/hgext/histedit.py
>+++ b/hgext/histedit.py
>@@ -214,12 +214,19 @@
> # leave the attribute unspecified.
> testedwith = 'internal'
> 
>+actiontable = {}
>+primaryactions = set()
>+secondaryactions = set()
>+tertiaryactions = set()
>+internalactions = set()
>+
> def geteditcomment(first, last):
>     """ construct the editor comment
>     The comment includes::
>      - an intro
>      - sorted primary commands
>      - sorted short commands
>+     - sorted long commands
> 
>     Commands are only included once.
>     """
>@@ -227,19 +234,27 @@
> 
> Commits are listed from least to most recent
> 
>-Commands:""")
>-    # i18n: command names and abbreviations must remain untranslated
>-    verbs = _("""
>- e, edit = use commit, but stop for amending
>- m, mess = edit commit message without changing commit content
>- p, pick = use commit
>- d, drop = remove commit from history
>- f, fold = use commit, but combine it with the one above
>- r, roll = like fold, but discard this commit's description
>+Commands:
> """)
>+    actions = []
>+    def addverb(v):
>+        a = actiontable[v]
>+        lines = a.message.split("\n")
>+        if len(a.verbs):
>+            v = ', '.join(sorted(a.verbs, key=lambda v: len(v)))
>+        actions.append(" %s = %s" % (v, lines[0]))
>+        actions.extend(['  %s' for l in lines[1:]])
>+
>+    for v in (
>+         sorted(primaryactions) +
>+         sorted(secondaryactions) +
>+         sorted(tertiaryactions)
>+        ):
>+        addverb(v)
>+    actions.append('')
> 
>     return ''.join(['# %s\n' % l if l else '#\n'
>-                    for l in ((intro % (first, last) + verbs).split('\n'))])
>+                    for l in ((intro % (first, last)).split('\n')) + actions])
> 
> class histeditstate(object):
>     def __init__(self, repo, parentctxnode=None, actions=None, keep=None,
>@@ -596,21 +611,30 @@
>         hint=_('amend, commit, or revert them and run histedit '
>             '--continue, or abort with histedit --abort'))
> 
>+def action(verbs, message, priority=False, internal=False):
>+    def wrap(cls):
>+        assert not priority or not internal
>+        verb = verbs[0]
>+        if priority:
>+            primaryactions.add(verb)
>+        elif internal:
>+            internalactions.add(verb)
>+        elif len(verbs) > 1:
>+            secondaryactions.add(verb)
>+        else:
>+            tertiaryactions.add(verb)
> 
>-actiontable = {}
>-actionlist = []
>-
>-def addhisteditaction(verbs):
>-    def wrap(cls):
>-        cls.verb = verbs[0]
>+        cls.verb = verb
>+        cls.verbs = verbs
>+        cls.message = message
>         for verb in verbs:
>             actiontable[verb] = cls
>-        actionlist.append(cls)
>         return cls
>     return wrap
> 
>-
>- at addhisteditaction(['pick', 'p'])
>+ at action(['pick', 'p'],
>+        _('use commit'),
>+        priority=True)
> class pick(histeditaction):
>     def run(self):
>         rulectx = self.repo[self.node]
>@@ -620,7 +644,9 @@
> 
>         return super(pick, self).run()
> 
>- at addhisteditaction(['edit', 'e'])
>+ at action(['edit', 'e'],
>+        _('use commit, but stop for amending'),
>+        priority=True)
> class edit(histeditaction):
>     def run(self):
>         repo = self.repo
>@@ -635,7 +661,8 @@
>     def commiteditor(self):
>         return cmdutil.getcommiteditor(edit=True, editform='histedit.edit')
> 
>- at addhisteditaction(['fold', 'f'])
>+ at action(['fold', 'f'],
>+        _('use commit, but combine it with the one above'))
> class fold(histeditaction):
>     def verify(self, prev):
>         """ Verifies semantic correctness of the fold rule"""
>@@ -761,8 +788,8 @@
>         basectx = self.repo['.']
>         return basectx, []
> 
>- at addhisteditaction(['_multifold'])
>-class _multifold(fold):
>+ at action(['_multifold'],
>+        _(
>     """fold subclass used for when multiple folds happen in a row
> 
>     We only want to fire the editor for the folded message once when
>@@ -770,11 +797,14 @@
>     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.
>-    """
>+    """),
>+        internal=True)
>+class _multifold(fold):
>     def skipprompt(self):
>         return True
> 
>- at addhisteditaction(["roll", "r"])
>+ at action(["roll", "r"],
>+        _("like fold, but discard this commit's description"))
> class rollup(fold):
>     def mergedescs(self):
>         return False
>@@ -782,13 +812,16 @@
>     def skipprompt(self):
>         return True
> 
>- at addhisteditaction(["drop", "d"])
>+ at action(["drop", "d"],
>+        _('remove commit from history'))
> class drop(histeditaction):
>     def run(self):
>         parentctx = self.repo[self.state.parentctxnode]
>         return parentctx, [(self.node, tuple())]
> 
>- at addhisteditaction(["mess", "m"])
>+ at action(["mess", "m"],
>+        _('edit commit message without changing commit content'),
>+        priority=True)
> class message(histeditaction):
>     def commiteditor(self):
>         return cmdutil.getcommiteditor(edit=True, editform='histedit.mess')
>@@ -1470,4 +1503,6 @@
>         ['histedit-state', False, True, _('histedit in progress'),
>          _("use 'hg histedit --continue' or 'hg histedit --abort'")])
>     if ui.configbool("experimental", "histeditng"):
>-        globals()['base'] = addhisteditaction(['base', 'b'])(base)
>+        globals()['base'] = action(['base', 'b'],
>+            _('checkout changeset and apply further changesets from there')
>+        )(base)
>_______________________________________________
>Mercurial-devel mailing list
>Mercurial-devel at selenic.com
>https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list