Index: third_party/lit/lit/ShCommands.py |
diff --git a/third_party/lit/lit/ShCommands.py b/third_party/lit/lit/ShCommands.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9ca9e8c91c0d404174c8aae1c468defe1691d352 |
--- /dev/null |
+++ b/third_party/lit/lit/ShCommands.py |
@@ -0,0 +1,85 @@ |
+class Command: |
+ def __init__(self, args, redirects): |
+ self.args = list(args) |
+ self.redirects = list(redirects) |
+ |
+ def __repr__(self): |
+ return 'Command(%r, %r)' % (self.args, self.redirects) |
+ |
+ def __eq__(self, other): |
+ if not isinstance(other, Command): |
+ return False |
+ |
+ return ((self.args, self.redirects) == |
+ (other.args, other.redirects)) |
+ |
+ def toShell(self, file): |
+ for arg in self.args: |
+ if "'" not in arg: |
+ quoted = "'%s'" % arg |
+ elif '"' not in arg and '$' not in arg: |
+ quoted = '"%s"' % arg |
+ else: |
+ raise NotImplementedError('Unable to quote %r' % arg) |
+ file.write(quoted) |
+ |
+ # For debugging / validation. |
+ import ShUtil |
+ dequoted = list(ShUtil.ShLexer(quoted).lex()) |
+ if dequoted != [arg]: |
+ raise NotImplementedError('Unable to quote %r' % arg) |
+ |
+ for r in self.redirects: |
+ if len(r[0]) == 1: |
+ file.write("%s '%s'" % (r[0][0], r[1])) |
+ else: |
+ file.write("%s%s '%s'" % (r[0][1], r[0][0], r[1])) |
+ |
+class Pipeline: |
+ def __init__(self, commands, negate=False, pipe_err=False): |
+ self.commands = commands |
+ self.negate = negate |
+ self.pipe_err = pipe_err |
+ |
+ def __repr__(self): |
+ return 'Pipeline(%r, %r, %r)' % (self.commands, self.negate, |
+ self.pipe_err) |
+ |
+ def __eq__(self, other): |
+ if not isinstance(other, Pipeline): |
+ return False |
+ |
+ return ((self.commands, self.negate, self.pipe_err) == |
+ (other.commands, other.negate, self.pipe_err)) |
+ |
+ def toShell(self, file, pipefail=False): |
+ if pipefail != self.pipe_err: |
+ raise ValueError('Inconsistent "pipefail" attribute!') |
+ if self.negate: |
+ file.write('! ') |
+ for cmd in self.commands: |
+ cmd.toShell(file) |
+ if cmd is not self.commands[-1]: |
+ file.write('|\n ') |
+ |
+class Seq: |
+ def __init__(self, lhs, op, rhs): |
+ assert op in (';', '&', '||', '&&') |
+ self.op = op |
+ self.lhs = lhs |
+ self.rhs = rhs |
+ |
+ def __repr__(self): |
+ return 'Seq(%r, %r, %r)' % (self.lhs, self.op, self.rhs) |
+ |
+ def __eq__(self, other): |
+ if not isinstance(other, Seq): |
+ return False |
+ |
+ return ((self.lhs, self.op, self.rhs) == |
+ (other.lhs, other.op, other.rhs)) |
+ |
+ def toShell(self, file, pipefail=False): |
+ self.lhs.toShell(file, pipefail) |
+ file.write(' %s\n' % self.op) |
+ self.rhs.toShell(file, pipefail) |