[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