# HG changeset patch # User Yuya Nishihara # Date 1439903746 -32400 # Node ID 51f6940d3b4f9e0c879585344b8ec9ce93495047 # Parent 7012be5ab5bd2d433cd20a29b162dfb60f2e8252 templater: add optional timezone argument to localdate() The keyword extension uses "utcdate" for a different function, so we can't add new "utcdate" filter or function. Instead, this patch extends "localdate" to a general timezone converter. diff -r 7012be5ab5bd -r 51f6940d3b4f mercurial/help/templates.txt --- a/mercurial/help/templates.txt Tue Sep 01 19:15:16 2015 +0900 +++ b/mercurial/help/templates.txt Tue Aug 18 22:15:46 2015 +0900 @@ -69,6 +69,10 @@ $ hg log -r 0 --template "{date(date, '%Y')}\n" +- Display date in UTC:: + + $ hg log -r 0 --template "{localdate(date, 'UTC')|date}\n" + - Output the description set to a fill-width of 30:: $ hg log -r 0 --template "{fill(desc, 30)}" diff -r 7012be5ab5bd -r 51f6940d3b4f mercurial/templater.py --- a/mercurial/templater.py Tue Sep 01 19:15:16 2015 +0900 +++ b/mercurial/templater.py Tue Aug 18 22:15:46 2015 +0900 @@ -517,10 +517,11 @@ yield args[1][0](context, mapping, args[1][1]) def localdate(context, mapping, args): - """:localdate(date): Converts a date to local date.""" - if len(args) != 1: + """:localdate(date[, tz]): Converts a date to the specified timezone. + The default is local date.""" + if not (1 <= len(args) <= 2): # i18n: "localdate" is a keyword - raise error.ParseError(_("localdate expects one argument")) + raise error.ParseError(_("localdate expects one or two arguments")) date = evalfuncarg(context, mapping, args[0]) try: @@ -528,7 +529,19 @@ except AttributeError: # not str nor date tuple # i18n: "localdate" is a keyword raise error.ParseError(_("localdate expects a date information")) - tzoffset = util.makedate()[1] + if len(args) >= 2: + tzoffset = None + tz = evalfuncarg(context, mapping, args[1]) + if isinstance(tz, str): + tzoffset = util.parsetimezone(tz) + if tzoffset is None: + try: + tzoffset = int(tz) + except (TypeError, ValueError): + # i18n: "localdate" is a keyword + raise error.ParseError(_("localdate expects a timezone")) + else: + tzoffset = util.makedate()[1] return (date[0], tzoffset) def revset(context, mapping, args): diff -r 7012be5ab5bd -r 51f6940d3b4f tests/test-command-template.t --- a/tests/test-command-template.t Tue Sep 01 19:15:16 2015 +0900 +++ b/tests/test-command-template.t Tue Aug 18 22:15:46 2015 +0900 @@ -3109,6 +3109,25 @@ hg: parse error: get() expects a dict as first argument [255] +Test localdate(date, tz) function: + + $ TZ=JST-09 hg log -r0 -T '{date|localdate|isodate}\n' + 1970-01-01 09:00 +0900 + $ TZ=JST-09 hg log -r0 -T '{localdate(date, "UTC")|isodate}\n' + 1970-01-01 00:00 +0000 + $ TZ=JST-09 hg log -r0 -T '{localdate(date, "+0200")|isodate}\n' + 1970-01-01 02:00 +0200 + $ TZ=JST-09 hg log -r0 -T '{localdate(date, "0")|isodate}\n' + 1970-01-01 00:00 +0000 + $ TZ=JST-09 hg log -r0 -T '{localdate(date, 0)|isodate}\n' + 1970-01-01 00:00 +0000 + $ hg log -r0 -T '{localdate(date, "invalid")|isodate}\n' + hg: parse error: localdate expects a timezone + [255] + $ hg log -r0 -T '{localdate(date, date)|isodate}\n' + hg: parse error: localdate expects a timezone + [255] + Test shortest(node) function: $ echo b > b