Gary Oberbrunner avatar Gary Oberbrunner committed 8a643ef

Fix #2685, UnicodeDecodeError with Copy and non-ASCII filenames.

Comments (0)

Files changed (3)

       embed manifests in Windows EXEs and DLLs.
 
   From Gary Oberbrunner:
+    - Fix unicode error when using non-ASCII filenames with Copy or Install
     - Put RPATH in LINKCOM rather than LINKFLAGS so resetting
       LINKFLAGS doesn't kill RPATH
     - Fix precompiled headers on Windows when variant dir name has spaces.

src/engine/SCons/Action.py

             SCons.Util.AddMethod(self, batch_key, 'batch_key')
 
     def print_cmd_line(self, s, target, source, env):
-        sys.stdout.write(s + u"\n")
+        # In python 3, and in some of our tests, sys.stdout is
+        # a String io object, and it takes unicode strings only
+        # In other cases it's a regular Python 2.x file object
+        # which takes strings (bytes), and if you pass those a
+        # unicode object they try to decode with 'ascii' codec
+        # which fails if the cmd line has any hi-bit-set chars.
+        # This code assumes s is a regular string, but should
+        # work if it's unicode too.
+        try:
+            sys.stdout.write(unicode(s + "\n"))
+        except UnicodeDecodeError:
+            sys.stdout.write(s + "\n")
 
     def __call__(self, target, source, env,
                                exitstatfunc=_null,
     kw['env'] = new_env
 
     try:
-        #FUTURE return subprocess.Popen(cmd, **kw)
         return subprocess.Popen(cmd, **kw)
     except EnvironmentError, e:
         if error == 'raise': raise

test/Install/non-ascii-name.py

+# -*- coding: utf-8 -*-
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Verify that the Install() Builder works
+"""
+
+import os.path
+import time
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.write('中文.txt', """\
+test stuff here in file 中文.txt.
+""")
+
+test.write('SConstruct', """\
+InstallAs("b", Glob("*.txt"))
+""")
+test.run(arguments = '.')
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.