@@ -4,7 +4,9 @@
# SPDX-License-Identifier: MIT
#
+import json
import os
+import pathlib
import tempfile
import fnmatch
@@ -225,3 +227,17 @@ class OePkgdataUtilTests(OESelftestTestCase):
self.assertEqual(result.status, 2, "Status different than 2. output: %s" % result.output)
currpos = result.output.find('usage: oe-pkgdata-util')
self.assertTrue(currpos != -1, msg = "Test is Failed. Help is not Displayed in %s" % result.output)
+
+ def test_read_extended(self):
+ result = runCmd('oe-pkgdata-util read-extended libz-dbg')
+ extended_data = json.loads(result.output)
+
+ self.assertIn('files_info', extended_data, "Could not find key 'files_info' in '%s'" % extended_data)
+
+ files_info = extended_data['files_info']
+ libz_file_name = next((key for key in files_info.keys() \
+ if pathlib.Path(key).name.startswith('libz')), None)
+ self.assertIsNotNone(libz_file_name, "Couldn't find libz in '%s'" % files_info)
+
+ file_info = files_info[libz_file_name]
+ self.assertIn('size', file_info, "Couldn't find key 'size' in '%s'" % file_info)
@@ -16,6 +16,8 @@ import fnmatch
import re
import argparse
import logging
+import pathlib
+import subprocess
from collections import defaultdict, OrderedDict
scripts_path = os.path.dirname(os.path.realpath(__file__))
@@ -206,6 +208,34 @@ def read_value(args):
else:
logger.debug("revlink %s does not exist", revlink)
+def read_extended(args):
+ if not args.pkg:
+ logger.error("No package specified")
+ sys.exit(1)
+
+ logger.debug("read-extended('%s', '%s')" % (args.pkgdata_dir, args.pkg))
+
+ pkgdata_dir = pathlib.Path(args.pkgdata_dir)
+ pkg_name = args.pkg.split('_')[0]
+
+ # Map runtime package name to recipe-world
+ runtimepkgpath = pkgdata_dir / "runtime-reverse" / pkg_name
+ recipe_pkg_name = runtimepkgpath.readlink().name
+
+ extendedpath = pkgdata_dir / "extended" / ("%s.json.zstd" % recipe_pkg_name)
+
+ if not extendedpath.exists():
+ logger.error("Extended package information '%s' does not exist", extendedpath)
+ sys.exit(1)
+
+ try:
+ info = subprocess.check_output(["zstdcat", extendedpath]).decode("utf-8")
+ print(info)
+ except subprocess.CalledProcessError as exc:
+ logger.error("Failed to decompress '%s': %s", extendedpath, exc, exc_info=exc)
+ sys.exit(1)
+
+
def lookup_pkglist(pkgs, pkgdata_dir, reverse):
if reverse:
mappings = OrderedDict()
@@ -586,6 +616,12 @@ def main():
parser_read_value.add_argument('-u', '--unescape', help='Expand escapes such as \\n', action='store_true')
parser_read_value.set_defaults(func=read_value)
+ parser_read_extended = subparsers.add_parser('read-extended',
+ help='Read extended pkgdata for a package',
+ description='Outputs the extended data content of a package')
+ parser_read_extended.add_argument('pkg', help='Package name to look up')
+ parser_read_extended.set_defaults(func=read_extended)
+
parser_glob = subparsers.add_parser('glob',
help='Expand package name glob expression',
description='Expands one or more glob expressions over the packages listed in pkglistfile')
So far, reading the "extended" data of a package stored within "pkgdata" is not supported. Extend oe-pkgdata-util to support this use case. For symmetry to `read-value` and `package-info` it expects the runtime package name as its package name. Passing in multiple packages is not supported as this would require further processing by clients using this command before the returned JSON payload can be parsed. Signed-off-by: Philip Lorenz <philip.lorenz@bmw.de> --- meta/lib/oeqa/selftest/cases/pkgdata.py | 16 +++++++++++ scripts/oe-pkgdata-util | 36 +++++++++++++++++++++++++ 2 files changed, 52 insertions(+)