X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e32be386f2378807a79da5810414982769aa046c..b526df9ab5269735bce42af3ed9fbe777e513093:/crunch_scripts/crunchutil/subst.py diff --git a/crunch_scripts/crunchutil/subst.py b/crunch_scripts/crunchutil/subst.py index 13c6aa0151..bd99d3c71c 100644 --- a/crunch_scripts/crunchutil/subst.py +++ b/crunch_scripts/crunchutil/subst.py @@ -1,9 +1,12 @@ -import os import glob +import os +import re +import stat + +BACKSLASH_ESCAPE_RE = re.compile(r'\\(.)') class SubstitutionError(Exception): - def __init__(self, message): - super(SubstitutionError, self).__init__(message) + pass def search(c): DEFAULT = 0 @@ -36,13 +39,23 @@ def search(c): return None def sub_file(v): - return os.path.join(os.environ['TASK_KEEPMOUNT'], v) + path = os.path.join(os.environ['TASK_KEEPMOUNT'], v) + st = os.stat(path) + if st and stat.S_ISREG(st.st_mode): + return path + else: + raise SubstitutionError("$(file {}) is not accessible or is not a regular file".format(path)) def sub_dir(v): d = os.path.dirname(v) if d == '': d = v - return os.path.join(os.environ['TASK_KEEPMOUNT'], d) + path = os.path.join(os.environ['TASK_KEEPMOUNT'], d) + st = os.stat(path) + if st and stat.S_ISDIR(st.st_mode): + return path + else: + raise SubstitutionError("$(dir {}) is not accessible or is not a directory".format(path)) def sub_basename(v): return os.path.splitext(os.path.basename(v))[0] @@ -50,7 +63,7 @@ def sub_basename(v): def sub_glob(v): l = glob.glob(v) if len(l) == 0: - raise SubstitutionError("$(glob): No match on '%s'" % v) + raise SubstitutionError("$(glob {}) no match found".format(v)) else: return l[0] @@ -63,7 +76,7 @@ def do_substitution(p, c, subs=default_subs): while True: m = search(c) if m is None: - return c + return BACKSLASH_ESCAPE_RE.sub(r'\1', c) v = do_substitution(p, c[m[0]+2 : m[1]]) var = True @@ -79,7 +92,7 @@ def do_substitution(p, c, subs=default_subs): raise SubstitutionError("Unknown variable or function '%s' while performing substitution on '%s'" % (v, c)) if r is None: raise SubstitutionError("Substitution for '%s' is null while performing substitution on '%s'" % (v, c)) - if not (isinstance(r, str) or isinstance(r, unicode)): + if not isinstance(r, basestring): raise SubstitutionError("Substitution for '%s' must be a string while performing substitution on '%s'" % (v, c)) c = c[:m[0]] + r + c[m[1]+1:]