Patchwork [v3] formatter: make labels work with templated output

login
register
mail settings
Submitter Kostia Balytskyi
Date March 8, 2016, 1:10 p.m.
Message ID <89552f1824bbc2bdbd8b.1457442659@dev1902.lla1.facebook.com>
Download mbox | patch
Permalink /patch/13673/
State Accepted
Headers show

Comments

Kostia Balytskyi - March 8, 2016, 1:10 p.m.
# HG changeset patch
# User Kostia Balytskyi <ikostia@fb.com>
# Date 1457438913 28800
#      Tue Mar 08 04:08:33 2016 -0800
# Node ID 89552f1824bbc2bdbd8bc5b5f55e2ab8544f9fe8
# Parent  85cba1c5c22c842209588d8da99da174ff4313cd
formatter: make labels work with templated output

To describe the bug this fix is addressing, one can do
   ``$ hg status -T "{label('red', path)}\n" --color=debug``
and observe that the label is not applied before my fix and applied with it.
Augie Fackler - March 8, 2016, 2:56 p.m.
On Tue, Mar 08, 2016 at 05:10:59AM -0800, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia@fb.com>
> # Date 1457438913 28800
> #      Tue Mar 08 04:08:33 2016 -0800
> # Node ID 89552f1824bbc2bdbd8bc5b5f55e2ab8544f9fe8
> # Parent  85cba1c5c22c842209588d8da99da174ff4313cd
> formatter: make labels work with templated output

queued, thanks

>
> To describe the bug this fix is addressing, one can do
>    ``$ hg status -T "{label('red', path)}\n" --color=debug``
> and observe that the label is not applied before my fix and applied with it.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -1502,6 +1502,7 @@ class changeset_templater(changeset_prin
>          props['templ'] = self.t
>          props['ctx'] = ctx
>          props['repo'] = self.repo
> +        props['ui'] = self.repo.ui
>          props['revcache'] = {'copies': copies}
>          props['cache'] = self.cache
>
> diff --git a/mercurial/formatter.py b/mercurial/formatter.py
> --- a/mercurial/formatter.py
> +++ b/mercurial/formatter.py
> @@ -153,7 +153,7 @@ class templateformatter(baseformatter):
>          self._topic = topic
>          self._t = gettemplater(ui, topic, opts.get('template', ''))
>      def _showitem(self):
> -        g = self._t(self._topic, **self._item)
> +        g = self._t(self._topic, ui=self._ui, **self._item)
>          self._ui.write(templater.stringify(g))
>
>  def lookuptemplate(ui, topic, tmpl):
> diff --git a/mercurial/templater.py b/mercurial/templater.py
> --- a/mercurial/templater.py
> +++ b/mercurial/templater.py
> @@ -549,16 +549,15 @@ def label(context, mapping, args):
>
>      thing = evalstring(context, mapping, args[1])
>
> -    # apparently, repo could be a string that is the favicon?
> -    repo = mapping.get('repo', '')
> -    if isinstance(repo, str):
> +    ui = mapping.get('ui', '')
> +    if isinstance(ui, str):
>          return thing
>
>      # preserve unknown symbol as literal so effects like 'red', 'bold',
>      # etc. don't need to be quoted
>      label = evalstringliteral(context, mapping, args[0])
>
> -    return repo.ui.label(thing, label)
> +    return ui.label(thing, label)
>
>  def latesttag(context, mapping, args):
>      """:latesttag([pattern]): The global tags matching the given pattern on the
> diff --git a/tests/test-status-color.t b/tests/test-status-color.t
> --- a/tests/test-status-color.t
> +++ b/tests/test-status-color.t
> @@ -30,6 +30,15 @@ hg status in repo root:
>    [status.unknown|? ][status.unknown|b/in_b]
>    [status.unknown|? ][status.unknown|in_root]
>
> +hg status with template
> +  $ hg status -T "{label('red', path)}\n" --color=debug
> +  [red|a/1/in_a_1]
> +  [red|a/in_a]
> +  [red|b/1/in_b_1]
> +  [red|b/2/in_b_2]
> +  [red|b/in_b]
> +  [red|in_root]
> +
>  hg status . in repo root:
>
>    $ hg status --color=always .
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1502,6 +1502,7 @@  class changeset_templater(changeset_prin
         props['templ'] = self.t
         props['ctx'] = ctx
         props['repo'] = self.repo
+        props['ui'] = self.repo.ui
         props['revcache'] = {'copies': copies}
         props['cache'] = self.cache
 
diff --git a/mercurial/formatter.py b/mercurial/formatter.py
--- a/mercurial/formatter.py
+++ b/mercurial/formatter.py
@@ -153,7 +153,7 @@  class templateformatter(baseformatter):
         self._topic = topic
         self._t = gettemplater(ui, topic, opts.get('template', ''))
     def _showitem(self):
-        g = self._t(self._topic, **self._item)
+        g = self._t(self._topic, ui=self._ui, **self._item)
         self._ui.write(templater.stringify(g))
 
 def lookuptemplate(ui, topic, tmpl):
diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -549,16 +549,15 @@  def label(context, mapping, args):
 
     thing = evalstring(context, mapping, args[1])
 
-    # apparently, repo could be a string that is the favicon?
-    repo = mapping.get('repo', '')
-    if isinstance(repo, str):
+    ui = mapping.get('ui', '')
+    if isinstance(ui, str):
         return thing
 
     # preserve unknown symbol as literal so effects like 'red', 'bold',
     # etc. don't need to be quoted
     label = evalstringliteral(context, mapping, args[0])
 
-    return repo.ui.label(thing, label)
+    return ui.label(thing, label)
 
 def latesttag(context, mapping, args):
     """:latesttag([pattern]): The global tags matching the given pattern on the
diff --git a/tests/test-status-color.t b/tests/test-status-color.t
--- a/tests/test-status-color.t
+++ b/tests/test-status-color.t
@@ -30,6 +30,15 @@  hg status in repo root:
   [status.unknown|? ][status.unknown|b/in_b]
   [status.unknown|? ][status.unknown|in_root]
 
+hg status with template
+  $ hg status -T "{label('red', path)}\n" --color=debug
+  [red|a/1/in_a_1]
+  [red|a/in_a]
+  [red|b/1/in_b_1]
+  [red|b/2/in_b_2]
+  [red|b/in_b]
+  [red|in_root]
+
 hg status . in repo root:
 
   $ hg status --color=always .