summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew M. Kuchling <amk@amk.ca>2002-11-21 18:33:28 (GMT)
committerAndrew M. Kuchling <amk@amk.ca>2002-11-21 18:33:28 (GMT)
commitcdd215789c86f3cd729cf10c9d6fe6b3d5df5d7b (patch)
treedc91b61dbb88d5537ae6ad065e8ddbaeaaa3d1d6
parent3350b5bfd9be61b6567c60e15387a72ad0166564 (diff)
downloadcpython-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.py58
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",