# HG changeset patch # User Yuya Nishihara # Date 1506852789 -3600 # Node ID a1b89c8ad32d957832fe71e3452a05f160980d0c # Parent 2c3b8fa3211ba2f66a54bdfc96b1777a419d0645 templater: add experimental support for extdata This is minimal and non-controversial implementation of extdata() template function. Originally extdata sources were exposed to the keyword namespace, but I've changed it to a plain function for simplicity. diff -r 2c3b8fa3211b -r a1b89c8ad32d mercurial/templater.py --- a/mercurial/templater.py Sun Oct 01 10:50:00 2017 +0100 +++ b/mercurial/templater.py Sun Oct 01 11:13:09 2017 +0100 @@ -24,6 +24,7 @@ registrar, revset as revsetmod, revsetlang, + scmutil, templatefilters, templatekw, util, @@ -593,6 +594,22 @@ return ''.join(chunks) +@templatefunc('extdata(source)', argspec='source') +def extdata(context, mapping, args): + """Show a text read from the specified extdata source. (EXPERIMENTAL)""" + if 'source' not in args: + # i18n: "extdata" is a keyword + raise error.ParseError(_('extdata expects one argument')) + + source = evalstring(context, mapping, args['source']) + cache = mapping['cache'].setdefault('extdata', {}) + ctx = mapping['ctx'] + if source in cache: + data = cache[source] + else: + data = cache[source] = scmutil.extdatasource(ctx.repo(), source) + return data.get(ctx.rev(), '') + @templatefunc('files(pattern)') def files(context, mapping, args): """All files of the current changeset matching the pattern. See diff -r 2c3b8fa3211b -r a1b89c8ad32d tests/test-extdata.t --- a/tests/test-extdata.t Sun Oct 01 10:50:00 2017 +0100 +++ b/tests/test-extdata.t Sun Oct 01 11:13:09 2017 +0100 @@ -10,12 +10,19 @@ $ cat <<'EOF' >> .hg/hgrc > [extdata] > filedata = file:extdata.txt + > notes = notes.txt > shelldata = shell:cat extdata.txt | grep 2 > EOF $ cat <<'EOF' > extdata.txt - > 2 + > 2 another comment on 2 > 3 > EOF + $ cat <<'EOF' > notes.txt + > f6ed this change is great! + > e834 this is buggy :( + > 0625 first post + > bogusnode gives no error + > EOF $ hg log -qr "extdata(filedata)" 2:f6ed99a58333 @@ -43,6 +50,31 @@ abort: unknown extdata source 'unknown' [255] +test template support: + + $ hg log -r:3 -T "{node|short}{if(extdata('notes'), ' # {extdata('notes')}')}\n" + 06254b906311 # first post + e8342c9a2ed1 # this is buggy :( + f6ed99a58333 # this change is great! + 9de260b1e88e + +test template cache: + + $ hg log -r:3 -T '{rev} "{extdata("notes")}" "{extdata("shelldata")}"\n' + 0 "first post" "" + 1 "this is buggy :(" "" + 2 "this change is great!" "another comment on 2" + 3 "" "" + +test bad extdata() template source + + $ hg log -T "{extdata()}\n" + hg: parse error: extdata expects one argument + [255] + $ hg log -T "{extdata('unknown')}\n" + abort: unknown extdata source 'unknown' + [255] + we don't fix up relative file URLs, but we do run shell commands in repo root $ mkdir sub