commit edc3cac54b37ae4620334736fbca91d2689b8d87 Author: Nick Mathewson nickm@torproject.org Date: Tue May 14 13:00:49 2019 -0400
Add a new templating feature to find files in PATH
We'll use this to specify the location of a pluggable transport. --- lib/chutney/Templating.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/lib/chutney/Templating.py b/lib/chutney/Templating.py index 1e97cbe..6560e25 100755 --- a/lib/chutney/Templating.py +++ b/lib/chutney/Templating.py @@ -230,7 +230,6 @@ class Environ(_DictWrapper): s.update(name[5:] for name in dir(self) if name.startswith("_get_")) return s
- class IncluderDict(_DictWrapper):
"""Helper to implement ${include:} template substitution. Acts as a @@ -279,6 +278,33 @@ class IncluderDict(_DictWrapper): def getUpdateTime(self): return self._st_mtime
+class PathDict(_DictWrapper): + """ + Implements ${path:} patterns, which map ${path:foo} to the location + of 'foo' in the PATH environment variable. + """ + def __init__(self, parent, path=None): + _DictWrapper.__init__(self, parent) + if path is None: + path = os.getenv('PATH').split(":") + self._path = path + + def _getitem(self, key, my): + if not key.startswith("path:"): + raise KeyError(key) + + key = key[len("path:"):] + + for location in self._path: + p = os.path.join(location, key) + try: + s = os.stat(p) + if s and s.st_mode & 0x111: + return p + except OSError: + pass + + raise KeyError(key)
class _BetterTemplate(string.Template):
@@ -355,6 +381,7 @@ class Template(object): values in the mapping 'values'. """ values = IncluderDict(values, self._includePath) + values = PathDict(values) orig_val = self._pat nIterations = 0 while True:
tor-commits@lists.torproject.org