diff mbox

[Branch,~linaro-image-tools/linaro-image-tools/trunk] Rev 404: hwpack-replace: allow the caller to specify a prefix of packages to remove.

Message ID 20110811220012.9497.8275.launchpad@ackee.canonical.com
State Accepted
Headers show

Commit Message

James Westby Aug. 11, 2011, 10 p.m. UTC
Merge authors:
  Deepti B. Kalakeri (deeptik)
Related merge proposals:
  https://code.launchpad.net/~deeptik/linaro-image-tools/fix_bug_Bug816767/+merge/70465
  proposed by: Deepti B. Kalakeri (deeptik)
  review: Approve - James Westby (james-w)
------------------------------------------------------------
revno: 404 [merge]
committer: James Westby <james.westby@linaro.org>
branch nick: trunk
timestamp: Thu 2011-08-11 17:57:55 -0400
message:
  hwpack-replace: allow the caller to specify a prefix of packages to remove.
modified:
  linaro-hwpack-replace


--
lp:linaro-image-tools
https://code.launchpad.net/~linaro-image-tools/linaro-image-tools/trunk

You are subscribed to branch lp:linaro-image-tools.
To unsubscribe from this branch go to https://code.launchpad.net/~linaro-image-tools/linaro-image-tools/trunk/+edit-subscription
diff mbox

Patch

=== modified file 'linaro-hwpack-replace'
--- linaro-hwpack-replace	2011-08-03 11:29:43 +0000
+++ linaro-hwpack-replace	2011-08-11 06:33:07 +0000
@@ -4,7 +4,9 @@ 
 # Author: Deepti B. Kalakeri <deepti.kalakeri@linaro.org>
 #
 # This file is part of Linaro Image Tools. It adds the feature
-# to include/replace a debian package into the given hwpack
+# to include/replace a debian package into the given hwpack.
+# We might need to change the manifest and Packages file in the 
+# future to match the hardware pack v2 changes when available.
 #
 # Linaro Image Tools is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -36,10 +38,13 @@ 
 
 
 parser = argparse.ArgumentParser()
-parser.add_argument("-t", "--hwpack_name", dest="hwpack_name",
-                    help="Specific hwpack_name to use (default: None)")
-parser.add_argument("-p", "--deb_pack", dest="deb_pack",
+parser.add_argument("-t", "--hwpack-name", dest="hwpack_name",
+                    help="Specific hwpack-name to use (default: None)")
+parser.add_argument("-p", "--deb-pack", dest="deb_pack",
                     help="Specific debian package to replace (default: None).")
+parser.add_argument("-r", "--prefix-pkg-remove", dest="prefix_pkg_remove",
+                    help="Specify the prefix of the old debian package to "\
+                          "replace (default: None).")
 parser.add_argument("-d", "--debug-output", action="store_true", dest="debug",
                     help="Verbose messages are displayed when specified")
 
@@ -76,74 +81,67 @@ 
     return('_'.join(hwpack_name_parts[:2] + timestamp + hwpack_name_parts[3:]))
 
 
-def verify_existing_debians(debpack_dirname, new_debpack_info):
+def should_remove(package_name, prefix_pkg_remove):
+    # hwpack-* Package is a metadata package that contain reference to the 
+    # linux-linaro-omap that was previously present in the hwpack.
+    # We need to make sure we dont write the hwpack-* related
+    # package information into Package, otherwise it would try to download the old
+    # kernel package that was present in the hwpack than installing the new one.
+    if (package_name.startswith(prefix_pkg_remove) or 
+        package_name.startswith("hwpack-")):
+        return True
+    return False
+
+def verify_existing_debians(debpack_dirname, prefix_pkg_remove):
     """
        Find if the debian file with the same name exists,
        if it exists then remove it and replace with the new deb file
        If similar debian file exists then remove it
     """
 
-    old_debpack_info = None
     deb_file_to_remove = None
 
     try:
         for deb_filename in os.listdir(debpack_dirname):
             root, ext = os.path.splitext(deb_filename)
-            root = root + '_'
-            if root.startswith("%s_" %new_debpack_info.name) and ext == '.deb':
+            if should_remove(root, prefix_pkg_remove) and ext == '.deb':
                 deb_file_to_remove =  os.path.join(debpack_dirname, deb_filename)
-                old_debpack_info = FetchedPackage.from_deb(deb_file_to_remove)
                 os.remove(deb_file_to_remove)
     except Exception, details:
         logger.error("Error Details: %s", details)
 
-    return old_debpack_info
-
-
-def modify_manifest_info(tempdir, new_debpack_info, deb_pack_found):
+
+def modify_manifest_info(tempdir, new_debpack_info, prefix_pkg_remove):
     """ Modify the manifest file to include the new debian information """
 
     debpack_manifest_fname = os.path.join(tempdir, "manifest")
     new_debpack_line = '%s=%s\n' % (new_debpack_info.name, new_debpack_info.version)
 
     for line in fileinput.FileInput(debpack_manifest_fname, inplace=1):
-        if '=' in line:
-            package_name, version = line.split('=')
-            old_debpack = '%s=%s' % (package_name, version)
-        else:
-            package_name = line.rstrip("\n")
-            old_debpack = '%s' % package_name
-
-        if new_debpack_info.name == package_name:
-            deb_pack_found = 1
-            line = new_debpack_line
-        sys.stdout.write(line)
-
-    if deb_pack_found == 0:
-        logger.debug("Adding the new debian package info to manifest")
-        fout = open(debpack_manifest_fname, "a")
-        fout.write(new_debpack_line)
-        fout.close()
-    else:
-        logger.debug("Replaced the old debian package information "\
-                    "with the new information")
-
-
-def modify_Packages_info(debpack_dirname, new_debpack_info):
+        if not should_remove(line, prefix_pkg_remove):
+            sys.stdout.write(line)
+
+    logger.debug("Adding the new debian package info to manifest")
+    fout = open(debpack_manifest_fname, "a")
+    fout.write(new_debpack_line)
+    fout.close()
+
+
+def modify_Packages_info(debpack_dirname, new_debpack_info, prefix_pkg_remove):
     """ Modify the Packages file to include the new debian information """
 
     debpack_Packages_fname = os.path.join(debpack_dirname, "Packages")
-    f = open(debpack_Packages_fname, "r+")
     try:
         output = []
-        def should_remove(package_name):
-            return package_name == new_debpack_info.name
+
+        f = open(debpack_Packages_fname, "r+")
         for stanza in Packages.iter_paragraphs(f):
-            if not should_remove(stanza["Package"]):
+            if not should_remove(stanza["Package"], prefix_pkg_remove):
                 output.append(stanza)
         output.append(DummyStanza(new_debpack_info))
+
         f.seek(0,0)
-
+        f.truncate()
         for stanza in output:
             stanza.dump(f)
             f.write("\n")
@@ -154,7 +152,8 @@ 
 def main():
     # Validate that all the required information is passed on the command line
     args = parser.parse_args()
-    if args.hwpack_name == None or args.deb_pack == None:
+    if (args.hwpack_name == None or args.deb_pack == None or
+        args.prefix_pkg_remove == None):
         parser.print_help()
         parser.error("You must specify both hwpack name "\
                      "and the debian package information\n")
@@ -162,10 +161,9 @@ 
 
     set_logging_param(args)
 
-    deb_pack_found = 0
-    old_debpack_info = None
     old_hwpack = args.hwpack_name
     new_deb_file_to_copy = args.deb_pack
+    prefix_pkg_remove = args.prefix_pkg_remove
     status = 0
 
     try:
@@ -190,14 +188,14 @@ 
 
         new_debpack_info = FetchedPackage.from_deb(new_deb_file_to_copy)
 
-        old_debpack_info = verify_existing_debians(debpack_dirname, new_debpack_info)
+        verify_existing_debians(debpack_dirname, prefix_pkg_remove)
 
         # Copy the new debian file to the pkgs dir,
         shutil.copy2(new_deb_file_to_copy, debpack_dirname)
 
-        modify_manifest_info(tempdir, new_debpack_info, deb_pack_found)
+        modify_manifest_info(tempdir, new_debpack_info, prefix_pkg_remove)
 
-        modify_Packages_info(debpack_dirname, new_debpack_info)
+        modify_Packages_info(debpack_dirname, new_debpack_info, prefix_pkg_remove)
 
         #tar the hardware pack with the new debian file included in it
         tar = tarfile.open( hwpack_name , "w:gz")
@@ -212,6 +210,7 @@ 
     if status == 0:
         logger.info("The debian package '%s' has been been included in '%s'",
                      new_deb_file_to_copy, hwpack_name)
+        print hwpack_name
     else:
         logger.error("Injecting the debian package '%s' failed", new_deb_file_to_copy)