Submitter | Ryan McElroy |
---|---|
Date | June 6, 2015, 12:16 a.m. |
Message ID | <8e77e317b0c651b9cbd9.1433549768@devbig105.prn2.facebook.com> |
Download | mbox | patch |
Permalink | /patch/9537/ |
State | Accepted |
Headers | show |
Comments
On Fri, 5 Jun 2015 17:16:08 -0700, Ryan McElroy wrote: > # HG changeset patch > # User Ryan McElroy <rmcelroy@fb.com> > # Date 1428134632 25200 > # Sat Apr 04 01:03:52 2015 -0700 > # Node ID 8e77e317b0c651b9cbd9bee054f9b9a7d6912c1e > # Parent c39640d26a4c7546faef00b9e5c02af45ab8bf5e > templater: introduce indent function > > diff --git a/mercurial/templater.py b/mercurial/templater.py > --- a/mercurial/templater.py > +++ b/mercurial/templater.py > @@ -327,6 +327,30 @@ def pad(context, mapping, args): > else: > return text.ljust(width, fillchar) > > +def indent(context, mapping, args): > + """ > + :indent(text, indentchars, firstline): Indents all non-empty lines > + with the characters given in the indentchars string. An optional > + third parameter will override the indent for the first line only > + if present. > + > + Example: indent('hello\\n\\nworld', ' ', '> ') == "> hello\\n\\n world" > + """ > + if 2 > len(args) > 3: > + # i18n: "indent" is a keyword > + raise error.ParseError(_("indent() expects two or three arguments")) It will never be True, should be "not (2 <= len(args) <= 3)". https://docs.python.org/2/reference/expressions.html#not-in
On Fri, 2015-06-05 at 17:16 -0700, Ryan McElroy wrote: > # HG changeset patch > # User Ryan McElroy <rmcelroy@fb.com> > # Date 1428134632 25200 > # Sat Apr 04 01:03:52 2015 -0700 > # Node ID 8e77e317b0c651b9cbd9bee054f9b9a7d6912c1e > # Parent c39640d26a4c7546faef00b9e5c02af45ab8bf5e > templater: introduce indent function Queued for default, thanks. I've fixed the comparison in flight.
Patch
diff --git a/mercurial/templater.py b/mercurial/templater.py --- a/mercurial/templater.py +++ b/mercurial/templater.py @@ -327,6 +327,30 @@ def pad(context, mapping, args): else: return text.ljust(width, fillchar) +def indent(context, mapping, args): + """ + :indent(text, indentchars, firstline): Indents all non-empty lines + with the characters given in the indentchars string. An optional + third parameter will override the indent for the first line only + if present. + + Example: indent('hello\\n\\nworld', ' ', '> ') == "> hello\\n\\n world" + """ + if 2 > len(args) > 3: + # i18n: "indent" is a keyword + raise error.ParseError(_("indent() expects two or three arguments")) + + text = stringify(args[0][0](context, mapping, args[0][1])) + indent = stringify(args[1][0](context, mapping, args[1][1])) + + if len(args) == 3: + firstline = stringify(args[2][0](context, mapping, args[2][1])) + else: + firstline = indent + + # the indent function doesn't indent the first line, so we do it here + return templatefilters.indent(firstline + text, indent) + def get(context, mapping, args): """:get(dict, key): Get an attribute/key from an object. Some keywords are complex types. This function allows you to obtain the value of an @@ -607,6 +631,7 @@ funcs = { "if": if_, "ifcontains": ifcontains, "ifeq": ifeq, + "indent": indent, "join": join, "label": label, "pad": pad, diff --git a/tests/test-command-template.t b/tests/test-command-template.t --- a/tests/test-command-template.t +++ b/tests/test-command-template.t @@ -3252,3 +3252,21 @@ Test word for invalid numbers $ hg log -Gv -R a --template "{word('a', desc)}" hg: parse error: word expects an integer index [255] + +Test indent and not adding to empty lines + + $ hg log -T "-----\n{indent(desc, '>> ', ' > ')}\n" -r 0:1 -R a + ----- + > line 1 + >> line 2 + ----- + > other 1 + >> other 2 + + >> other 3 + +Test with non-strings like dates + + $ hg log -T "{indent(date, ' ')}\n" -r 2:3 -R a + 1200000.00 + 1300000.00