diff -r 355466216029 -r 9e9ea96eb0dd Lib/distutils/archive_util.py --- a/Lib/distutils/archive_util.py Mon Dec 19 16:41:11 2011 -0500 +++ b/Lib/distutils/archive_util.py Mon Dec 19 20:34:57 2011 -0500 @@ -80,6 +80,13 @@ mkpath(os.path.dirname(archive_name), dry_run=dry_run) + # tarfile requires that the filename be bytes + if isinstance(archive_name, unicode): + try: + archive_name = archive_name.encode('ascii') + except UnicodeEncodeError: + raise ValueError("Due to #13639, the filename must be ascii") + # creating the tarball import tarfile # late import so Python build itself doesn't break diff -r 355466216029 -r 9e9ea96eb0dd Lib/distutils/tests/test_archive_util.py --- a/Lib/distutils/tests/test_archive_util.py Mon Dec 19 16:41:11 2011 -0500 +++ b/Lib/distutils/tests/test_archive_util.py Mon Dec 19 20:34:57 2011 -0500 @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Tests for distutils.archive_util.""" __revision__ = "$Id$" @@ -40,6 +41,9 @@ @unittest.skipUnless(zlib, "requires zlib") def test_make_tarball(self): + self._make_tarball('archive') + + def _make_tarball(self, target_name): # creating something to tar tmpdir = self.mkdtemp() self.write_file([tmpdir, 'file1'], 'xxx') @@ -51,7 +55,7 @@ unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0], "source and target should be on same drive") - base_name = os.path.join(tmpdir2, 'archive') + base_name = os.path.join(tmpdir2, target_name) # working with relative paths to avoid tar warnings old_dir = os.getcwd() @@ -66,7 +70,7 @@ self.assertTrue(os.path.exists(tarball)) # trying an uncompressed one - base_name = os.path.join(tmpdir2, 'archive') + base_name = os.path.join(tmpdir2, target_name) old_dir = os.getcwd() os.chdir(tmpdir) try: @@ -277,6 +281,21 @@ finally: del ARCHIVE_FORMATS['xxx'] + @unittest.skipUnless(zlib, "requires zlib") + def test_make_tarball_unicode(self): + """ + Mirror test_make_tarball, except filename is unicode. + """ + self._make_tarball(u'archive') + + @unittest.skipUnless(zlib, "requires zlib") + def test_make_tarball_unicode_chars(self): + """ + Mirror test_make_tarball, except filename is unicode and contains + Unicode characters. + """ + self._make_tarball(u'のアーカイブ') + def test_suite(): return unittest.makeSuite(ArchiveUtilTestCase) diff -r 355466216029 -r 9e9ea96eb0dd Lib/distutils/tests/test_sdist.py --- a/Lib/distutils/tests/test_sdist.py Mon Dec 19 16:41:11 2011 -0500 +++ b/Lib/distutils/tests/test_sdist.py Mon Dec 19 20:34:57 2011 -0500 @@ -166,6 +166,28 @@ self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz']) @unittest.skipUnless(zlib, "requires zlib") + def test_unicode_metadata_tgz(self): + """ + Unicode name or version should not break building to tar.gz format. + Reference issue #11638. + """ + + # create the sdist command with unicode parameters + dist, cmd = self.get_cmd({'name': u'fake', 'version': u'1.0'}) + + # create the sdist as gztar and run the command + cmd.formats = ['gztar'] + cmd.ensure_finalized() + cmd.run() + + # The command should have created the .tar.gz file + dist_folder = join(self.tmp_dir, 'dist') + result = os.listdir(dist_folder) + self.assertEqual(result, ['fake-1.0.tar.gz']) + + os.remove(join(dist_folder, 'fake-1.0.tar.gz')) + + @unittest.skipUnless(zlib, "requires zlib") def test_add_defaults(self): # http://bugs.python.org/issue2279