[PATCH] formatter: fixing bug that prevented labels from working

Kostia Balytskyi ikostia at fb.com
Thu Mar 3 11:31:32 EST 2016


I am aware that this fix is terribly hackish, but it feels like the original approach with ``repo = mapping.get('repo', '')`` was at least hackish in the same way. ``__ui`` is easily searchable in the codebase, so once someone decides to fix the original approach this additional thing should be easily removable as well.
Please let me know if this is not acceptable and there's a better way to solve the problem described in a commit message.



On 3/3/16, 4:27 PM, "Mercurial-devel on behalf of Kostia Balytskyi" <mercurial-devel-bounces at mercurial-scm.org on behalf of ikostia at fb.com> wrote:

># HG changeset patch
># User Kostia Balytskyi <ikostia at fb.com>
># Date 1457022116 28800
>#      Thu Mar 03 08:21:56 2016 -0800
># Node ID 09dd1768aafb67bc4c342fb5317b18c085231b7e
># Parent  4f7a5e4f2daff0a65aa470d9f70365ad55aaa100
>formatter: fixing bug that prevented labels from working
>
>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/hgext/color.py b/hgext/color.py
>--- a/hgext/color.py
>+++ b/hgext/color.py
>@@ -491,9 +491,13 @@ def templatelabel(context, mapping, args
> 
>     thing = args[1][0](context, mapping, args[1][1])
> 
>+    ui = mapping.get('__ui')
>     # apparently, repo could be a string that is the favicon?
>     repo = mapping.get('repo', '')
>-    if isinstance(repo, str):
>+    if not ui and not isinstance(repo, str):
>+        ui = repo.ui
>+
>+    if ui is None:
>         return thing
> 
>     label = args[0][0](context, mapping, args[0][1])
>@@ -501,7 +505,7 @@ def templatelabel(context, mapping, args
>     thing = templater.stringify(thing)
>     label = templater.stringify(label)
> 
>-    return repo.ui.label(thing, label)
>+    return ui.label(thing, label)
> 
> def uisetup(ui):
>     if ui.plain():
>diff --git a/mercurial/formatter.py b/mercurial/formatter.py
>--- a/mercurial/formatter.py
>+++ b/mercurial/formatter.py
>@@ -194,7 +194,7 @@ def lookuptemplate(ui, topic, tmpl):
> 
> def gettemplater(ui, topic, spec):
>     tmpl, mapfile = lookuptemplate(ui, topic, spec)
>-    t = templater.templater(mapfile, {})
>+    t = templater.templater(mapfile, {}, ui=ui)
>     if tmpl:
>         t.cache[topic] = tmpl
>     return t
>diff --git a/mercurial/templater.py b/mercurial/templater.py
>--- a/mercurial/templater.py
>+++ b/mercurial/templater.py
>@@ -863,7 +863,7 @@ class TemplateNotFound(error.Abort):
> class templater(object):
> 
>     def __init__(self, mapfile, filters=None, defaults=None, cache=None,
>-                 minchunk=1024, maxchunk=65536):
>+                 minchunk=1024, maxchunk=65536, ui=None):
>         '''set up template engine.
>         mapfile is name of file to read map definitions from.
>         filters is dict of functions. each transforms a value into another.
>@@ -886,6 +886,7 @@ class templater(object):
>         self.defaults = defaults
>         self.minchunk, self.maxchunk = minchunk, maxchunk
>         self.ecache = {}
>+        self.ui = ui
> 
>         if not mapfile:
>             return
>@@ -934,6 +935,7 @@ class templater(object):
>                                                  self.filters, self.defaults)
>         proc = self.ecache[ttype]
> 
>+        mapping['__ui'] = self.ui
>         stream = proc.process(t, mapping)
>         if self.minchunk:
>             stream = util.increasingchunks(stream, min=self.minchunk,
>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 at mercurial-scm.org
>https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=Pp-gQYFgs4tKlSFPF5kfCw&m=oZ_GwGGH5qmMSpoUmzhAOasOUsJqhyCCAyaOe2KoSOU&s=ZdOEohr6guIjiyfHiuZT-79OxMtzC5aG4h1smHtPcMM&e= 


More information about the Mercurial-devel mailing list