Teach the built-in shell test runner in lit to handle '|&'-style pipes.
authorChandler Carruth <chandlerc@gmail.com>
Mon, 2 Jul 2012 13:10:15 +0000 (13:10 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 2 Jul 2012 13:10:15 +0000 (13:10 +0000)
This is directly cloned from the logic in the TCL test bits of lit.
Hopefully will fix most of the windows build bot fallout.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159528 91177308-0d34-0410-b5e6-96231b3b80d8

utils/lit/lit/ShUtil.py

index dda622a48a8487cbede5ad84d926210865eb0f66..0c5bdac408a7d689310a449d05f1c6022802c746 100644 (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):