2ec20efcac5bd08419a34e7d37fe67145ceb87fc
Author: Mark Story
Date: 2009-12-08 00:38:52 -0500
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
