[gnome-continuous-yocto/gnomeostree-3.28-rocko: 804/8267] oe-pkgdata-util: new option to provide full info for binary package(s)



commit 61ba9308d176af3c056084b5ce932d4472e4590a
Author: Alexander D. Kanevskiy <kad kad name>
Date:   Wed Jun 8 18:07:43 2016 +0300

    oe-pkgdata-util: new option to provide full info for binary package(s)
    
    New option can be used for displaying full information about binary
    package(s), including name, full version, recipe name, recipe full
    version and package size.
    
    This information can be useful inside custom buildhistory class
    to produce detailed image manifest for further analysis.
    
    List of packages can be specified as command line arguments or can
    be read from file (e.g. from existing image manifest).
    
    Warning: In case of image manifest is used as input outside of build
    process, be aware that pkgdata might change since the time image
    was built.
    
    Output format:
    {PKG} [PKGE:]{PKGV}[-{PKGR}] {PN} [PE:]{PV}[-{PR}] {PKGSIZE}
    
    (From OE-Core rev: bc0cdaa927124150a6c38cd47977ee4da8dd440e)
    
    Signed-off-by: Alexander D. Kanevskiy <kad kad name>
    Signed-off-by: Ross Burton <ross burton intel com>
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 scripts/oe-pkgdata-util |   62 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 62 insertions(+), 0 deletions(-)
---
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util
index 9b90982..e4d262d 100755
--- a/scripts/oe-pkgdata-util
+++ b/scripts/oe-pkgdata-util
@@ -274,6 +274,61 @@ def lookup_recipe(args):
         items.extend(mappings.get(pkg, []))
     print('\n'.join(items))
 
+def package_info(args):
+    # Handle both multiple arguments and multiple values within an arg (old syntax)
+    packages = []
+    if args.file:
+        with open(args.file, 'r') as f:
+            for line in f:
+                splitline = line.split()
+                if splitline:
+                    packages.append(splitline[0])
+    else:
+        for pkgitem in args.pkg:
+            packages.extend(pkgitem.split())
+        if not packages:
+            logger.error("No packages specified")
+            sys.exit(1)
+
+    mappings = defaultdict(lambda: defaultdict(str))
+    for pkg in packages:
+        pkgfile = os.path.join(args.pkgdata_dir, 'runtime-reverse', pkg)
+        if os.path.exists(pkgfile):
+            with open(pkgfile, 'r') as f:
+                for line in f:
+                    fields = line.rstrip().split(': ')
+                    if fields[0].endswith("_" + pkg):
+                        k = fields[0][:len(fields[0]) - len(pkg) - 1]
+                    else:
+                        k = fields[0]
+                    v = fields[1] if len(fields) == 2 else ""
+                    mappings[pkg][k] = v
+
+    if len(mappings) < len(packages):
+        missing = list(set(packages) - set(mappings.keys()))
+        logger.error("The following packages could not be found: %s" %
+                     ', '.join(missing))
+        sys.exit(1)
+
+    items = []
+    for pkg in packages:
+        pkg_version = mappings[pkg]['PKGV']
+        if mappings[pkg]['PKGE']:
+            pkg_version = mappings[pkg]['PKGE'] + ":" + pkg_version
+        if mappings[pkg]['PKGR']:
+            pkg_version = pkg_version + "-" + mappings[pkg]['PKGR']
+        recipe = mappings[pkg]['PN']
+        recipe_version = mappings[pkg]['PV']
+        if mappings[pkg]['PE']:
+            recipe_version = mappings[pkg]['PE'] + ":" + recipe_version
+        if mappings[pkg]['PR']:
+            recipe_version = recipe_version + "-" + mappings[pkg]['PR']
+        pkg_size = mappings[pkg]['PKGSIZE']
+
+        items.append("%s %s %s %s %s" %
+                     (pkg, pkg_version, recipe, recipe_version, pkg_size))
+    print('\n'.join(items))
+
 def get_recipe_pkgs(pkgdata_dir, recipe, unpackaged):
     recipedatafile = os.path.join(pkgdata_dir, recipe)
     if not os.path.exists(recipedatafile):
@@ -470,6 +525,13 @@ def main():
     parser_lookup_recipe.add_argument('pkg', nargs='+', help='Runtime package name to look up')
     parser_lookup_recipe.set_defaults(func=lookup_recipe)
 
+    parser_package_info = subparsers.add_parser('package-info',
+                                          help='Shows version, recipe and size information for one or more 
packages',
+                                          description='Looks up the specified runtime package(s) and display 
information')
+    parser_package_info.add_argument('pkg', nargs='*', help='Runtime package name to look up')
+    parser_package_info.add_argument('-f', '--file', help='Read package names from the specified file (one 
per line, first field only)')
+    parser_package_info.set_defaults(func=package_info)
+
     parser_find_path = subparsers.add_parser('find-path',
                                           help='Find package providing a target path',
                                           description='Finds the recipe-space package providing the 
specified target path')


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]