2ec20efcac5bd08419a34e7d37fe67145ceb87fc

Author: Mark Story

Date: 2009-12-08 00:38:52 -0500

Adding build.py, it makes packages of debug_kit.

diff --git a/build.py b/build.py new file mode 100755 index 0000000..29d79f3 --- /dev/null +++ b/build.py @@ -0,0 +1,123 @@ +#! /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') + + for root, dirs, files in os.walk(source_dir): + inRoot = False + if root == source_dir: + inRoot = True + + 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() \ No newline at end of file