185d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé"""Tests for distutils.command.sdist."""
285d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéimport os
3560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujoimport tarfile
485d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéimport unittest
5560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujoimport warnings
685d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéimport zipfile
7560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujofrom os.path import join
8560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujofrom textwrap import dedent
9ae50babe32b53049910d8d0bb8a2eeac7c18a477Éric Araujofrom test.test_support import captured_stdout, check_warnings, run_unittest
101036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti
111036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti# zlib is not used here, but if it's not available
121036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti# the tests that use zipfile may fail
131036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melottitry:
141036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti    import zlib
151036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melottiexcept ImportError:
161036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti    zlib = None
171036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti
181b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadétry:
191b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    import grp
201b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    import pwd
211b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    UID_GID_SUPPORT = True
221b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadéexcept ImportError:
231b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    UID_GID_SUPPORT = False
241b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé
25064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé
2654274ad96aa033b9f3744dce395d08047467cca9Éric Araujofrom distutils.command.sdist import sdist, show_formats
2785d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéfrom distutils.core import Distribution
2885d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéfrom distutils.tests.test_config import PyPIRCCommandTestCase
29560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujofrom distutils.errors import DistutilsOptionError
305da9a51d9d18082665f69351817fcf36e250e835Tarek Ziadéfrom distutils.spawn import find_executable
31cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadéfrom distutils.log import WARN
320f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujofrom distutils.filelist import FileList
33064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadéfrom distutils.archive_util import ARCHIVE_FORMATS
3485d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
3585d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek ZiadéSETUP_PY = """
3685d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéfrom distutils.core import setup
3785d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéimport somecode
3885d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
3985d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadésetup(name='fake')
4085d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé"""
4185d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
427dd533963fc947982e472db555cd0ee4b937c9cfTarek ZiadéMANIFEST = """\
430389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo# file GENERATED by distutils, do NOT edit
447dd533963fc947982e472db555cd0ee4b937c9cfTarek ZiadéREADME
4531378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujobuildout.cfg
460e5001eff9a44bdabe2d2b25903e144a3dcbc77fTarek Ziadéinroot.txt
477dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadésetup.py
48ae9dc8c48aa0e0db5ce32080d8a28d26e19b7851Tarek Ziadédata%(sep)sdata.dt
49ae9dc8c48aa0e0db5ce32080d8a28d26e19b7851Tarek Ziadéscripts%(sep)sscript.py
50f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadésome%(sep)sfile.txt
51f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadésome%(sep)sother_file.txt
52ae9dc8c48aa0e0db5ce32080d8a28d26e19b7851Tarek Ziadésomecode%(sep)s__init__.py
53ae9dc8c48aa0e0db5ce32080d8a28d26e19b7851Tarek Ziadésomecode%(sep)sdoc.dat
54ae9dc8c48aa0e0db5ce32080d8a28d26e19b7851Tarek Ziadésomecode%(sep)sdoc.txt
5585d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé"""
5685d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
57cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadéclass SDistTestCase(PyPIRCCommandTestCase):
5885d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
5985d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé    def setUp(self):
601369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        # PyPIRCCommandTestCase creates a temp dir already
611369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        # and put it in self.tmp_dir
62cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        super(SDistTestCase, self).setUp()
631369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        # setting up an environment
6485d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        self.old_path = os.getcwd()
651369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        os.mkdir(join(self.tmp_dir, 'somecode'))
661369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        os.mkdir(join(self.tmp_dir, 'dist'))
677dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # a package, and a README
687dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'README'), 'xxx')
697dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', '__init__.py'), '#')
707dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'setup.py'), SETUP_PY)
711369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        os.chdir(self.tmp_dir)
7285d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
7385d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé    def tearDown(self):
741369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        # back to normal
7585d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        os.chdir(self.old_path)
76cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        super(SDistTestCase, self).tearDown()
777dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
787dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé    def get_cmd(self, metadata=None):
797dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        """Returns a cmd"""
807dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        if metadata is None:
817dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé            metadata = {'name': 'fake', 'version': '1.0',
827dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé                        'url': 'xxx', 'author': 'xxx',
837dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé                        'author_email': 'xxx'}
847dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist = Distribution(metadata)
857dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist.script_name = 'setup.py'
867dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist.packages = ['somecode']
877dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist.include_package_data = True
887dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd = sdist(dist)
897dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.dist_dir = 'dist'
907dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        return dist, cmd
9185d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
921036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti    @unittest.skipUnless(zlib, "requires zlib")
9385d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé    def test_prune_file_list(self):
943cf202e9578cef4429254641599e8f6be6540309Éric Araujo        # this test creates a project with some VCS dirs and an NFS rename
953cf202e9578cef4429254641599e8f6be6540309Éric Araujo        # file, then launches sdist to check they get pruned on all systems
9685d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
9785d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        # creating VCS directories with some files in them
981369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
997dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', '.svn', 'ok.py'), 'xxx')
10085d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
1011369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        os.mkdir(join(self.tmp_dir, 'somecode', '.hg'))
1027dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', '.hg',
10385d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé                         'ok'), 'xxx')
10485d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
1051369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        os.mkdir(join(self.tmp_dir, 'somecode', '.git'))
1067dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', '.git',
10785d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé                         'ok'), 'xxx')
10885d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
1093cf202e9578cef4429254641599e8f6be6540309Éric Araujo        self.write_file((self.tmp_dir, 'somecode', '.nfs0001'), 'xxx')
1103cf202e9578cef4429254641599e8f6be6540309Éric Araujo
11185d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        # now building a sdist
1127dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist, cmd = self.get_cmd()
11385d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
11485d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        # zip is available universally
11585d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        # (tar might not be installed under win32)
11685d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        cmd.formats = ['zip']
1177dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
1187dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.ensure_finalized()
11985d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        cmd.run()
12085d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
12185d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        # now let's check what we have
1221369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        dist_folder = join(self.tmp_dir, 'dist')
12385d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        files = os.listdir(dist_folder)
1242623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(files, ['fake-1.0.zip'])
12585d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
12685d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
12785d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        try:
12885d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé            content = zip_file.namelist()
12985d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        finally:
13085d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé            zip_file.close()
13185d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
13285d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé        # making sure everything has been pruned correctly
1332623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(len(content), 4)
13485d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
1351036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti    @unittest.skipUnless(zlib, "requires zlib")
136aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé    def test_make_distribution(self):
137aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        # now building a sdist
1387dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist, cmd = self.get_cmd()
139aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé
140aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        # creating a gztar then a tar
141aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        cmd.formats = ['gztar', 'tar']
1427dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.ensure_finalized()
143aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        cmd.run()
144aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé
145aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        # making sure we have two files
1461369900619d943d05342e7b781f1f3fb45ece4c9Tarek Ziadé        dist_folder = join(self.tmp_dir, 'dist')
147aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        result = os.listdir(dist_folder)
148aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        result.sort()
14931378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz'])
150aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé
151aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        os.remove(join(dist_folder, 'fake-1.0.tar'))
152aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        os.remove(join(dist_folder, 'fake-1.0.tar.gz'))
153aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé
154aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        # now trying a tar then a gztar
155aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        cmd.formats = ['tar', 'gztar']
1567dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
1577dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.ensure_finalized()
158aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        cmd.run()
159aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé
160aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        result = os.listdir(dist_folder)
161aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé        result.sort()
1622623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz'])
163aaedcef5786f10593b51d389423b5d7ce97727c0Tarek Ziadé
1641036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti    @unittest.skipUnless(zlib, "requires zlib")
165042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs    def test_unicode_metadata_tgz(self):
166042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        """
167042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        Unicode name or version should not break building to tar.gz format.
168042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        Reference issue #11638.
169042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        """
170042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs
171042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        # create the sdist command with unicode parameters
172042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        dist, cmd = self.get_cmd({'name': u'fake', 'version': u'1.0'})
173042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs
174042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        # create the sdist as gztar and run the command
175042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        cmd.formats = ['gztar']
176042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        cmd.ensure_finalized()
177042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        cmd.run()
178042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs
179042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        # The command should have created the .tar.gz file
180042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        dist_folder = join(self.tmp_dir, 'dist')
181042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        result = os.listdir(dist_folder)
182042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        self.assertEqual(result, ['fake-1.0.tar.gz'])
183042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs
184042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs        os.remove(join(dist_folder, 'fake-1.0.tar.gz'))
185042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs
186042370e7503504b23ed13c56c8599a620569eab6Jason R. Coombs    @unittest.skipUnless(zlib, "requires zlib")
1877dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé    def test_add_defaults(self):
1887dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
1897dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # http://bugs.python.org/issue2279
1907dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
1917dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # add_default should also include
1927dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # data_files and package_data
1937dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist, cmd = self.get_cmd()
1947dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
1957dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # filling data_files by pointing files
1967dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # in package_data
1977dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist.package_data = {'': ['*.cfg', '*.dat'],
1987dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé                             'somecode': ['*.txt']}
1997dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
2007dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', 'doc.dat'), '#')
2017dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2027dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # adding some data in data_files
2037dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        data_dir = join(self.tmp_dir, 'data')
2047dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        os.mkdir(data_dir)
2057dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((data_dir, 'data.dt'), '#')
206f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé        some_dir = join(self.tmp_dir, 'some')
207f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé        os.mkdir(some_dir)
20831378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        # make sure VCS directories are pruned (#14004)
20931378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        hg_dir = join(self.tmp_dir, '.hg')
21031378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        os.mkdir(hg_dir)
21131378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        self.write_file((hg_dir, 'last-message.txt'), '#')
21231378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        # a buggy regex used to prevent this from working on windows (#6884)
21331378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        self.write_file((self.tmp_dir, 'buildout.cfg'), '#')
2140e5001eff9a44bdabe2d2b25903e144a3dcbc77fTarek Ziadé        self.write_file((self.tmp_dir, 'inroot.txt'), '#')
215f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé        self.write_file((some_dir, 'file.txt'), '#')
216f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé        self.write_file((some_dir, 'other_file.txt'), '#')
217f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé
2180e5001eff9a44bdabe2d2b25903e144a3dcbc77fTarek Ziadé        dist.data_files = [('data', ['data/data.dt',
21931378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo                                     'buildout.cfg',
2200e5001eff9a44bdabe2d2b25903e144a3dcbc77fTarek Ziadé                                     'inroot.txt',
2210e5001eff9a44bdabe2d2b25903e144a3dcbc77fTarek Ziadé                                     'notexisting']),
222f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé                           'some/file.txt',
223f68b5b804675326fb05e20b3f327bd774fa95d09Tarek Ziadé                           'some/other_file.txt']
2247dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2257dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # adding a script
2267dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        script_dir = join(self.tmp_dir, 'scripts')
2277dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        os.mkdir(script_dir)
2287dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        self.write_file((script_dir, 'script.py'), '#')
2297dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist.scripts = [join('scripts', 'script.py')]
2307dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2317dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.formats = ['zip']
2327dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.use_defaults = True
2337dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2347dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.ensure_finalized()
2357dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        cmd.run()
2367dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2377dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # now let's check what we have
2387dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        dist_folder = join(self.tmp_dir, 'dist')
2397dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        files = os.listdir(dist_folder)
2402623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(files, ['fake-1.0.zip'])
2417dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2427dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
2437dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        try:
2447dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé            content = zip_file.namelist()
2457dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        finally:
2467dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé            zip_file.close()
2477dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2487dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # making sure everything was added
24931378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        self.assertEqual(len(content), 12)
2507dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2517dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé        # checking the MANIFEST
252d1feff70a3c08f91066b99a74ee1ca8f65bdfec1Éric Araujo        f = open(join(self.tmp_dir, 'MANIFEST'))
253d1feff70a3c08f91066b99a74ee1ca8f65bdfec1Éric Araujo        try:
254d1feff70a3c08f91066b99a74ee1ca8f65bdfec1Éric Araujo            manifest = f.read()
255d1feff70a3c08f91066b99a74ee1ca8f65bdfec1Éric Araujo        finally:
256d1feff70a3c08f91066b99a74ee1ca8f65bdfec1Éric Araujo            f.close()
25731378df83a5562df10b21f3f32d3b3a6cbfa054bÉric Araujo        self.assertEqual(manifest, MANIFEST % {'sep': os.sep})
2587dd533963fc947982e472db555cd0ee4b937c9cfTarek Ziadé
2591036a7f7e180ac3fd98e43832a04e38b4c7c9e83Ezio Melotti    @unittest.skipUnless(zlib, "requires zlib")
260cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé    def test_metadata_check_option(self):
261cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        # testing the `medata-check` option
262cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        dist, cmd = self.get_cmd(metadata={})
263cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé
264cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        # this should raise some warnings !
265cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        # with the `check` subcommand
266cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        cmd.ensure_finalized()
267cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        cmd.run()
268cb18d077c65032f27396eaeef314267ee20375dbÉric Araujo        warnings = [msg for msg in self.get_logs(WARN) if
269cb18d077c65032f27396eaeef314267ee20375dbÉric Araujo                    msg.startswith('warning: check:')]
2702623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(len(warnings), 2)
271cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé
272cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        # trying with a complete set of metadata
273cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        self.clear_logs()
274cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        dist, cmd = self.get_cmd()
275cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        cmd.ensure_finalized()
276cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        cmd.metadata_check = 0
277cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        cmd.run()
278cb18d077c65032f27396eaeef314267ee20375dbÉric Araujo        warnings = [msg for msg in self.get_logs(WARN) if
279cb18d077c65032f27396eaeef314267ee20375dbÉric Araujo                    msg.startswith('warning: check:')]
2802623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(len(warnings), 0)
281cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé
282cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé    def test_check_metadata_deprecated(self):
283cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        # makes sure make_metadata is deprecated
284cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        dist, cmd = self.get_cmd()
285cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé        with check_warnings() as w:
286cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé            warnings.simplefilter("always")
287cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé            cmd.check_metadata()
2882623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(len(w.warnings), 1)
289cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé
290064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé    def test_show_formats(self):
291064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé        with captured_stdout() as stdout:
292064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé            show_formats()
293064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé
294064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé        # the output should be a header line + one line per format
295064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé        num_formats = len(ARCHIVE_FORMATS.keys())
296064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé        output = [line for line in stdout.getvalue().split('\n')
297064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé                  if line.strip().startswith('--formats=')]
2982623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(len(output), num_formats)
299064a7681011f918f4aaf97f1df3008ffe57dfea9Tarek Ziadé
3008953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé    def test_finalize_options(self):
3018953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        dist, cmd = self.get_cmd()
3028953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        cmd.finalize_options()
3038953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé
3048953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        # default options set by finalize
3052623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(cmd.manifest, 'MANIFEST')
3062623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(cmd.template, 'MANIFEST.in')
3072623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(cmd.dist_dir, 'dist')
3088953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé
3098953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        # formats has to be a string splitable on (' ', ',') or
3108953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        # a stringlist
3118953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        cmd.formats = 1
3128953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        self.assertRaises(DistutilsOptionError, cmd.finalize_options)
3138953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        cmd.formats = ['zip']
3148953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        cmd.finalize_options()
3158953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé
3168953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        # formats has to be known
3178953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        cmd.formats = 'supazipa'
3188953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé        self.assertRaises(DistutilsOptionError, cmd.finalize_options)
3198953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé
3201b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    @unittest.skipUnless(zlib, "requires zlib")
3211b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
32257bc6da7c4327aa870fbf5292c1b05a9ac3bfe19Serhiy Storchaka    @unittest.skipIf(find_executable('tar') is None,
32357bc6da7c4327aa870fbf5292c1b05a9ac3bfe19Serhiy Storchaka                     "The tar command is not found")
32457bc6da7c4327aa870fbf5292c1b05a9ac3bfe19Serhiy Storchaka    @unittest.skipIf(find_executable('gzip') is None,
32557bc6da7c4327aa870fbf5292c1b05a9ac3bfe19Serhiy Storchaka                     "The gzip command is not found")
3261b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé    def test_make_distribution_owner_group(self):
3271b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        # now building a sdist
3281b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        dist, cmd = self.get_cmd()
3291b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé
3301b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        # creating a gztar and specifying the owner+group
3311b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.formats = ['gztar']
3321b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.owner = pwd.getpwuid(0)[0]
3331b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.group = grp.getgrgid(0)[0]
3341b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.ensure_finalized()
3351b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.run()
3361b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé
3371b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        # making sure we have the good rights
3381b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
3391b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        archive = tarfile.open(archive_name)
3401b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        try:
3411b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé            for member in archive.getmembers():
3422623a37852153363335956afab010cb0beb7e74eEzio Melotti                self.assertEqual(member.uid, 0)
3432623a37852153363335956afab010cb0beb7e74eEzio Melotti                self.assertEqual(member.gid, 0)
3441b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        finally:
3451b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé            archive.close()
3461b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé
3471b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        # building a sdist again
3481b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        dist, cmd = self.get_cmd()
3491b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé
3501b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        # creating a gztar
3511b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.formats = ['gztar']
3521b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.ensure_finalized()
3531b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        cmd.run()
3541b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé
3551b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        # making sure we have the good rights
3561b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
3571b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        archive = tarfile.open(archive_name)
358a5076a2543e9d52128b875bc4b3b0521ed3a2b12Tarek Ziadé
359a5076a2543e9d52128b875bc4b3b0521ed3a2b12Tarek Ziadé        # note that we are not testing the group ownership here
360a5076a2543e9d52128b875bc4b3b0521ed3a2b12Tarek Ziadé        # because, depending on the platforms and the container
361a5076a2543e9d52128b875bc4b3b0521ed3a2b12Tarek Ziadé        # rights (see #7408)
3621b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        try:
3631b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé            for member in archive.getmembers():
3642623a37852153363335956afab010cb0beb7e74eEzio Melotti                self.assertEqual(member.uid, os.getuid())
3651b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé        finally:
3661b48671ef11a635fc452e35d08c14a601baa1db7Tarek Ziadé            archive.close()
3678953913cf565b18742c16622a0b486e05bf2a113Tarek Ziadé
3680f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo    # the following tests make sure there is a nice error message instead
3690f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo    # of a traceback when parsing an invalid manifest template
3700f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo
371ae50babe32b53049910d8d0bb8a2eeac7c18a477Éric Araujo    def _check_template(self, content):
3720f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        dist, cmd = self.get_cmd()
3730f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        os.chdir(self.tmp_dir)
3740f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        self.write_file('MANIFEST.in', content)
3750f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        cmd.ensure_finalized()
3760f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        cmd.filelist = FileList()
3770f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        cmd.read_template()
3780f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        warnings = self.get_logs(WARN)
3790f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        self.assertEqual(len(warnings), 1)
3800f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo
3810f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo    def test_invalid_template_unknown_command(self):
382ae50babe32b53049910d8d0bb8a2eeac7c18a477Éric Araujo        self._check_template('taunt knights *')
3830f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo
3840f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo    def test_invalid_template_wrong_arguments(self):
3850f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        # this manifest command takes one argument
386ae50babe32b53049910d8d0bb8a2eeac7c18a477Éric Araujo        self._check_template('prune')
3870f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo
3880f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo    @unittest.skipIf(os.name != 'nt', 'test relevant for Windows only')
3890f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo    def test_invalid_template_wrong_path(self):
3900f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        # on Windows, trailing slashes are not allowed
3910f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo        # this used to crash instead of raising a warning: #8286
392ae50babe32b53049910d8d0bb8a2eeac7c18a477Éric Araujo        self._check_template('include examples/')
3930f2dbf3645d28b74f1c1aa7cce29410d9dbc2d0eÉric Araujo
394c425f8fcb4aceb0cbebbe286947774491e1e317bEzio Melotti    @unittest.skipUnless(zlib, "requires zlib")
395422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé    def test_get_file_list(self):
396422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        # make sure MANIFEST is recalculated
397422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        dist, cmd = self.get_cmd()
398422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
399422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        # filling data_files by pointing files in package_data
400422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        dist.package_data = {'somecode': ['*.txt']}
401422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
402367d4c8a809ecfa7ad5ee68056ccd0b0a36f65caNadeem Vawda        cmd.formats = ['gztar']
403422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        cmd.ensure_finalized()
404422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        cmd.run()
405422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
406422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        f = open(cmd.manifest)
407422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        try:
408422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé            manifest = [line.strip() for line in f.read().split('\n')
409422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé                        if line.strip() != '']
410422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        finally:
411422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé            f.close()
412422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
4132623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(len(manifest), 5)
414422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
415422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        # adding a file
416422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#')
417422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
418c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # make sure build_py is reinitialized, like a fresh run
419422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        build_py = dist.get_command_obj('build_py')
420422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        build_py.finalized = False
421422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        build_py.ensure_finalized()
422422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
423422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        cmd.run()
424422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
425422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        f = open(cmd.manifest)
426422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        try:
427422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé            manifest2 = [line.strip() for line in f.read().split('\n')
428422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé                         if line.strip() != '']
429422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        finally:
430422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé            f.close()
431422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
432422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        # do we have the new file in MANIFEST ?
4332623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(len(manifest2), 6)
434422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé        self.assertIn('doc2.txt', manifest2[-1])
435422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
436b76eb9743eed4db801979e6d4c111a49dc33ccfbÉric Araujo    @unittest.skipUnless(zlib, "requires zlib")
4370389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo    def test_manifest_marker(self):
4380389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        # check that autogenerated MANIFESTs have a marker
4390389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        dist, cmd = self.get_cmd()
4400389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        cmd.ensure_finalized()
4410389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        cmd.run()
4420389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo
4430389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        f = open(cmd.manifest)
4440389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        try:
4450389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo            manifest = [line.strip() for line in f.read().split('\n')
4460389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo                        if line.strip() != '']
4470389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        finally:
4480389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo            f.close()
4490389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo
4500389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        self.assertEqual(manifest[0],
4510389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo                         '# file GENERATED by distutils, do NOT edit')
4520389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo
453560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo    @unittest.skipUnless(zlib, 'requires zlib')
454560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo    def test_manifest_comments(self):
455560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        # make sure comments don't cause exceptions or wrong includes
456560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        contents = dedent("""\
457560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo            # bad.py
458560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo            #bad.py
459560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo            good.py
460560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo            """)
461560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        dist, cmd = self.get_cmd()
462560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        cmd.ensure_finalized()
463560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.write_file((self.tmp_dir, cmd.manifest), contents)
464560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.write_file((self.tmp_dir, 'good.py'), '# pick me!')
465560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.write_file((self.tmp_dir, 'bad.py'), "# don't pick me!")
466560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.write_file((self.tmp_dir, '#bad.py'), "# don't pick me!")
467560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        cmd.run()
468560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.assertEqual(cmd.filelist.files, ['good.py'])
469560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo
470b76eb9743eed4db801979e6d4c111a49dc33ccfbÉric Araujo    @unittest.skipUnless(zlib, "requires zlib")
4710389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo    def test_manual_manifest(self):
4720389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        # check that a MANIFEST without a marker is left alone
4730389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        dist, cmd = self.get_cmd()
474cea5fc0b7bd212986fddc5d1d89d6c7f1a24113fÉric Araujo        cmd.formats = ['gztar']
4750389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        cmd.ensure_finalized()
4760389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        self.write_file((self.tmp_dir, cmd.manifest), 'README.manual')
477560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.write_file((self.tmp_dir, 'README.manual'),
478560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo                         'This project maintains its MANIFEST file itself.')
4790389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        cmd.run()
480560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.assertEqual(cmd.filelist.files, ['README.manual'])
4810389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo
4820389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        f = open(cmd.manifest)
4830389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        try:
4840389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo            manifest = [line.strip() for line in f.read().split('\n')
4850389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo                        if line.strip() != '']
4860389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        finally:
4870389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo            f.close()
4880389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo
4890389ae60fa4d02316b8c0d011f6c399d55f998bcÉric Araujo        self.assertEqual(manifest, ['README.manual'])
490422545f0e7c83703d3a35ab85a210e19aa40332dTarek Ziadé
491560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
492560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        archive = tarfile.open(archive_name)
493560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        try:
494560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo            filenames = [tarinfo.name for tarinfo in archive]
495560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        finally:
496560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo            archive.close()
497560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo        self.assertEqual(sorted(filenames), ['fake-1.0', 'fake-1.0/PKG-INFO',
498560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo                                             'fake-1.0/README.manual'])
499560bf855d3788c31273162f0ccf777b3c1eedaa8Éric Araujo
50085d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadédef test_suite():
501cb76804b172e2c6db37dcf9290579ffc304d1d33Tarek Ziadé    return unittest.makeSuite(SDistTestCase)
50285d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadé
50385d6fb50221e62e11159ecc915ca3c18d73cfbbbTarek Ziadéif __name__ == "__main__":
50454274ad96aa033b9f3744dce395d08047467cca9Éric Araujo    run_unittest(test_suite())
505