khanat-opennel-code/code/web/public_php/webtt/plugins/debug_kit/build.py

130 lines
No EOL
3.9 KiB
Python

#! /usr/bin/env python
import sys, os
import tarfile, zipfile, gzip, bz2
from optparse import OptionParser
"""
Builds packaged releases of DebugKit so I don't have to do things manually.
Excludes itself (build.py), .gitignore, .DS_Store and the .git folder from the archives.
"""
def main():
parser = OptionParser();
parser.add_option('-o', '--output-dir', dest="output_dir",
help="write the packages to DIR", metavar="DIR")
parser.add_option('-p', '--prefix-name', dest="prefix",
help="prefix used for the generated files")
parser.add_option('-k', '--skip', dest="skip", default="",
help="A comma separated list of files to skip")
parser.add_option('-s', '--source-dir', dest="source", default=".",
help="The source directory for the build process")
(options, args) = parser.parse_args()
if options.output_dir == '' or options.output_dir == options.source:
print 'Requires an output dir, and that output dir cannot be the same as the source one!'
exit()
# append .git and build.py to the skip files
skip = options.skip.split(',')
skip.extend(['.git', '.gitignore', '.DS_Store', 'build.py'])
# get list of files in top level dir.
files = os.listdir(options.source)
os.chdir(options.source)
# filter the files, I couldn't figure out how to do it in a more concise way.
for f in files[:]:
try:
skip.index(f)
files.remove(f)
except ValueError:
pass
# make a boring tar file
destfile = ''.join([options.output_dir, options.prefix])
tar_file_name = destfile + '.tar'
tar = tarfile.open(tar_file_name, 'w');
for f in files:
tar.add(f)
tar.close()
print "Generated tar file"
# make the gzip
if make_gzip(tar_file_name, destfile):
print "Generated gzip file"
else:
print "Could not generate gzip file"
# make the bz2
if make_bz2(tar_file_name, destfile):
print "Generated bz2 file"
else:
print "Could not generate bz2 file"
# make the zip file
zip_recursive(destfile + '.zip', options.source, files)
print "Generated zip file\n"
def make_gzip(tar_file, destination):
"""
Takes a tar_file and destination. Compressess the tar file and creates
a .tar.gzip
"""
tar_contents = open(tar_file, 'rb')
gzipfile = gzip.open(destination + '.tar.gz', 'wb')
gzipfile.writelines(tar_contents)
gzipfile.close()
tar_contents.close()
return True
def make_bz2(tar_file, destination):
"""
Takes a tar_file and destination. Compressess the tar file and creates
a .tar.bz2
"""
tar_contents = open(tar_file, 'rb')
bz2file = bz2.BZ2File(destination + '.tar.bz2', 'wb')
bz2file.writelines(tar_contents)
bz2file.close()
tar_contents.close()
return True
def zip_recursive(destination, source_dir, rootfiles):
"""
Recursively zips source_dir into destination.
rootfiles should contain a list of files in the top level directory that
are to be included. Any top level files not in rootfiles will be omitted
from the zip file.
"""
zipped = zipfile.ZipFile(destination, 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(source_dir):
inRoot = False
if root == source_dir:
inRoot = True
if inRoot:
for d in dirs:
try:
rootfiles.index(d)
except ValueError:
dirs.remove(d)
for f in files[:]:
if inRoot:
try:
rootfiles.index(f)
except ValueError:
continue
fullpath = os.path.join(root, f)
zipped.write(fullpath)
zipped.close()
return destination
if __name__ == '__main__':
main()