14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Tests for distutils.archive_util.""" 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__revision__ = "$Id$" 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tarfile 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom os.path import splitdrive 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.archive_util import (check_archive_formats, make_tarball, 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_zipfile, make_archive, 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARCHIVE_FORMATS) 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.spawn import find_executable, spawn 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.tests import support 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import check_warnings, run_unittest 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry: 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import grp 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import pwd 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm UID_GID_SUPPORT = True 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError: 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm UID_GID_SUPPORT = False 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry: 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import zipfile 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ZIP_SUPPORT = True 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError: 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ZIP_SUPPORT = find_executable('zip') 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# some tests will fail if zlib is not available 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry: 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import zlib 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError: 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm zlib = None 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ArchiveUtilTestCase(support.TempdirManager, 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm support.LoggingSilencer, 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unittest.TestCase): 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(zlib, "requires zlib") 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_make_tarball(self): 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # creating something to tar 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir = self.mkdtemp() 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([tmpdir, 'file1'], 'xxx') 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([tmpdir, 'file2'], 'xxx') 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.mkdir(os.path.join(tmpdir, 'sub')) 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([tmpdir, 'sub', 'file3'], 'xxx') 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir2 = self.mkdtemp() 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0], 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "source and target should be on same drive") 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir2, 'archive') 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # working with relative paths to avoid tar warnings 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(splitdrive(base_name)[1], '.') 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check if the compressed tarball was created 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.tar.gz' 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball)) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # trying an uncompressed one 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir2, 'archive') 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(splitdrive(base_name)[1], '.', compress=None) 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.tar' 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball)) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _tarinfo(self, path): 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tar = tarfile.open(path) 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = tar.getnames() 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.sort() 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return tuple(names) 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tar.close() 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _create_files(self): 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # creating something to tar 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir = self.mkdtemp() 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist = os.path.join(tmpdir, 'dist') 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.mkdir(dist) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([dist, 'file1'], 'xxx') 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([dist, 'file2'], 'xxx') 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.mkdir(os.path.join(dist, 'sub')) 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([dist, 'sub', 'file3'], 'xxx') 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.mkdir(os.path.join(dist, 'sub2')) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir2 = self.mkdtemp() 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir2, 'archive') 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return tmpdir, tmpdir2, base_name 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(zlib, "Requires zlib") 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(find_executable('tar') and find_executable('gzip'), 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'Need the tar command to run') 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_tarfile_vs_tar(self): 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir, tmpdir2, base_name = self._create_files() 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(base_name, 'dist') 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check if the compressed tarball was created 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.tar.gz' 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball)) 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # now create another tarball using `tar` 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball2 = os.path.join(tmpdir, 'archive2.tar.gz') 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist'] 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gzip_cmd = ['gzip', '-f9', 'archive2.tar'] 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm spawn(tar_cmd) 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm spawn(gzip_cmd) 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball2)) 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # let's compare both tarballs 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2)) 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # trying an uncompressed one 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir2, 'archive') 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(base_name, 'dist', compress=None) 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.tar' 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball)) 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # now for a dry_run 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir2, 'archive') 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(base_name, 'dist', compress=None, dry_run=True) 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.tar' 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball)) 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(find_executable('compress'), 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'The compress program is required') 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_compress_deprecated(self): 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir, tmpdir2, base_name = self._create_files() 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # using compress and testing the PendingDeprecationWarning 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with check_warnings() as w: 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.simplefilter("always") 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(base_name, 'dist', compress='compress') 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.tar.Z' 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(tarball)) 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(w.warnings), 1) 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # same test with dry_run 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.remove(tarball) 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with check_warnings() as w: 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.simplefilter("always") 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_tarball(base_name, 'dist', compress='compress', 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dry_run=True) 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not os.path.exists(tarball)) 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(w.warnings), 1) 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(zlib, "Requires zlib") 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run') 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_make_zipfile(self): 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # creating something to tar 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir = self.mkdtemp() 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([tmpdir, 'file1'], 'xxx') 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.write_file([tmpdir, 'file2'], 'xxx') 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir2 = self.mkdtemp() 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir2, 'archive') 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_zipfile(base_name, tmpdir) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check if the compressed tarball was created 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tarball = base_name + '.zip' 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_check_archive_formats(self): 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']), 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'xxx') 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(check_archive_formats(['gztar', 'zip']), None) 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_make_archive(self): 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir = self.mkdtemp() 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(tmpdir, 'archive') 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, make_archive, base_name, 'xxx') 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(zlib, "Requires zlib") 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_make_archive_owner_group(self): 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # testing make_archive with owner and group, with various combinations 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # this works even if there's not gid/uid support 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if UID_GID_SUPPORT: 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm group = grp.getgrgid(0)[0] 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm owner = pwd.getpwuid(0)[0] 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm group = owner = 'root' 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_dir, root_dir, base_name = self._create_files() 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm base_name = os.path.join(self.mkdtemp() , 'archive') 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner, 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm group=group) 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(res)) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = make_archive(base_name, 'zip', root_dir, base_dir) 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(res)) 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = make_archive(base_name, 'tar', root_dir, base_dir, 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm owner=owner, group=group) 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(res)) 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = make_archive(base_name, 'tar', root_dir, base_dir, 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm owner='kjhkjhkjg', group='oihohoh') 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(res)) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(zlib, "Requires zlib") 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support") 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_tarfile_root_owner(self): 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmpdir, tmpdir2, base_name = self._create_files() 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dir = os.getcwd() 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(tmpdir) 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm group = grp.getgrgid(0)[0] 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm owner = pwd.getpwuid(0)[0] 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm archive_name = make_tarball(base_name, 'dist', compress=None, 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm owner=owner, group=group) 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(old_dir) 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check if the compressed tarball was created 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(os.path.exists(archive_name)) 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # now checks the rights 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm archive = tarfile.open(archive_name) 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for member in archive.getmembers(): 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(member.uid, 0) 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(member.gid, 0) 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm archive.close() 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_make_archive_cwd(self): 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm current_dir = os.getcwd() 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _breaks(*args, **kw): 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise RuntimeError() 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file') 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm make_archive('xxx', 'xxx', root_dir=self.mkdtemp()) 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except: 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(os.getcwd(), current_dir) 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del ARCHIVE_FORMATS['xxx'] 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_suite(): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return unittest.makeSuite(ArchiveUtilTestCase) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm run_unittest(test_suite()) 285