[PATCH 3 of 3] templater: make the templating engine pluggable to some extent

John Mulligan phlogistonjohn at asynchrono.us
Mon Apr 6 16:53:30 UTC 2009


On Mon, Apr 06, 2009 at 05:44:32PM +0200, Dirkjan Ochtman wrote:
> # HG changeset patch
> # User Dirkjan Ochtman <dirkjan at ochtman.nl>
> # Date 1239025294 -7200
> # Node ID 5d100d5981b555f036d1b544e7b19928cd8d5660
> # Parent  e5273a9182109eb5489598ad25425659ec0b66e5
> templater: make the templating engine pluggable to some extent
> 
> diff -r e5273a918210 -r 5d100d5981b5 mercurial/templater.py
> --- a/mercurial/templater.py	Mon Apr 06 16:28:30 2009 +0200
> +++ b/mercurial/templater.py	Mon Apr 06 15:41:34 2009 +0200
> @@ -105,6 +105,8 @@
>                          v = self.filters[f](v)
>                  yield v
>  
> +engines = {'default': engine}
> +
>  class templater(object):
>  
>      def __init__(self, mapfile, filters={}, defaults={}, cache={},
> @@ -121,6 +123,7 @@
>          self.filters.update(filters)
>          self.defaults = defaults
>          self.minchunk, self.maxchunk = minchunk, maxchunk
> +        self.engines = {}
>  
>          if not mapfile:
>              return
> @@ -142,6 +145,7 @@
>                          raise SyntaxError('%s:%s: %s' %
>                                            (mapfile, i, inst.args[0]))
>                  else:
> +                    val = val.split(':', 1)[-1] # strip engine from path
>                      self.map[key] = os.path.join(self.base, val)
>              else:
>                  raise SyntaxError(_("%s:%s: parse error") % (mapfile, i))
> @@ -160,7 +164,16 @@
>          return self.cache[t]
>  
>      def __call__(self, t, **map):
> -        proc = engine(self.load, self.filters, self.defaults)
> +
> +        ttype = 'default'
> +        if ':' in t:
> +            ttype, t = s.split(':', 1)
> +
> +        proc = self.engines.get(ttype)
> +        if proc is None:
> +            proc = engines[ttype](self.load, self.filters, self.defaults)
> +            self.engines[ttype] = proc
> +
>          stream = proc.process(t, map)
>          if self.minchunk:
>              stream = util.increasingchunks(stream, min=self.minchunk,
> diff -r e5273a918210 -r 5d100d5981b5 tests/test-template-engine
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/tests/test-template-engine	Mon Apr 06 15:41:34 2009 +0200
> @@ -0,0 +1,33 @@
> +#!/bin/sh
> +
> +cat > engine.py << EOF
> +
> +class mytemplater(object):
> +    def __init__(self, load, filters, defaults):
> +        self.loader = loader

Where does loader come from, could this be a typo?
I put a print statement in here as an experiment, but didn't
get any results. So, I'm not even sure  if this class is being
used by the templater.

> +
> +    def process(self, t, map):
> +        tmpl = self.loader(t)
> +        for k, v in map.iteritems():
> +            tmpl = tmpl.replace('{%k}' % k, v)
> +        yield tmpl
> +
> +from mercurial import templater
> +templater.engines['my'] = mytemplater
> +EOF
> +
> +hg init test
> +echo '[extensions]' > test/.hg/hgrc
> +echo "engine = $PWD/engine.py" >> test/.hg/hgrc
> +
> +cd test
> +cat > mymap << EOF
> +changeset = my:changeset.txt
> +EOF
> +
> +cat > changeset.txt << EOF
> +{rev} {node} {author}
> +EOF
> +
> +hg ci -Ama
> +hg log --style=./mymap
> diff -r e5273a918210 -r 5d100d5981b5 tests/test-template-engine.out
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/tests/test-template-engine.out	Mon Apr 06 15:41:34 2009 +0200
> @@ -0,0 +1,3 @@
> +adding changeset.txt
> +adding mymap
> +0 307664789dc62d1fed343662ea29b0e77b17546b test
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
> 


More information about the Mercurial-devel mailing list