17db96d56Sopenharmony_ci"""Tests for distutils.command.sdist."""
27db96d56Sopenharmony_ciimport os
37db96d56Sopenharmony_ciimport tarfile
47db96d56Sopenharmony_ciimport unittest
57db96d56Sopenharmony_ciimport warnings
67db96d56Sopenharmony_ciimport zipfile
77db96d56Sopenharmony_cifrom os.path import join
87db96d56Sopenharmony_cifrom textwrap import dedent
97db96d56Sopenharmony_cifrom test.support import captured_stdout, run_unittest
107db96d56Sopenharmony_cifrom test.support.warnings_helper import check_warnings
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_citry:
137db96d56Sopenharmony_ci    import zlib
147db96d56Sopenharmony_ci    ZLIB_SUPPORT = True
157db96d56Sopenharmony_ciexcept ImportError:
167db96d56Sopenharmony_ci    ZLIB_SUPPORT = False
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_citry:
197db96d56Sopenharmony_ci    import grp
207db96d56Sopenharmony_ci    import pwd
217db96d56Sopenharmony_ci    UID_GID_SUPPORT = True
227db96d56Sopenharmony_ciexcept ImportError:
237db96d56Sopenharmony_ci    UID_GID_SUPPORT = False
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_cifrom distutils.command.sdist import sdist, show_formats
267db96d56Sopenharmony_cifrom distutils.core import Distribution
277db96d56Sopenharmony_cifrom distutils.tests.test_config import BasePyPIRCCommandTestCase
287db96d56Sopenharmony_cifrom distutils.errors import DistutilsOptionError
297db96d56Sopenharmony_cifrom distutils.spawn import find_executable
307db96d56Sopenharmony_cifrom distutils.log import WARN
317db96d56Sopenharmony_cifrom distutils.filelist import FileList
327db96d56Sopenharmony_cifrom distutils.archive_util import ARCHIVE_FORMATS
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ciSETUP_PY = """
357db96d56Sopenharmony_cifrom distutils.core import setup
367db96d56Sopenharmony_ciimport somecode
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_cisetup(name='fake')
397db96d56Sopenharmony_ci"""
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ciMANIFEST = """\
427db96d56Sopenharmony_ci# file GENERATED by distutils, do NOT edit
437db96d56Sopenharmony_ciREADME
447db96d56Sopenharmony_cibuildout.cfg
457db96d56Sopenharmony_ciinroot.txt
467db96d56Sopenharmony_cisetup.py
477db96d56Sopenharmony_cidata%(sep)sdata.dt
487db96d56Sopenharmony_ciscripts%(sep)sscript.py
497db96d56Sopenharmony_cisome%(sep)sfile.txt
507db96d56Sopenharmony_cisome%(sep)sother_file.txt
517db96d56Sopenharmony_cisomecode%(sep)s__init__.py
527db96d56Sopenharmony_cisomecode%(sep)sdoc.dat
537db96d56Sopenharmony_cisomecode%(sep)sdoc.txt
547db96d56Sopenharmony_ci"""
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ciclass SDistTestCase(BasePyPIRCCommandTestCase):
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def setUp(self):
597db96d56Sopenharmony_ci        # PyPIRCCommandTestCase creates a temp dir already
607db96d56Sopenharmony_ci        # and put it in self.tmp_dir
617db96d56Sopenharmony_ci        super(SDistTestCase, self).setUp()
627db96d56Sopenharmony_ci        # setting up an environment
637db96d56Sopenharmony_ci        self.old_path = os.getcwd()
647db96d56Sopenharmony_ci        os.mkdir(join(self.tmp_dir, 'somecode'))
657db96d56Sopenharmony_ci        os.mkdir(join(self.tmp_dir, 'dist'))
667db96d56Sopenharmony_ci        # a package, and a README
677db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'README'), 'xxx')
687db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', '__init__.py'), '#')
697db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'setup.py'), SETUP_PY)
707db96d56Sopenharmony_ci        os.chdir(self.tmp_dir)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def tearDown(self):
737db96d56Sopenharmony_ci        # back to normal
747db96d56Sopenharmony_ci        os.chdir(self.old_path)
757db96d56Sopenharmony_ci        super(SDistTestCase, self).tearDown()
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci    def get_cmd(self, metadata=None):
787db96d56Sopenharmony_ci        """Returns a cmd"""
797db96d56Sopenharmony_ci        if metadata is None:
807db96d56Sopenharmony_ci            metadata = {'name': 'fake', 'version': '1.0',
817db96d56Sopenharmony_ci                        'url': 'xxx', 'author': 'xxx',
827db96d56Sopenharmony_ci                        'author_email': 'xxx'}
837db96d56Sopenharmony_ci        dist = Distribution(metadata)
847db96d56Sopenharmony_ci        dist.script_name = 'setup.py'
857db96d56Sopenharmony_ci        dist.packages = ['somecode']
867db96d56Sopenharmony_ci        dist.include_package_data = True
877db96d56Sopenharmony_ci        cmd = sdist(dist)
887db96d56Sopenharmony_ci        cmd.dist_dir = 'dist'
897db96d56Sopenharmony_ci        return dist, cmd
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
927db96d56Sopenharmony_ci    def test_prune_file_list(self):
937db96d56Sopenharmony_ci        # this test creates a project with some VCS dirs and an NFS rename
947db96d56Sopenharmony_ci        # file, then launches sdist to check they get pruned on all systems
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci        # creating VCS directories with some files in them
977db96d56Sopenharmony_ci        os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
987db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', '.svn', 'ok.py'), 'xxx')
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci        os.mkdir(join(self.tmp_dir, 'somecode', '.hg'))
1017db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', '.hg',
1027db96d56Sopenharmony_ci                         'ok'), 'xxx')
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci        os.mkdir(join(self.tmp_dir, 'somecode', '.git'))
1057db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', '.git',
1067db96d56Sopenharmony_ci                         'ok'), 'xxx')
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', '.nfs0001'), 'xxx')
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        # now building a sdist
1117db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci        # zip is available universally
1147db96d56Sopenharmony_ci        # (tar might not be installed under win32)
1157db96d56Sopenharmony_ci        cmd.formats = ['zip']
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci        cmd.ensure_finalized()
1187db96d56Sopenharmony_ci        cmd.run()
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci        # now let's check what we have
1217db96d56Sopenharmony_ci        dist_folder = join(self.tmp_dir, 'dist')
1227db96d56Sopenharmony_ci        files = os.listdir(dist_folder)
1237db96d56Sopenharmony_ci        self.assertEqual(files, ['fake-1.0.zip'])
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci        zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
1267db96d56Sopenharmony_ci        try:
1277db96d56Sopenharmony_ci            content = zip_file.namelist()
1287db96d56Sopenharmony_ci        finally:
1297db96d56Sopenharmony_ci            zip_file.close()
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci        # making sure everything has been pruned correctly
1327db96d56Sopenharmony_ci        expected = ['', 'PKG-INFO', 'README', 'setup.py',
1337db96d56Sopenharmony_ci                    'somecode/', 'somecode/__init__.py']
1347db96d56Sopenharmony_ci        self.assertEqual(sorted(content), ['fake-1.0/' + x for x in expected])
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
1377db96d56Sopenharmony_ci    @unittest.skipIf(find_executable('tar') is None,
1387db96d56Sopenharmony_ci                     "The tar command is not found")
1397db96d56Sopenharmony_ci    @unittest.skipIf(find_executable('gzip') is None,
1407db96d56Sopenharmony_ci                     "The gzip command is not found")
1417db96d56Sopenharmony_ci    def test_make_distribution(self):
1427db96d56Sopenharmony_ci        # now building a sdist
1437db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci        # creating a gztar then a tar
1467db96d56Sopenharmony_ci        cmd.formats = ['gztar', 'tar']
1477db96d56Sopenharmony_ci        cmd.ensure_finalized()
1487db96d56Sopenharmony_ci        cmd.run()
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci        # making sure we have two files
1517db96d56Sopenharmony_ci        dist_folder = join(self.tmp_dir, 'dist')
1527db96d56Sopenharmony_ci        result = os.listdir(dist_folder)
1537db96d56Sopenharmony_ci        result.sort()
1547db96d56Sopenharmony_ci        self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz'])
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci        os.remove(join(dist_folder, 'fake-1.0.tar'))
1577db96d56Sopenharmony_ci        os.remove(join(dist_folder, 'fake-1.0.tar.gz'))
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci        # now trying a tar then a gztar
1607db96d56Sopenharmony_ci        cmd.formats = ['tar', 'gztar']
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci        cmd.ensure_finalized()
1637db96d56Sopenharmony_ci        cmd.run()
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci        result = os.listdir(dist_folder)
1667db96d56Sopenharmony_ci        result.sort()
1677db96d56Sopenharmony_ci        self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz'])
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
1707db96d56Sopenharmony_ci    def test_add_defaults(self):
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci        # http://bugs.python.org/issue2279
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci        # add_default should also include
1757db96d56Sopenharmony_ci        # data_files and package_data
1767db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci        # filling data_files by pointing files
1797db96d56Sopenharmony_ci        # in package_data
1807db96d56Sopenharmony_ci        dist.package_data = {'': ['*.cfg', '*.dat'],
1817db96d56Sopenharmony_ci                             'somecode': ['*.txt']}
1827db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
1837db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', 'doc.dat'), '#')
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci        # adding some data in data_files
1867db96d56Sopenharmony_ci        data_dir = join(self.tmp_dir, 'data')
1877db96d56Sopenharmony_ci        os.mkdir(data_dir)
1887db96d56Sopenharmony_ci        self.write_file((data_dir, 'data.dt'), '#')
1897db96d56Sopenharmony_ci        some_dir = join(self.tmp_dir, 'some')
1907db96d56Sopenharmony_ci        os.mkdir(some_dir)
1917db96d56Sopenharmony_ci        # make sure VCS directories are pruned (#14004)
1927db96d56Sopenharmony_ci        hg_dir = join(self.tmp_dir, '.hg')
1937db96d56Sopenharmony_ci        os.mkdir(hg_dir)
1947db96d56Sopenharmony_ci        self.write_file((hg_dir, 'last-message.txt'), '#')
1957db96d56Sopenharmony_ci        # a buggy regex used to prevent this from working on windows (#6884)
1967db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'buildout.cfg'), '#')
1977db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'inroot.txt'), '#')
1987db96d56Sopenharmony_ci        self.write_file((some_dir, 'file.txt'), '#')
1997db96d56Sopenharmony_ci        self.write_file((some_dir, 'other_file.txt'), '#')
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci        dist.data_files = [('data', ['data/data.dt',
2027db96d56Sopenharmony_ci                                     'buildout.cfg',
2037db96d56Sopenharmony_ci                                     'inroot.txt',
2047db96d56Sopenharmony_ci                                     'notexisting']),
2057db96d56Sopenharmony_ci                           'some/file.txt',
2067db96d56Sopenharmony_ci                           'some/other_file.txt']
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci        # adding a script
2097db96d56Sopenharmony_ci        script_dir = join(self.tmp_dir, 'scripts')
2107db96d56Sopenharmony_ci        os.mkdir(script_dir)
2117db96d56Sopenharmony_ci        self.write_file((script_dir, 'script.py'), '#')
2127db96d56Sopenharmony_ci        dist.scripts = [join('scripts', 'script.py')]
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        cmd.formats = ['zip']
2157db96d56Sopenharmony_ci        cmd.use_defaults = True
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci        cmd.ensure_finalized()
2187db96d56Sopenharmony_ci        cmd.run()
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci        # now let's check what we have
2217db96d56Sopenharmony_ci        dist_folder = join(self.tmp_dir, 'dist')
2227db96d56Sopenharmony_ci        files = os.listdir(dist_folder)
2237db96d56Sopenharmony_ci        self.assertEqual(files, ['fake-1.0.zip'])
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci        zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
2267db96d56Sopenharmony_ci        try:
2277db96d56Sopenharmony_ci            content = zip_file.namelist()
2287db96d56Sopenharmony_ci        finally:
2297db96d56Sopenharmony_ci            zip_file.close()
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci        # making sure everything was added
2327db96d56Sopenharmony_ci        expected = ['', 'PKG-INFO', 'README', 'buildout.cfg',
2337db96d56Sopenharmony_ci                    'data/', 'data/data.dt', 'inroot.txt',
2347db96d56Sopenharmony_ci                    'scripts/', 'scripts/script.py', 'setup.py',
2357db96d56Sopenharmony_ci                    'some/', 'some/file.txt', 'some/other_file.txt',
2367db96d56Sopenharmony_ci                    'somecode/', 'somecode/__init__.py', 'somecode/doc.dat',
2377db96d56Sopenharmony_ci                    'somecode/doc.txt']
2387db96d56Sopenharmony_ci        self.assertEqual(sorted(content), ['fake-1.0/' + x for x in expected])
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci        # checking the MANIFEST
2417db96d56Sopenharmony_ci        f = open(join(self.tmp_dir, 'MANIFEST'))
2427db96d56Sopenharmony_ci        try:
2437db96d56Sopenharmony_ci            manifest = f.read()
2447db96d56Sopenharmony_ci        finally:
2457db96d56Sopenharmony_ci            f.close()
2467db96d56Sopenharmony_ci        self.assertEqual(manifest, MANIFEST % {'sep': os.sep})
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
2497db96d56Sopenharmony_ci    def test_metadata_check_option(self):
2507db96d56Sopenharmony_ci        # testing the `medata-check` option
2517db96d56Sopenharmony_ci        dist, cmd = self.get_cmd(metadata={})
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci        # this should raise some warnings !
2547db96d56Sopenharmony_ci        # with the `check` subcommand
2557db96d56Sopenharmony_ci        cmd.ensure_finalized()
2567db96d56Sopenharmony_ci        cmd.run()
2577db96d56Sopenharmony_ci        warnings = [msg for msg in self.get_logs(WARN) if
2587db96d56Sopenharmony_ci                    msg.startswith('warning: check:')]
2597db96d56Sopenharmony_ci        self.assertEqual(len(warnings), 2)
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci        # trying with a complete set of metadata
2627db96d56Sopenharmony_ci        self.clear_logs()
2637db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
2647db96d56Sopenharmony_ci        cmd.ensure_finalized()
2657db96d56Sopenharmony_ci        cmd.metadata_check = 0
2667db96d56Sopenharmony_ci        cmd.run()
2677db96d56Sopenharmony_ci        warnings = [msg for msg in self.get_logs(WARN) if
2687db96d56Sopenharmony_ci                    msg.startswith('warning: check:')]
2697db96d56Sopenharmony_ci        self.assertEqual(len(warnings), 0)
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci    def test_check_metadata_deprecated(self):
2727db96d56Sopenharmony_ci        # makes sure make_metadata is deprecated
2737db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
2747db96d56Sopenharmony_ci        with check_warnings() as w:
2757db96d56Sopenharmony_ci            warnings.simplefilter("always")
2767db96d56Sopenharmony_ci            cmd.check_metadata()
2777db96d56Sopenharmony_ci            self.assertEqual(len(w.warnings), 1)
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci    def test_show_formats(self):
2807db96d56Sopenharmony_ci        with captured_stdout() as stdout:
2817db96d56Sopenharmony_ci            show_formats()
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci        # the output should be a header line + one line per format
2847db96d56Sopenharmony_ci        num_formats = len(ARCHIVE_FORMATS.keys())
2857db96d56Sopenharmony_ci        output = [line for line in stdout.getvalue().split('\n')
2867db96d56Sopenharmony_ci                  if line.strip().startswith('--formats=')]
2877db96d56Sopenharmony_ci        self.assertEqual(len(output), num_formats)
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci    def test_finalize_options(self):
2907db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
2917db96d56Sopenharmony_ci        cmd.finalize_options()
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci        # default options set by finalize
2947db96d56Sopenharmony_ci        self.assertEqual(cmd.manifest, 'MANIFEST')
2957db96d56Sopenharmony_ci        self.assertEqual(cmd.template, 'MANIFEST.in')
2967db96d56Sopenharmony_ci        self.assertEqual(cmd.dist_dir, 'dist')
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci        # formats has to be a string splitable on (' ', ',') or
2997db96d56Sopenharmony_ci        # a stringlist
3007db96d56Sopenharmony_ci        cmd.formats = 1
3017db96d56Sopenharmony_ci        self.assertRaises(DistutilsOptionError, cmd.finalize_options)
3027db96d56Sopenharmony_ci        cmd.formats = ['zip']
3037db96d56Sopenharmony_ci        cmd.finalize_options()
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci        # formats has to be known
3067db96d56Sopenharmony_ci        cmd.formats = 'supazipa'
3077db96d56Sopenharmony_ci        self.assertRaises(DistutilsOptionError, cmd.finalize_options)
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci    # the following tests make sure there is a nice error message instead
3107db96d56Sopenharmony_ci    # of a traceback when parsing an invalid manifest template
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci    def _check_template(self, content):
3137db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
3147db96d56Sopenharmony_ci        os.chdir(self.tmp_dir)
3157db96d56Sopenharmony_ci        self.write_file('MANIFEST.in', content)
3167db96d56Sopenharmony_ci        cmd.ensure_finalized()
3177db96d56Sopenharmony_ci        cmd.filelist = FileList()
3187db96d56Sopenharmony_ci        cmd.read_template()
3197db96d56Sopenharmony_ci        warnings = self.get_logs(WARN)
3207db96d56Sopenharmony_ci        self.assertEqual(len(warnings), 1)
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci    def test_invalid_template_unknown_command(self):
3237db96d56Sopenharmony_ci        self._check_template('taunt knights *')
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci    def test_invalid_template_wrong_arguments(self):
3267db96d56Sopenharmony_ci        # this manifest command takes one argument
3277db96d56Sopenharmony_ci        self._check_template('prune')
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci    @unittest.skipIf(os.name != 'nt', 'test relevant for Windows only')
3307db96d56Sopenharmony_ci    def test_invalid_template_wrong_path(self):
3317db96d56Sopenharmony_ci        # on Windows, trailing slashes are not allowed
3327db96d56Sopenharmony_ci        # this used to crash instead of raising a warning: #8286
3337db96d56Sopenharmony_ci        self._check_template('include examples/')
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
3367db96d56Sopenharmony_ci    def test_get_file_list(self):
3377db96d56Sopenharmony_ci        # make sure MANIFEST is recalculated
3387db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci        # filling data_files by pointing files in package_data
3417db96d56Sopenharmony_ci        dist.package_data = {'somecode': ['*.txt']}
3427db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
3437db96d56Sopenharmony_ci        cmd.formats = ['gztar']
3447db96d56Sopenharmony_ci        cmd.ensure_finalized()
3457db96d56Sopenharmony_ci        cmd.run()
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci        f = open(cmd.manifest)
3487db96d56Sopenharmony_ci        try:
3497db96d56Sopenharmony_ci            manifest = [line.strip() for line in f.read().split('\n')
3507db96d56Sopenharmony_ci                        if line.strip() != '']
3517db96d56Sopenharmony_ci        finally:
3527db96d56Sopenharmony_ci            f.close()
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci        self.assertEqual(len(manifest), 5)
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci        # adding a file
3577db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#')
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci        # make sure build_py is reinitialized, like a fresh run
3607db96d56Sopenharmony_ci        build_py = dist.get_command_obj('build_py')
3617db96d56Sopenharmony_ci        build_py.finalized = False
3627db96d56Sopenharmony_ci        build_py.ensure_finalized()
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci        cmd.run()
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci        f = open(cmd.manifest)
3677db96d56Sopenharmony_ci        try:
3687db96d56Sopenharmony_ci            manifest2 = [line.strip() for line in f.read().split('\n')
3697db96d56Sopenharmony_ci                         if line.strip() != '']
3707db96d56Sopenharmony_ci        finally:
3717db96d56Sopenharmony_ci            f.close()
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci        # do we have the new file in MANIFEST ?
3747db96d56Sopenharmony_ci        self.assertEqual(len(manifest2), 6)
3757db96d56Sopenharmony_ci        self.assertIn('doc2.txt', manifest2[-1])
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
3787db96d56Sopenharmony_ci    def test_manifest_marker(self):
3797db96d56Sopenharmony_ci        # check that autogenerated MANIFESTs have a marker
3807db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
3817db96d56Sopenharmony_ci        cmd.ensure_finalized()
3827db96d56Sopenharmony_ci        cmd.run()
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci        f = open(cmd.manifest)
3857db96d56Sopenharmony_ci        try:
3867db96d56Sopenharmony_ci            manifest = [line.strip() for line in f.read().split('\n')
3877db96d56Sopenharmony_ci                        if line.strip() != '']
3887db96d56Sopenharmony_ci        finally:
3897db96d56Sopenharmony_ci            f.close()
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ci        self.assertEqual(manifest[0],
3927db96d56Sopenharmony_ci                         '# file GENERATED by distutils, do NOT edit')
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, "Need zlib support to run")
3957db96d56Sopenharmony_ci    def test_manifest_comments(self):
3967db96d56Sopenharmony_ci        # make sure comments don't cause exceptions or wrong includes
3977db96d56Sopenharmony_ci        contents = dedent("""\
3987db96d56Sopenharmony_ci            # bad.py
3997db96d56Sopenharmony_ci            #bad.py
4007db96d56Sopenharmony_ci            good.py
4017db96d56Sopenharmony_ci            """)
4027db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
4037db96d56Sopenharmony_ci        cmd.ensure_finalized()
4047db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, cmd.manifest), contents)
4057db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'good.py'), '# pick me!')
4067db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'bad.py'), "# don't pick me!")
4077db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, '#bad.py'), "# don't pick me!")
4087db96d56Sopenharmony_ci        cmd.run()
4097db96d56Sopenharmony_ci        self.assertEqual(cmd.filelist.files, ['good.py'])
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
4127db96d56Sopenharmony_ci    def test_manual_manifest(self):
4137db96d56Sopenharmony_ci        # check that a MANIFEST without a marker is left alone
4147db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
4157db96d56Sopenharmony_ci        cmd.formats = ['gztar']
4167db96d56Sopenharmony_ci        cmd.ensure_finalized()
4177db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, cmd.manifest), 'README.manual')
4187db96d56Sopenharmony_ci        self.write_file((self.tmp_dir, 'README.manual'),
4197db96d56Sopenharmony_ci                         'This project maintains its MANIFEST file itself.')
4207db96d56Sopenharmony_ci        cmd.run()
4217db96d56Sopenharmony_ci        self.assertEqual(cmd.filelist.files, ['README.manual'])
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci        f = open(cmd.manifest)
4247db96d56Sopenharmony_ci        try:
4257db96d56Sopenharmony_ci            manifest = [line.strip() for line in f.read().split('\n')
4267db96d56Sopenharmony_ci                        if line.strip() != '']
4277db96d56Sopenharmony_ci        finally:
4287db96d56Sopenharmony_ci            f.close()
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci        self.assertEqual(manifest, ['README.manual'])
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci        archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
4337db96d56Sopenharmony_ci        archive = tarfile.open(archive_name)
4347db96d56Sopenharmony_ci        try:
4357db96d56Sopenharmony_ci            filenames = [tarinfo.name for tarinfo in archive]
4367db96d56Sopenharmony_ci        finally:
4377db96d56Sopenharmony_ci            archive.close()
4387db96d56Sopenharmony_ci        self.assertEqual(sorted(filenames), ['fake-1.0', 'fake-1.0/PKG-INFO',
4397db96d56Sopenharmony_ci                                             'fake-1.0/README.manual'])
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, "requires zlib")
4427db96d56Sopenharmony_ci    @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
4437db96d56Sopenharmony_ci    @unittest.skipIf(find_executable('tar') is None,
4447db96d56Sopenharmony_ci                     "The tar command is not found")
4457db96d56Sopenharmony_ci    @unittest.skipIf(find_executable('gzip') is None,
4467db96d56Sopenharmony_ci                     "The gzip command is not found")
4477db96d56Sopenharmony_ci    def test_make_distribution_owner_group(self):
4487db96d56Sopenharmony_ci        # now building a sdist
4497db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci        # creating a gztar and specifying the owner+group
4527db96d56Sopenharmony_ci        cmd.formats = ['gztar']
4537db96d56Sopenharmony_ci        cmd.owner = pwd.getpwuid(0)[0]
4547db96d56Sopenharmony_ci        cmd.group = grp.getgrgid(0)[0]
4557db96d56Sopenharmony_ci        cmd.ensure_finalized()
4567db96d56Sopenharmony_ci        cmd.run()
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ci        # making sure we have the good rights
4597db96d56Sopenharmony_ci        archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
4607db96d56Sopenharmony_ci        archive = tarfile.open(archive_name)
4617db96d56Sopenharmony_ci        try:
4627db96d56Sopenharmony_ci            for member in archive.getmembers():
4637db96d56Sopenharmony_ci                self.assertEqual(member.uid, 0)
4647db96d56Sopenharmony_ci                self.assertEqual(member.gid, 0)
4657db96d56Sopenharmony_ci        finally:
4667db96d56Sopenharmony_ci            archive.close()
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci        # building a sdist again
4697db96d56Sopenharmony_ci        dist, cmd = self.get_cmd()
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci        # creating a gztar
4727db96d56Sopenharmony_ci        cmd.formats = ['gztar']
4737db96d56Sopenharmony_ci        cmd.ensure_finalized()
4747db96d56Sopenharmony_ci        cmd.run()
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci        # making sure we have the good rights
4777db96d56Sopenharmony_ci        archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
4787db96d56Sopenharmony_ci        archive = tarfile.open(archive_name)
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci        # note that we are not testing the group ownership here
4817db96d56Sopenharmony_ci        # because, depending on the platforms and the container
4827db96d56Sopenharmony_ci        # rights (see #7408)
4837db96d56Sopenharmony_ci        try:
4847db96d56Sopenharmony_ci            for member in archive.getmembers():
4857db96d56Sopenharmony_ci                self.assertEqual(member.uid, os.getuid())
4867db96d56Sopenharmony_ci        finally:
4877db96d56Sopenharmony_ci            archive.close()
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_cidef test_suite():
4907db96d56Sopenharmony_ci    return unittest.TestLoader().loadTestsFromTestCase(SDistTestCase)
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ciif __name__ == "__main__":
4937db96d56Sopenharmony_ci    run_unittest(test_suite())
494