Teach the built-in shell test runner in lit to handle '|&'-style pipes.

This is directly cloned from the logic in the TCL test bits of lit.
Hopefully will fix most of the windows build bot fallout.

llvm-svn: 159528
This commit is contained in:
Chandler Carruth 2012-07-02 13:10:15 +00:00
parent fff4579249
commit c13346fe54

View File

@ -134,6 +134,8 @@ class ShLexer:
if c == '|':
if self.maybe_eat('|'):
return ('||',)
if self.maybe_eat('&'):
return ('|&',)
return (c,)
if c == '&':
if self.maybe_eat('&'):
@ -205,7 +207,7 @@ class ShParser:
# Otherwise see if it is a terminator.
assert isinstance(tok, tuple)
if tok[0] in ('|',';','&','||','&&'):
if tok[0] in ('|','|&',';','&','||','&&'):
break
# Otherwise it must be a redirection.
@ -224,9 +226,18 @@ class ShParser:
negate = True
commands = [self.parse_command()]
while self.look() == ('|',):
self.lex()
commands.append(self.parse_command())
while 1:
tok = self.look()
if tok == ('|',):
self.lex()
commands.append(self.parse_command())
continue
if tok == ('|&',):
self.lex()
commands[-1].redirects.insert(0, (('>&',2),'1'))
commands.append(self.parse_command())
continue
break
return Pipeline(commands, negate)
def parse(self):