diff options
-rw-r--r-- | Lib/distutils/archive_util.py | 80 | ||||
-rw-r--r-- | Lib/distutils/tests/test_archive_util.py | 70 |
2 files changed, 110 insertions, 40 deletions
diff --git a/Lib/distutils/archive_util.py b/Lib/distutils/archive_util.py index 9444ff0..08a9e56 100644 --- a/Lib/distutils/archive_util.py +++ b/Lib/distutils/archive_util.py @@ -11,15 +11,16 @@ from distutils.spawn import spawn from distutils.dir_util import mkpath from distutils import log -def make_tarball (base_name, base_dir, compress="gzip", - verbose=0, dry_run=0): +def make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0): """Create a (possibly compressed) tar file from all the files under - 'base_dir'. 'compress' must be "gzip" (the default), "compress", - "bzip2", or None. Both "tar" and the compression utility named by - 'compress' must be on the default program search path, so this is - probably Unix-specific. The output tar file will be named 'base_dir' + - ".tar", possibly plus the appropriate compression extension (".gz", - ".bz2" or ".Z"). Return the output filename. + 'base_dir'. + + 'compress' must be "gzip" (the default), "compress", "bzip2", or None. + Both "tar" and the compression utility named by 'compress' must be on + the default program search path, so this is probably Unix-specific. + The output tar file will be named 'base_dir' + ".tar", possibly plus + the appropriate compression extension (".gz", ".bz2" or ".Z"). + Returns the output filename. """ # XXX GNU tar 1.13 has a nifty option to add a prefix directory. # It's pretty new, though, so we certainly can't require it -- @@ -27,9 +28,9 @@ def make_tarball (base_name, base_dir, compress="gzip", # "create a tree of hardlinks" step! (Would also be nice to # detect GNU tar to use its 'z' option and save a step.) - compress_ext = { 'gzip': ".gz", - 'bzip2': '.bz2', - 'compress': ".Z" } + compress_ext = {'gzip': ".gz", + 'bzip2': '.bz2', + 'compress': ".Z" } # flags for compression program, each element of list will be an argument compress_flags = {'gzip': ["-f9"], @@ -52,15 +53,14 @@ def make_tarball (base_name, base_dir, compress="gzip", else: return archive_name -# make_tarball () +def make_zipfile(base_name, base_dir, verbose=0, dry_run=0): + """Create a zip file from all the files under 'base_dir'. - -def make_zipfile (base_name, base_dir, verbose=0, dry_run=0): - """Create a zip file from all the files under 'base_dir'. The output - zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" - Python module (if available) or the InfoZIP "zip" utility (if installed - and found on the default search path). If neither tool is available, - raises DistutilsExecError. Returns the name of the output zip file. + The output zip file will be named 'base_dir' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises DistutilsExecError. Returns the name of the output zip + file. """ try: import zipfile @@ -93,22 +93,19 @@ def make_zipfile (base_name, base_dir, verbose=0, dry_run=0): zip_filename, base_dir) if not dry_run: - z = zipfile.ZipFile(zip_filename, "w", - compression=zipfile.ZIP_DEFLATED) + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) for dirpath, dirnames, filenames in os.walk(base_dir): for name in filenames: path = os.path.normpath(os.path.join(dirpath, name)) if os.path.isfile(path): - z.write(path, path) + zip.write(path, path) log.info("adding '%s'" % path) - z.close() + zip.close() return zip_filename -# make_zipfile () - - ARCHIVE_FORMATS = { 'gztar': (make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), 'bztar': (make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), @@ -117,19 +114,24 @@ ARCHIVE_FORMATS = { 'zip': (make_zipfile, [],"ZIP file") } -def check_archive_formats (formats): +def check_archive_formats(formats): + """Returns the first format from the 'format' list that is unknown. + + If all formats are known, returns None + """ for format in formats: if format not in ARCHIVE_FORMATS: return format - else: - return None - -def make_archive (base_name, format, - root_dir=None, base_dir=None, - verbose=0, dry_run=0): - """Create an archive file (eg. zip or tar). 'base_name' is the name - of the file to create, minus any format-specific extension; 'format' - is the archive format: one of "zip", "tar", "ztar", or "gztar". + return None + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "ztar", + or "gztar". + 'root_dir' is a directory that will be the root directory of the archive; ie. we typically chdir into 'root_dir' before creating the archive. 'base_dir' is the directory where we start archiving from; @@ -147,7 +149,7 @@ def make_archive (base_name, format, if base_dir is None: base_dir = os.curdir - kwargs = { 'dry_run': dry_run } + kwargs = {'dry_run': dry_run} try: format_info = ARCHIVE_FORMATS[format] @@ -155,7 +157,7 @@ def make_archive (base_name, format, raise ValueError("unknown archive format '%s'" % format) func = format_info[0] - for (arg,val) in format_info[1]: + for arg, val in format_info[1]: kwargs[arg] = val filename = func(base_name, base_dir, **kwargs) @@ -164,5 +166,3 @@ def make_archive (base_name, format, os.chdir(save_cwd) return filename - -# make_archive () diff --git a/Lib/distutils/tests/test_archive_util.py b/Lib/distutils/tests/test_archive_util.py new file mode 100644 index 0000000..f5fd9ea --- /dev/null +++ b/Lib/distutils/tests/test_archive_util.py @@ -0,0 +1,70 @@ +"""Tests for distutils.archive_util.""" +__revision__ = "$Id:$" + +import unittest +import os + +from distutils.archive_util import (check_archive_formats, make_tarball, + make_zipfile, make_archive) +from distutils.spawn import find_executable +from distutils.tests import support + +try: + import zipfile + ZIP_SUPPORT = True +except ImportError: + ZIP_SUPPORT = find_executable('zip') + +class ArchiveUtilTestCase(support.TempdirManager, + unittest.TestCase): + + @unittest.skipUnless(find_executable('tar'), 'Need the tar command to run') + def test_make_tarball(self): + # creating something to tar + tmpdir = self.mkdtemp() + self.write_file([tmpdir, 'file1'], 'xxx') + self.write_file([tmpdir, 'file2'], 'xxx') + + tmpdir2 = self.mkdtemp() + base_name = os.path.join(tmpdir2, 'archive') + make_tarball(base_name, tmpdir) + + # check if the compressed tarball was created + tarball = base_name + '.tar.gz' + self.assert_(os.path.exists(tarball)) + + # trying an uncompressed one + base_name = os.path.join(tmpdir2, 'archive') + make_tarball(base_name, tmpdir, compress=None) + tarball = base_name + '.tar' + self.assert_(os.path.exists(tarball)) + + @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run') + def test_make_tarball(self): + # creating something to tar + tmpdir = self.mkdtemp() + self.write_file([tmpdir, 'file1'], 'xxx') + self.write_file([tmpdir, 'file2'], 'xxx') + + tmpdir2 = self.mkdtemp() + base_name = os.path.join(tmpdir2, 'archive') + make_zipfile(base_name, tmpdir) + + # check if the compressed tarball was created + tarball = base_name + '.zip' + + def test_check_archive_formats(self): + self.assertEquals(check_archive_formats(['gztar', 'xxx', 'zip']), + 'xxx') + self.assertEquals(check_archive_formats(['gztar', 'zip']), None) + + def test_make_archive(self): + tmpdir = self.mkdtemp() + base_name = os.path.join(tmpdir, 'archive') + self.assertRaises(ValueError, make_archive, base_name, 'xxx') + +def test_suite(): + return unittest.makeSuite(ArchiveUtilTestCase) + +if __name__ == "__main__": + unittest.main(defaultTest="test_suite") |