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