[PATCH] histedit: editcomment method to histedit actions

Augie Fackler raf at durin42.com
Wed Dec 9 11:57:25 CST 2015


On Tue, Dec 08, 2015 at 11:46:10AM -0800, Mateusz Kwapich wrote:
> # HG changeset patch
> # User Mateusz Kwapich <mitrandir at fb.com>
> # Date 1449603153 28800
> #      Tue Dec 08 11:32:33 2015 -0800
> # Node ID b7f518564771929ff03a57523fdaba2b8121ac0d
> # Parent  93f42371f4b0ebbe28fc93233283f08da788ee26
> histedit: editcomment method to histedit actions

Nice. Queued, though bonus points if (as a follow-up) you can figure
out how to derive the "p, pick" part of the line from the command
definition. I think you could do something like set a actionstrings
attribute on the class using the class decorator and then scrape that
out later.

>
> Let each action show its own help in histedit editor. The comments
> have priorities for sorting purposes.
>
> diff --git a/hgext/histedit.py b/hgext/histedit.py
> --- a/hgext/histedit.py
> +++ b/hgext/histedit.py
> @@ -207,21 +207,6 @@
>  # leave the attribute unspecified.
>  testedwith = 'internal'
>
> -# i18n: command names and abbreviations must remain untranslated
> -editcomment = _("""# Edit history between %s and %s
> -#
> -# Commits are listed from least to most recent
> -#
> -# Commands:
> -#  p, pick = use commit
> -#  e, edit = use commit, but stop for amending
> -#  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
> -#  m, mess = edit commit message without changing commit content
> -#
> -""")
> -
>  class histeditstate(object):
>      def __init__(self, repo, parentctxnode=None, actions=None, keep=None,
>              topmost=None, replacements=None, lock=None, wlock=None):
> @@ -445,6 +430,15 @@
>              return ctx, []
>          return ctx, [(self.node, (ctx.node(),))]
>
> +    @classmethod
> +    def editcomment(self):
> +        """Return a help line which will be visible as a coments below initial
> +        rules. Your line should <= 78 charactes ("# " will be prepended).
> +
> +        For example for pick command you can return "p, pick = use commit"
> +        """
> +        return None
> +
>  def commitfuncfor(repo, src):
>      """Build a commit function for the replacement of <src>
>
> @@ -589,6 +583,10 @@
>
>  @addhisteditaction(['pick', 'p'])
>  class pick(histeditaction):
> +    @classmethod
> +    def editcomment(self):
> +        return 10, _("p, pick = use commit")
> +
>      def run(self):
>          rulectx = self.repo[self.node]
>          if rulectx.parents()[0].node() == self.state.parentctxnode:
> @@ -599,6 +597,10 @@
>
>  @addhisteditaction(['edit', 'e'])
>  class edit(histeditaction):
> +    @classmethod
> +    def editcomment(self):
> +        return 20, _("e, edit = use commit, but stop for amending")
> +
>      def run(self):
>          repo = self.repo
>          rulectx = repo[self.node]
> @@ -614,6 +616,10 @@
>
>  @addhisteditaction(['fold', 'f'])
>  class fold(histeditaction):
> +    @classmethod
> +    def editcomment(self):
> +        return 30, _("f, fold = use commit, but combine it with the one above")
> +
>      def continuedirty(self):
>          repo = self.repo
>          rulectx = repo[self.node]
> @@ -733,11 +739,19 @@
>      when the last fold operation runs we can show the user all the
>      commit messages in their editor.
>      """
> +    @classmethod
> +    def editcomment(self):
> +        return None
> +
>      def skipprompt(self):
>          return True
>
>  @addhisteditaction(["roll", "r"])
>  class rollup(fold):
> +    @classmethod
> +    def editcomment(self):
> +        return 40, _("r, roll = like fold, but discard this commit's description")
> +
>      def mergedescs(self):
>          return False
>
> @@ -746,12 +760,20 @@
>
>  @addhisteditaction(["drop", "d"])
>  class drop(histeditaction):
> +    @classmethod
> +    def editcomment(self):
> +        return 50, _("d, drop = remove commit from history")
> +
>      def run(self):
>          parentctx = self.repo[self.state.parentctxnode]
>          return parentctx, [(self.node, tuple())]
>
>  @addhisteditaction(["mess", "m"])
>  class message(histeditaction):
> +    @classmethod
> +    def editcomment(self):
> +        return 60, _("m, mess = edit commit message without changing commit content")
> +
>      def commiteditor(self):
>          return cmdutil.getcommiteditor(edit=True, editform='histedit.mess')
>
> @@ -951,7 +973,7 @@
>      elif goal == 'edit-plan':
>          state.read()
>          if not rules:
> -            comment = editcomment % (node.short(state.parentctxnode),
> +            comment = editcomment(node.short(state.parentctxnode),
>                                       node.short(state.topmost))
>              rules = ruleeditor(repo, ui, state.actions, comment)
>          else:
> @@ -1036,7 +1058,7 @@
>
>          ctxs = [repo[r] for r in revs]
>          if not rules:
> -            comment = editcomment % (node.short(root), node.short(topmost))
> +            comment = editcomment(node.short(root), node.short(topmost))
>              actions = [pick(state, r) for r in revs]
>              rules = ruleeditor(repo, ui, actions, comment)
>          else:
> @@ -1157,6 +1179,19 @@
>                               hint=_('see "hg help phases" for details'))
>      return [c.node() for c in ctxs]
>
> +def editcomment(old, new):
> +    pricomments = filter(None, [act.editcomment() for act in actionlist])
> +    comments = [comment for (pri, comment) in sorted(pricomments)]
> +    return _("""# Edit history between %s and %s
> +#
> +# Commits are listed from least to most recent
> +#
> +# Commands:
> +%s
> +#
> +"""
> +             ) % (old, new, '\n'.join(["#  %s" % c for c in comments]))
> +
>  def ruleeditor(repo, ui, actions, editcomment=""):
>      """open an editor to edit rules
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list