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 <[email protected]>
---
 meta/lib/oeqa/selftest/cases/pkgdata.py | 16 +++++++++++
 scripts/oe-pkgdata-util                 | 36 +++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/meta/lib/oeqa/selftest/cases/pkgdata.py 
b/meta/lib/oeqa/selftest/cases/pkgdata.py
index d786c33018d..6c5b7a84f47 100644
--- a/meta/lib/oeqa/selftest/cases/pkgdata.py
+++ b/meta/lib/oeqa/selftest/cases/pkgdata.py
@@ -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)
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util
index 44ae40549ae..50be8e0bb60 100755
--- a/scripts/oe-pkgdata-util
+++ b/scripts/oe-pkgdata-util
@@ -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')
-- 
2.44.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#196639): 
https://lists.openembedded.org/g/openembedded-core/message/196639
Mute This Topic: https://lists.openembedded.org/mt/104747699/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to