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