summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander D. Kanevskiy <kad@kad.name>2016-06-08 18:07:43 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-06-12 23:39:29 +0100
commitbc0cdaa927124150a6c38cd47977ee4da8dd440e (patch)
treec5d6e9a311e1d7cce45fc2e448aa0e655c418026
parentb950539c911b7945d652b05616164828e711ac7f (diff)
downloadopenembedded-core-bc0cdaa927124150a6c38cd47977ee4da8dd440e.tar.gz
openembedded-core-bc0cdaa927124150a6c38cd47977ee4da8dd440e.tar.bz2
openembedded-core-bc0cdaa927124150a6c38cd47977ee4da8dd440e.zip
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} Signed-off-by: Alexander D. Kanevskiy <kad@kad.name> Signed-off-by: Ross Burton <ross.burton@intel.com>
-rwxr-xr-xscripts/oe-pkgdata-util62
1 files changed, 62 insertions, 0 deletions
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util
index 9b9098215c..e4d262d7b7 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')