Mercurial > hg
changeset 36670:44048f1bcee5
templater: provide hint for multi-line templates with parse errors
Previously, we punted. Now we "rewrite" the template's newlines to r'\n' and
offset the hint appropriately.
Differential Revision: https://phab.mercurial-scm.org/D2609
author | Ryan McElroy <rmcelroy@fb.com> |
---|---|
date | Sat, 03 Mar 2018 14:30:21 -0800 |
parents | 80d7fb6c2dec |
children | 34e2ff1f9cd8 |
files | mercurial/templater.py tests/test-log.t |
diffstat | 2 files changed, 12 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/templater.py Sat Mar 03 14:23:40 2018 -0800 +++ b/mercurial/templater.py Sat Mar 03 14:30:21 2018 -0800 @@ -246,14 +246,16 @@ except error.ParseError as inst: if len(inst.args) > 1: # has location loc = inst.args[1] - # TODO: Opportunity for improvement! If there is a newline in the - # template, this hint does not point to the right place, so skip. - if '\n' not in tmpl: - # We want the caret to point to the place in the template that - # failed to parse, but in a hint we get a open paren at the - # start. Therefore, we print "loc" spaces (instead of "loc - 1") - # to line up the caret with the location of the error. - inst.hint = tmpl + '\n' + ' ' * (loc) + '^ ' + _('here') + # Offset the caret location by the number of newlines before the + # location of the error, since we will replace one-char newlines + # with the two-char literal r'\n'. + offset = tmpl[:loc].count('\n') + tmpl = tmpl.replace('\n', br'\n') + # We want the caret to point to the place in the template that + # failed to parse, but in a hint we get a open paren at the + # start. Therefore, we print "loc" spaces (instead of "loc - 1") + # to line up the caret with the location of the error. + inst.hint = tmpl + '\n' + ' ' * (loc + offset) + '^ ' + _('here') raise yield ('end', None, pos)