6 import os, sys, zipfile, logging, stat, time
7 from StringIO
import StringIO
28 if fn.endswith(
".pyc"):
30 infos[fn] = i.date_time
39 log = logging.getLogger(
"zipdir")
40 dirlen = len(directory) + 1
41 for root, dirs, files
in os.walk(directory):
42 if "lib-dynload" in dirs:
44 dirs.remove(
"lib-dynload")
45 arcdir = root[dirlen:]
47 ext = os.path.splitext(f)[1]
49 filename = os.path.join(arcdir, f)
50 all_files.add(filename)
51 if filename
not in infos:
53 added.append(filename)
55 filetime = time.localtime(os.stat(os.path.join(directory,filename))[stat.ST_MTIME])[:6]
56 if filetime > infos[filename]:
58 modified.append(filename)
61 untouched.append(filename)
63 log.debug(" %s -> %s", action, filename)
65 log.info(
" %s -> %s", action, filename)
66 elif ext
not in [
".pyc",
".pyo",
".stamp",
".cmtref"]:
67 raise ZipdirError(
"Cannot add '%s' to the zip file, only '.py' are allowed." % os.path.join(arcdir, f))
69 for filename
in infos:
70 if filename
not in all_files:
71 removed.append(filename)
72 log.info(
" %s -> %s",
"R", filename)
73 return (added, modified, untouched, removed)
76 def zipdir(directory, no_pyc = False):
77 log = logging.getLogger(
"zipdir")
78 if not os.path.isdir(directory):
79 raise OSError(20,
"Not a directory", directory)
80 msg =
"Zipping directory '%s'"
82 msg +=
" (without pre-compilation)"
83 log.info(msg, directory)
84 filename = os.path.realpath(directory +
".zip")
87 if os.path.exists(filename):
88 zipFile = open(filename,
"r+b")
93 zipFile = open(filename,
"ab")
97 if zipfile.is_zipfile(filename):
98 infolist = zipfile.ZipFile(filename).infolist()
101 (added, modified, untouched, removed) =
_zipChanges(directory, infolist)
102 if added
or modified
or removed:
104 z = zipfile.PyZipFile(tempBuf,
"w", zipfile.ZIP_DEFLATED)
105 for f
in added + modified + untouched:
106 src = os.path.join(directory, f)
108 log.debug(
"adding '%s'", f)
112 if os.path.exists(src +
'c'):
113 log.debug(
"removing old .pyc for '%s'", f)
115 log.debug(
"adding '%s'", f)
116 z.writepy(src, os.path.dirname(f))
119 zipFile.write(tempBuf.getvalue())
121 log.info(
"File '%s' closed", filename)
123 log.info(
"Nothing to do on '%s'", filename)
131 from optparse
import OptionParser
132 parser = OptionParser(usage =
"%prog [options] directory1 [directory2 ...]")
133 parser.add_option(
"--no-pyc", action =
"store_true",
134 help =
"copy the .py files without pre-compiling them")
135 parser.add_option(
"--quiet", action =
"store_true",
136 help =
"do not print info messages")
137 parser.add_option(
"--debug", action =
"store_true",
138 help =
"print debug messages (has priority over --quiet)")
142 opts, args = parser.parse_args(argv[1:])
145 parser.error(
"Specify at least one directory to zip")
150 level = logging.WARNING
152 level = logging.DEBUG
153 logging.basicConfig(level = level)
155 if "GAUDI_BUILD_LOCK" in os.environ:
156 _scopedLock =
locker.LockFile(os.environ[
"GAUDI_BUILD_LOCK"], temporary =
True)
161 if __name__ ==
'__main__':