Index: llvm/trunk/utils/lit/lit/TestRunner.py =================================================================== --- llvm/trunk/utils/lit/lit/TestRunner.py +++ llvm/trunk/utils/lit/lit/TestRunner.py @@ -23,7 +23,7 @@ import lit.ShUtil as ShUtil import lit.Test as Test import lit.util -from lit.util import to_bytes, to_string +from lit.util import to_bytes, to_string, to_unicode from lit.BooleanExpression import BooleanExpression class InternalShellError(Exception): @@ -344,8 +344,11 @@ stderr = StringIO() exitCode = 0 for dir in args: + cwd = cmd_shenv.cwd + dir = to_unicode(dir) if kIsWindows else to_bytes(dir) + cwd = to_unicode(cwd) if kIsWindows else to_bytes(cwd) if not os.path.isabs(dir): - dir = os.path.realpath(os.path.join(cmd_shenv.cwd, dir)) + dir = os.path.realpath(os.path.join(cwd, dir)) if parent: lit.util.mkdir_p(dir) else: @@ -598,8 +601,11 @@ stderr = StringIO() exitCode = 0 for path in args: + cwd = cmd_shenv.cwd + path = to_unicode(path) if kIsWindows else to_bytes(path) + cwd = to_unicode(cwd) if kIsWindows else to_bytes(cwd) if not os.path.isabs(path): - path = os.path.realpath(os.path.join(cmd_shenv.cwd, path)) + path = os.path.realpath(os.path.join(cwd, path)) if force and not os.path.exists(path): continue try: @@ -695,6 +701,8 @@ else: # Make sure relative paths are relative to the cwd. redir_filename = os.path.join(cmd_shenv.cwd, name) + redir_filename = to_unicode(redir_filename) \ + if kIsWindows else to_bytes(redir_filename) fd = open(redir_filename, mode) # Workaround a Win32 and/or subprocess bug when appending. # @@ -1096,11 +1104,14 @@ for i, ln in enumerate(commands): commands[i] = re.sub(kPdbgRegex, ": '\\1'; ", ln) if test.config.pipefail: - f.write('set -o pipefail;') + f.write(b'set -o pipefail;' if mode == 'wb' else 'set -o pipefail;') if litConfig.echo_all_commands: - f.write('set -x;') - f.write('{ ' + '; } &&\n{ '.join(commands) + '; }') - f.write('\n') + f.write(b'set -x;' if mode == 'wb' else 'set -x;') + if sys.version_info > (3,0) and mode == 'wb': + f.write(bytes('{ ' + '; } &&\n{ '.join(commands) + '; }', 'utf-8')) + else: + f.write('{ ' + '; } &&\n{ '.join(commands) + '; }') + f.write(b'\n' if mode == 'wb' else '\n') f.close() if isWin32CMDEXE: Index: llvm/trunk/utils/lit/lit/util.py =================================================================== --- llvm/trunk/utils/lit/lit/util.py +++ llvm/trunk/utils/lit/lit/util.py @@ -102,6 +102,20 @@ raise TypeError('not sure how to convert %s to %s' % (type(b), str)) +def to_unicode(s): + """Return the parameter as type which supports unicode, possibly decoding + it. + + In Python2, this is the unicode type. In Python3 it's the str type. + + """ + if isinstance(s, bytes): + # In Python2, this branch is taken for both 'str' and 'bytes'. + # In Python3, this branch is taken only for 'bytes'. + return s.decode('utf-8') + return s + + def detectCPUs(): """Detects the number of CPUs on a system. Index: llvm/trunk/utils/lit/tests/Inputs/shtest-shell/rm-unicode-0.txt =================================================================== --- llvm/trunk/utils/lit/tests/Inputs/shtest-shell/rm-unicode-0.txt +++ llvm/trunk/utils/lit/tests/Inputs/shtest-shell/rm-unicode-0.txt @@ -0,0 +1,7 @@ +# Check removing unicode +# +# RUN: mkdir -p Output/中文 +# RUN: echo "" > Output/中文/你好.txt +# RUN: rm Output/中文/你好.txt +# RUN: echo "" > Output/中文/你好.txt +# RUN: rm -r Output/中文 Index: llvm/trunk/utils/lit/tests/shtest-shell.py =================================================================== --- llvm/trunk/utils/lit/tests/shtest-shell.py +++ llvm/trunk/utils/lit/tests/shtest-shell.py @@ -224,6 +224,7 @@ # CHECK: Exit Code: 1 # CHECK: *** +# CHECK: PASS: shtest-shell :: rm-unicode-0.txt # CHECK: PASS: shtest-shell :: sequencing-0.txt # CHECK: XFAIL: shtest-shell :: sequencing-1.txt # CHECK: PASS: shtest-shell :: valid-shell.txt