]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/distutils/archive_util.py
   1 """distutils.archive_util 
   3 Utility functions for creating archive files (tarballs, zip files, 
   4 that sort of thing).""" 
   6 # This module should be kept compatible with Python 1.5.2. 
  11 from distutils
.errors 
import DistutilsExecError
 
  12 from distutils
.spawn 
import spawn
 
  13 from distutils
.dir_util 
import mkpath
 
  14 from distutils 
import log
 
  16 def make_tarball (base_name
, base_dir
, compress
="gzip", 
  17                   verbose
=0, dry_run
=0): 
  18     """Create a (possibly compressed) tar file from all the files under 
  19     'base_dir'.  'compress' must be "gzip" (the default), "compress", 
  20     "bzip2", or None.  Both "tar" and the compression utility named by 
  21     'compress' must be on the default program search path, so this is 
  22     probably Unix-specific.  The output tar file will be named 'base_dir' + 
  23     ".tar", possibly plus the appropriate compression extension (".gz", 
  24     ".bz2" or ".Z").  Return the output filename. 
  26     # XXX GNU tar 1.13 has a nifty option to add a prefix directory. 
  27     # It's pretty new, though, so we certainly can't require it -- 
  28     # but it would be nice to take advantage of it to skip the 
  29     # "create a tree of hardlinks" step!  (Would also be nice to 
  30     # detect GNU tar to use its 'z' option and save a step.) 
  32     compress_ext 
= { 'gzip': ".gz", 
  36     # flags for compression program, each element of list will be an argument 
  37     compress_flags 
= {'gzip': ["-f9"], 
  41     if compress 
is not None and compress 
not in compress_ext
.keys(): 
  43               "bad value for 'compress': must be None, 'gzip', or 'compress'" 
  45     archive_name 
= base_name 
+ ".tar" 
  46     mkpath(os
.path
.dirname(archive_name
), dry_run
=dry_run
) 
  47     cmd 
= ["tar", "-cf", archive_name
, base_dir
] 
  48     spawn(cmd
, dry_run
=dry_run
) 
  51         spawn([compress
] + compress_flags
[compress
] + [archive_name
], 
  53         return archive_name 
+ compress_ext
[compress
] 
  60 def make_zipfile (base_name
, base_dir
, verbose
=0, dry_run
=0): 
  61     """Create a zip file from all the files under 'base_dir'.  The output 
  62     zip file will be named 'base_dir' + ".zip".  Uses either the "zipfile" 
  63     Python module (if available) or the InfoZIP "zip" utility (if installed 
  64     and found on the default search path).  If neither tool is available, 
  65     raises DistutilsExecError.  Returns the name of the output zip file. 
  72     zip_filename 
= base_name 
+ ".zip" 
  73     mkpath(os
.path
.dirname(zip_filename
), dry_run
=dry_run
) 
  75     # If zipfile module is not available, try spawning an external 
  84             spawn(["zip", zipoptions
, zip_filename
, base_dir
], 
  86         except DistutilsExecError
: 
  87             # XXX really should distinguish between "couldn't find 
  88             # external 'zip' command" and "zip failed". 
  89             raise DistutilsExecError
, \
 
  90                   ("unable to create zip file '%s': " 
  91                    "could neither import the 'zipfile' module nor " 
  92                    "find a standalone zip utility") % zip_filename
 
  95         log
.info("creating '%s' and adding '%s' to it", 
  96                  zip_filename
, base_dir
) 
  98         def visit (z
, dirname
, names
): 
 100                 path 
= os
.path
.normpath(os
.path
.join(dirname
, name
)) 
 101                 if os
.path
.isfile(path
): 
 103                     log
.info("adding '%s'" % path
) 
 106             z 
= zipfile
.ZipFile(zip_filename
, "w", 
 107                                 compression
=zipfile
.ZIP_DEFLATED
) 
 109             os
.path
.walk(base_dir
, visit
, z
) 
 118     'gztar': (make_tarball
, [('compress', 'gzip')], "gzip'ed tar-file"), 
 119     'bztar': (make_tarball
, [('compress', 'bzip2')], "bzip2'ed tar-file"), 
 120     'ztar':  (make_tarball
, [('compress', 'compress')], "compressed tar file"), 
 121     'tar':   (make_tarball
, [('compress', None)], "uncompressed tar file"), 
 122     'zip':   (make_zipfile
, [],"ZIP file") 
 125 def check_archive_formats (formats
): 
 126     for format 
in formats
: 
 127         if not ARCHIVE_FORMATS
.has_key(format
): 
 132 def make_archive (base_name
, format
, 
 133                   root_dir
=None, base_dir
=None, 
 134                   verbose
=0, dry_run
=0): 
 135     """Create an archive file (eg. zip or tar).  'base_name' is the name 
 136     of the file to create, minus any format-specific extension; 'format' 
 137     is the archive format: one of "zip", "tar", "ztar", or "gztar". 
 138     'root_dir' is a directory that will be the root directory of the 
 139     archive; ie. we typically chdir into 'root_dir' before creating the 
 140     archive.  'base_dir' is the directory where we start archiving from; 
 141     ie. 'base_dir' will be the common prefix of all files and 
 142     directories in the archive.  'root_dir' and 'base_dir' both default 
 143     to the current directory.  Returns the name of the archive file. 
 145     save_cwd 
= os
.getcwd() 
 146     if root_dir 
is not None: 
 147         log
.debug("changing into '%s'", root_dir
) 
 148         base_name 
= os
.path
.abspath(base_name
) 
 155     kwargs 
= { 'dry_run': dry_run }
 
 158         format_info 
= ARCHIVE_FORMATS
[format
] 
 160         raise ValueError, "unknown archive format '%s'" % format
 
 162     func 
= format_info
[0] 
 163     for (arg
,val
) in format_info
[1]: 
 165     filename 
= apply(func
, (base_name
, base_dir
), kwargs
) 
 167     if root_dir 
is not None: 
 168         log
.debug("changing back to '%s'", save_cwd
)