From 89138b39a5b3bd2a70d9682b2ad41c84016573ce Mon Sep 17 00:00:00 2001 From: stevenknight Date: Tue, 17 Aug 2004 07:16:58 +0000 Subject: [PATCH] Test portability fix. Fix handling of >. git-svn-id: http://scons.tigris.org/svn/scons/trunk@1032 fdb21ef1-2011-0410-befe-b5e4ea1792b1 --- src/engine/SCons/Util.py | 32 +++++++++++++++++++++++++------- src/engine/SCons/UtilTests.py | 6 ++++++ test/Flatten.py | 10 ++++++++-- test/redirection.py | 7 ++++++- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py index 25cea2f4..ea5d7f65 100644 --- a/src/engine/SCons/Util.py +++ b/src/engine/SCons/Util.py @@ -803,16 +803,34 @@ def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, di 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: diff --git a/src/engine/SCons/UtilTests.py b/src/engine/SCons/UtilTests.py index fb9f14c1..0cda4614 100644 --- a/src/engine/SCons/UtilTests.py +++ b/src/engine/SCons/UtilTests.py @@ -652,6 +652,12 @@ class UtilTestCase(unittest.TestCase): # 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} diff --git a/test/Flatten.py b/test/Flatten.py index 7679bdb0..1b98f669 100644 --- a/test/Flatten.py +++ b/test/Flatten.py @@ -28,6 +28,8 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" Test that the Flatten() function is available and works. """ +import string + import TestSCons test = TestSCons.TestSCons() @@ -60,13 +62,17 @@ test.write('file1.in', "file1.in\n") 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 = ".", diff --git a/test/redirection.py b/test/redirection.py index cc356c60..5aac5176 100644 --- a/test/redirection.py +++ b/test/redirection.py @@ -49,16 +49,21 @@ env.Command(target='foo2', source='bar2', 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() -- 2.26.2