Commits

Anonymous committed 4314a5a

Test portability fix. Fix handling of >.

  • Participants
  • Parent commits 152eb34

Comments (0)

Files changed (4)

src/engine/SCons/Util.py

 
             if not self.in_strip or self.mode != SUBST_SIG:
                 try:
-                    y = self[-1][-1] + x
+                    current_word = self[-1][-1]
                 except IndexError:
                     self.add_new_word(x)
                 else:
-                    literal1 = self.literal(self[-1][-1])
-                    literal2 = self.literal(x)
-                    y = self.conv(y)
-                    if is_String(y):
-                        y = CmdStringHolder(y, literal1 or literal2)
-                    self[-1][-1] = y
+                    # All right, this is a hack and it should probably
+                    # be refactored out of existence in the future.
+                    # The issue is that we want to smoosh words together
+                    # and make one file name that gets escaped if
+                    # we're expanding something like foo$EXTENSION,
+                    # but we don't want to smoosh them together if
+                    # it's something like >$TARGET, because then we'll
+                    # treat the '>' like it's part of the file name.
+                    # So for now, just hard-code looking for the special
+                    # command-line redirection characters...
+                    try:
+                        last_char = str(current_word)[-1]
+                    except IndexError:
+                        last_char = '\0'
+                    if last_char in '<>|':
+                        self.add_new_word(x)
+                    else:
+                        y = current_word + x
+                        literal1 = self.literal(self[-1][-1])
+                        literal2 = self.literal(x)
+                        y = self.conv(y)
+                        if is_String(y):
+                            y = CmdStringHolder(y, literal1 or literal2)
+                        self[-1][-1] = y
 
         def add_new_word(self, x):
             if not self.in_strip or self.mode != SUBST_SIG:

src/engine/SCons/UtilTests.py

 
             # Bug reported by Christoph Wiedemann.
             cvt('$xxx/bin'),        [['/bin']],
+
+            # Test variables smooshed together with different prefixes.
+            'foo$AAA',              [['fooa']],
+            '<$AAA',                [['<', 'a']],
+            '>$AAA',                [['>', 'a']],
+            '|$AAA',                [['|', 'a']],
         ]
 
         kwargs = {'target' : target, 'source' : source}
 Test that the Flatten() function is available and works.
 """
 
+import string
+
 import TestSCons
 
 test = TestSCons.TestSCons()
 test.write('file2a.in', "file2a.in\n")
 test.write('file2b.in', "file2b.in\n")
 
+def double_backslash(f):
+    p = test.workpath(f)
+    return string.replace(p, '\\', '\\\\')
+
 expect = """\
 ['begin', '%s', 'middle', '%s', 'end']
 ['%s', 'a', 'b', 'c', '%s']
 [1, 2, 3, 4]
 [1, 2, 3, 4]
-""" % (test.workpath('file1.out'), test.workpath('file2.out'),
-       test.workpath('file1.out'), test.workpath('file2.out'))
+""" % (double_backslash('file1.out'), double_backslash('file2.out'),
+       double_backslash('file1.out'), double_backslash('file2.out'))
 
 test.run(chdir = "work",
          arguments = ".",

test/redirection.py

             action= '%s cat.py < $SOURCES > $TARGET')
 env.Command(target='foo3', source='bar3',
             action='%s cat.py $SOURCES | %s cat.py > $TARGET')
-""" % (python, python, python, python))
+env.Command(target='foo4', source='bar4',
+            action='%s cat.py <$SOURCES |%s cat.py >$TARGET')
+""" % (python, python, python, python, python, python))
 
 test.write('bar1', 'bar1\r\n')
 test.write('bar2', 'bar2\r\n')
 test.write('bar3', 'bar3\r\n')
+test.write('bar4', 'bar4\r\n')
 
 test.run(arguments='.')
+
 test.fail_test(test.read('foo1') != 'bar1\r\n')
 test.fail_test(test.read('foo2') != 'bar2\r\n')
 test.fail_test(test.read('foo3') != 'bar3\r\n')
+test.fail_test(test.read('foo4') != 'bar4\r\n')
 
 test.pass_test()