aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan H. Holek <stefan@epy.co.at>2012-10-08 19:48:19 +0200
committerStefan H. Holek <stefan@epy.co.at>2012-10-08 19:48:19 +0200
commit6851d4e38e1e4e5a2bbbf2556523fd19675cdbf7 (patch)
treea9b9c43b92f7d844d9f6334aa1426c32b0c4c8ae
parent077a69aef0973333cafe4c7548dceb5418d1c36f (diff)
downloadexternal_python_setuptools-6851d4e38e1e4e5a2bbbf2556523fd19675cdbf7.tar.gz
external_python_setuptools-6851d4e38e1e4e5a2bbbf2556523fd19675cdbf7.tar.bz2
external_python_setuptools-6851d4e38e1e4e5a2bbbf2556523fd19675cdbf7.zip
Make sure the manifest never contains decomposed UTF-8.
--HG-- branch : distribute extra : rebase_source : 0e0fb3beac56f66f12670ec69ebfd3996d12d912
-rwxr-xr-xsetuptools/command/egg_info.py14
-rw-r--r--setuptools/tests/test_sdist.py37
2 files changed, 48 insertions, 3 deletions
diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py
index 46cdf4e0..e932d46a 100755
--- a/setuptools/command/egg_info.py
+++ b/setuptools/command/egg_info.py
@@ -287,6 +287,19 @@ class FileList(FileList):
+def compose(path):
+ # Apple's HFS Plus returns decomposed UTF-8. Since just about
+ # everyone else chokes on it, we must make sure to return fully
+ # composed UTF-8 only.
+ if sys.getfilesystemencoding().lower() == 'utf-8':
+ from unicodedata import normalize
+ if sys.version_info >= (3,):
+ path = normalize('NFC', path)
+ else:
+ path = normalize('NFC', path.decode('utf-8')).encode('utf-8')
+ return path
+
+
class manifest_maker(sdist):
template = "MANIFEST.in"
@@ -311,6 +324,7 @@ class manifest_maker(sdist):
self.prune_file_list()
self.filelist.sort()
self.filelist.remove_duplicates()
+ self.filelist.files = [compose(path) for path in self.filelist.files]
self.write_manifest()
def write_manifest (self):
diff --git a/setuptools/tests/test_sdist.py b/setuptools/tests/test_sdist.py
index 8d9ed922..34123545 100644
--- a/setuptools/tests/test_sdist.py
+++ b/setuptools/tests/test_sdist.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
"""sdist tests"""
@@ -74,6 +75,36 @@ class TestSdistTest(unittest.TestCase):
manifest = cmd.filelist.files
- self.assert_(os.path.join('sdist_test', 'a.txt') in manifest)
- self.assert_(os.path.join('sdist_test', 'b.txt') in manifest)
- self.assert_(os.path.join('sdist_test', 'c.rst') not in manifest)
+ self.assertTrue(os.path.join('sdist_test', 'a.txt') in manifest)
+ self.assertTrue(os.path.join('sdist_test', 'b.txt') in manifest)
+ self.assertTrue(os.path.join('sdist_test', 'c.rst') not in manifest)
+
+ def test_filelist_is_fully_composed(self):
+ # Test for #303. Requires HFS Plus to fail.
+
+ # Add file with non-ASCII filename
+ filename = os.path.join('sdist_test', 'smörbröd.py')
+ open(filename, 'w').close()
+
+ dist = Distribution(SETUP_ATTRS)
+ dist.script_name = 'setup.py'
+ cmd = sdist(dist)
+ cmd.ensure_finalized()
+
+ # squelch output
+ old_stdout = sys.stdout
+ old_stderr = sys.stderr
+ sys.stdout = StringIO()
+ sys.stderr = StringIO()
+ try:
+ cmd.run()
+ finally:
+ sys.stdout = old_stdout
+ sys.stderr = old_stderr
+
+ self.assertTrue(filename in cmd.filelist.files)
+
+
+def test_suite():
+ return unittest.defaultTestLoader.loadTestsFromName(__name__)
+