diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2002-11-21 18:33:28 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2002-11-21 18:33:28 (GMT) |
commit | cdd215789c86f3cd729cf10c9d6fe6b3d5df5d7b (patch) | |
tree | dc91b61dbb88d5537ae6ad065e8ddbaeaaa3d1d6 | |
parent | 3350b5bfd9be61b6567c60e15387a72ad0166564 (diff) | |
download | cpython-cdd215789c86f3cd729cf10c9d6fe6b3d5df5d7b.zip cpython-cdd215789c86f3cd729cf10c9d6fe6b3d5df5d7b.tar.gz cpython-cdd215789c86f3cd729cf10c9d6fe6b3d5df5d7b.tar.bz2 |
Bug #639118 from Ollie Oldham: archiver should use zipfile before zip
Previously archive_util.py attempted to spawn an
external 'zip' program for the zip action, if this fails, an
attempt to import zipfile.py is made...
This bites folks who have 'old' or non-conforming zip
programs on windows platforms. This change tries the 'zipfile'
module first, falling back to spawning a zip process if
the module isn't available.
-rw-r--r-- | Lib/distutils/archive_util.py | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/Lib/distutils/archive_util.py b/Lib/distutils/archive_util.py index d1dc909..d5b3096 100644 --- a/Lib/distutils/archive_util.py +++ b/Lib/distutils/archive_util.py @@ -59,46 +59,48 @@ def make_tarball (base_name, base_dir, compress="gzip", 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 InfoZIP - "zip" utility (if installed and found on the default search path) or - the "zipfile" Python module (if available). If neither tool is - available, raises DistutilsExecError. Returns the name of the output - zip file. + 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. """ - # This initially assumed the Unix 'zip' utility -- but - # apparently InfoZIP's zip.exe works the same under Windows, so - # no changes needed! - + try: + import zipfile + except ImportError: + zipfile = None + zip_filename = base_name + ".zip" mkpath(os.path.dirname(zip_filename), dry_run=dry_run) - try: - spawn(["zip", "-rq", zip_filename, base_dir], - dry_run=dry_run) - except DistutilsExecError: - - # XXX really should distinguish between "couldn't find - # external 'zip' command" and "zip failed" -- shouldn't try - # again in the latter case. (I think fixing this will - # require some cooperation from the spawn module -- perhaps - # a utility function to search the path, so we can fallback - # on zipfile.py without the failed spawn.) + + # If zipfile module is not available, try spawning an external + # 'zip' command. + if zipfile is None: + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + try: - import zipfile - except ImportError: + spawn(["zip", zipoptions, zip_filename, base_dir], + dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". raise DistutilsExecError, \ - ("unable to create zip file '%s': " + - "could neither find a standalone zip utility nor " + - "import the 'zipfile' module") % zip_filename + ("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename - - log.info("creating '%s' and adding '%s' to it", + else: + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) - + def visit (z, dirname, names): for name in names: path = os.path.normpath(os.path.join(dirname, name)) if os.path.isfile(path): z.write(path, path) + log.info("adding '%s'" % path) if not dry_run: z = zipfile.ZipFile(zip_filename, "w", |