view tests/test-template-engine.t @ 37533:df4985497986

wireproto: implement capabilities for wire protocol v2 The capabilities mechanism for wire protocol version 2 represents a clean break from version 1. Instead of effectively exchanging a set of capabilities, we're exchanging a rich data structure. This data structure currently contains information about every available command, including its accepted arguments. It also contains information about supported compression formats. Exposing information about supported commands will allow clients to automatically generate bindings to the server. Clients will be able to do things like detect when they are attempting to run a command that isn't known to the server. Exposing the required permissions to run a command can be used by clients to determine if they have privileges to call a command before actually calling it. We could potentially even have clients send credentials preemptively without waiting for the server to deny the command request. Lots of potential here. The data returned by this command will likely evolve heavily. So we shouldn't bikeshed the implementation just yet. Differential Revision: https://phab.mercurial-scm.org/D3200
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 09 Apr 2018 11:52:31 -0700
parents 7d3bc1d4e871
children
line wrap: on
line source


  $ cat > engine.py << EOF
  > 
  > from mercurial import (
  >     pycompat,
  >     templater,
  >     templateutil,
  > )
  > 
  > class mytemplater(templater.engine):
  >     def _load(self, t):
  >         return self._loader(t)
  > 
  >     def process(self, t, map):
  >         tmpl = self._load(t)
  >         props = self._defaults.copy()
  >         props.update(map)
  >         for k, v in props.items():
  >             if b'{{%s}}' % k not in tmpl:
  >                 continue
  >             if callable(v) and getattr(v, '_requires', None) is None:
  >                 props = self._resources.copy()
  >                 props.update(map)
  >                 v = v(**pycompat.strkwargs(props))
  >             elif callable(v):
  >                 v = v(self, props)
  >             v = templateutil.stringify(self, props, v)
  >             tmpl = tmpl.replace(b'{{%s}}' % k, v)
  >         yield tmpl
  > 
  > templater.engines[b'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
  adding changeset.txt
  adding mymap
  $ hg log --style=./mymap
  0 97e5f848f0936960273bbf75be6388cd0350a32b test

  $ cat > changeset.txt << EOF
  > {{p1rev}} {{p1node}} {{p2rev}} {{p2node}}
  > EOF
  $ hg ci -Ama
  $ hg log --style=./mymap
  0 97e5f848f0936960273bbf75be6388cd0350a32b -1 0000000000000000000000000000000000000000
  -1 0000000000000000000000000000000000000000 -1 0000000000000000000000000000000000000000

invalid engine type:

  $ echo 'changeset = unknown:changeset.txt' > unknownenginemap
  $ hg log --style=./unknownenginemap
  abort: invalid template engine: unknown
  [255]

  $ cd ..