summaryrefslogtreecommitdiff
path: root/modules/CIAO/bin/update_package.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/bin/update_package.py')
-rwxr-xr-xmodules/CIAO/bin/update_package.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/modules/CIAO/bin/update_package.py b/modules/CIAO/bin/update_package.py
new file mode 100755
index 00000000000..5719b0c7627
--- /dev/null
+++ b/modules/CIAO/bin/update_package.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+""" This script facilitates the update of binaries in a given DAnCE package.
+ Note that it DOES NOT modify meta-data, only blindly replacing existing
+ binaries that match by name EXACTLY"""
+
+#Globals
+verbose = False
+take_action = True
+
+def parse_args ():
+ from optparse import OptionParser
+
+ parser = OptionParser ("usage: %prog [options] package_to_update")
+
+ parser.add_option ("-I", "--include-dir", dest="include_dir", action="store",
+ help="Specify a path to search for new implementations/descriptors",
+ default="./impl/")
+ parser.add_option ("-o", "--output-dir", dest="out_dir", action="store",
+ help="Specify the directory to write updated packages",
+ default="./new_packages/")
+ parser.add_option ("-f", "--out-file", dest="out_file", action="store",
+ help="Specify the name of the file to output. Default is same name",
+ default=None)
+ parser.add_option ("-v", "--verbose", action="store_true", default=False,
+ dest="verbose", help="Print verbose debugging output")
+ parser.add_option ("-n", "--no-action", action="store_false")
+ (opts, args) = parser.parse_args ()
+
+ if len(args) != 1:
+ parser.error ("Must specify exactly one package to update")
+
+ if opts.out_file is None:
+ opts.out_file = os.path.basename (args[0])
+
+ return (opts, args)
+
+def vprint (string):
+ if verbose:
+ print string
+
+"""Caches all files in include paths"""
+def cache_files (dirs):
+ files = dict ()
+ vprint ("Building file list")
+ for item in dirs:
+ for root, dirs, files in os.walk (item, topDown=True):
+ for item in files:
+ fullpath = os.join (root, item)
+ if item not in files:
+ vprint ("Adding " + item + " as " + fullpath)
+ files[item] = fullpath
+ else:
+ vprint ("Skipping " + fullpath + " because " + item + " has been found earlier")
+
+ return files
+
+""" Update a package from infile, a ZipFile object to outfile, a ZipFile object,
+ using files in the dictionary files"""
+def update_package (infile, outfile, files):
+ orig_list = infile.namelist ()
+
+ for item in filelist:
+ vprint ("Considering " + item + " from source package")
+
+ if item[-1] == '/':
+ vprint ("\tSkipping because its a directory")
+ else:
+ bn_item = os.path.basename (item)
+
+ if bn_item in files.keys ():
+ vprint ("\tFound replacement: " + files[bn_item])
+ vprint ("\tPerforming replacement....")
+
+ if take_action:
+ ofile.write (files[bn_item], item)
+ else:
+ print "\tAction: Replace " + item + " with " + item
+ continue # next item
+
+ if take_action:
+ ofile.writestr (item, zfile.read (item))
+ else:
+ print "\tAction: Migrate " + item + " unchanged"
+
+def main ():
+ opts, args = parse_args ()
+
+ from zipfile import ZipFile
+
+ ## Construct output file
+ of_name = os.path.join (opts.out_path, opts.out_file)
+ vprint ("Chose " + of_name + " as output file")
+
+ #make sure out_path exists
+ if os.path.exists (os.path.basename (of_name)):
+ vprint ("Destination path does not exist, creating....")
+ if take_action:
+ os.mkdir (os.path.basename (of_name))
+ else:
+ print "Action: create path " + os.path.basename (of_name)
+
+ # Create zipfile objects
+ infile = ZipFile (args[0], 'a')
+ outfile = None
+
+ if take_action:
+ outfile = ZipFile (of_name, 'w')
+
+ # cache include directories
+ files = cache_files (opts.include_dirs)
+
+ # Perform update
+ update_package (infile, outfile, files)
+
+ print "Package successfully updated"
+
+if __name__ == "__main__":
+ main (opts, args)