diff options
Diffstat (limited to 'scripts/oe-pkgdata-util')
| -rwxr-xr-x | scripts/oe-pkgdata-util | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util index 91a1234ba4..2830f48c73 100755 --- a/scripts/oe-pkgdata-util +++ b/scripts/oe-pkgdata-util | |||
| @@ -253,6 +253,91 @@ def lookup_recipe(args): | |||
| 253 | items.extend(mappings.get(pkg, [])) | 253 | items.extend(mappings.get(pkg, [])) |
| 254 | print('\n'.join(items)) | 254 | print('\n'.join(items)) |
| 255 | 255 | ||
| 256 | def get_recipe_pkgs(pkgdata_dir, recipe, unpackaged): | ||
| 257 | recipedatafile = os.path.join(pkgdata_dir, recipe) | ||
| 258 | if not os.path.exists(recipedatafile): | ||
| 259 | logger.error("Unable to find packaged recipe with name %s" % recipe) | ||
| 260 | sys.exit(1) | ||
| 261 | packages = [] | ||
| 262 | with open(recipedatafile, 'r') as f: | ||
| 263 | for line in f: | ||
| 264 | fields = line.rstrip().split(': ') | ||
| 265 | if fields[0] == 'PACKAGES': | ||
| 266 | packages = fields[1].split() | ||
| 267 | break | ||
| 268 | |||
| 269 | if not unpackaged: | ||
| 270 | pkglist = [] | ||
| 271 | for pkg in packages: | ||
| 272 | if os.path.exists(os.path.join(pkgdata_dir, 'runtime', '%s.packaged' % pkg)): | ||
| 273 | pkglist.append(pkg) | ||
| 274 | return pkglist | ||
| 275 | else: | ||
| 276 | return packages | ||
| 277 | |||
| 278 | def list_pkgs(args): | ||
| 279 | found = False | ||
| 280 | |||
| 281 | def matchpkg(pkg): | ||
| 282 | if args.pkgspec: | ||
| 283 | matched = False | ||
| 284 | for pkgspec in args.pkgspec: | ||
| 285 | if fnmatch.fnmatchcase(pkg, pkgspec): | ||
| 286 | matched = True | ||
| 287 | break | ||
| 288 | if not matched: | ||
| 289 | return False | ||
| 290 | if not args.unpackaged: | ||
| 291 | if args.runtime: | ||
| 292 | revlink = os.path.join(args.pkgdata_dir, "runtime-reverse", pkg) | ||
| 293 | if os.path.exists(revlink): | ||
| 294 | # We're unlikely to get here if the package was not packaged, but just in case | ||
| 295 | # we add the symlinks for unpackaged files in the future | ||
| 296 | mappedpkg = os.path.basename(os.readlink(revlink)) | ||
| 297 | if not os.path.exists(os.path.join(args.pkgdata_dir, 'runtime', '%s.packaged' % mappedpkg)): | ||
| 298 | return False | ||
| 299 | else: | ||
| 300 | return False | ||
| 301 | else: | ||
| 302 | if not os.path.exists(os.path.join(args.pkgdata_dir, 'runtime', '%s.packaged' % pkg)): | ||
| 303 | return False | ||
| 304 | return True | ||
| 305 | |||
| 306 | if args.recipe: | ||
| 307 | packages = get_recipe_pkgs(args.pkgdata_dir, args.recipe, args.unpackaged) | ||
| 308 | |||
| 309 | if args.runtime: | ||
| 310 | pkglist = [] | ||
| 311 | runtime_pkgs = lookup_pkglist(packages, args.pkgdata_dir, False) | ||
| 312 | for rtpkgs in runtime_pkgs.values(): | ||
| 313 | pkglist.extend(rtpkgs) | ||
| 314 | else: | ||
| 315 | pkglist = packages | ||
| 316 | |||
| 317 | for pkg in pkglist: | ||
| 318 | if matchpkg(pkg): | ||
| 319 | found = True | ||
| 320 | print("%s" % pkg) | ||
| 321 | else: | ||
| 322 | if args.runtime: | ||
| 323 | searchdir = 'runtime-reverse' | ||
| 324 | else: | ||
| 325 | searchdir = 'runtime' | ||
| 326 | |||
| 327 | for root, dirs, files in os.walk(os.path.join(args.pkgdata_dir, searchdir)): | ||
| 328 | for fn in files: | ||
| 329 | if fn.endswith('.packaged'): | ||
| 330 | continue | ||
| 331 | if matchpkg(fn): | ||
| 332 | found = True | ||
| 333 | print("%s" % fn) | ||
| 334 | if not found: | ||
| 335 | if args.pkgspec: | ||
| 336 | logger.error("Unable to find any package matching %s" % args.pkgspec) | ||
| 337 | else: | ||
| 338 | logger.error("No packages found") | ||
| 339 | sys.exit(1) | ||
| 340 | |||
| 256 | def find_path(args): | 341 | def find_path(args): |
| 257 | import json | 342 | import json |
| 258 | 343 | ||
| @@ -288,6 +373,15 @@ def main(): | |||
| 288 | parser_lookup_pkg.add_argument('-r', '--reverse', help='Switch to looking up recipe-space package names from runtime package names', action='store_true') | 373 | parser_lookup_pkg.add_argument('-r', '--reverse', help='Switch to looking up recipe-space package names from runtime package names', action='store_true') |
| 289 | parser_lookup_pkg.set_defaults(func=lookup_pkg) | 374 | parser_lookup_pkg.set_defaults(func=lookup_pkg) |
| 290 | 375 | ||
| 376 | parser_list_pkgs = subparsers.add_parser('list-pkgs', | ||
| 377 | help='List packages', | ||
| 378 | description='Lists packages that have been built') | ||
| 379 | parser_list_pkgs.add_argument('pkgspec', nargs='*', help='Package name to search for (wildcards * ? allowed, use quotes to avoid shell expansion)') | ||
| 380 | parser_list_pkgs.add_argument('-r', '--runtime', help='Show runtime package names instead of recipe-space package names', action='store_true') | ||
| 381 | parser_list_pkgs.add_argument('-p', '--recipe', help='Limit to packages produced by the specified recipe') | ||
| 382 | parser_list_pkgs.add_argument('-u', '--unpackaged', help='Include unpackaged (i.e. empty) packages', action='store_true') | ||
| 383 | parser_list_pkgs.set_defaults(func=list_pkgs) | ||
| 384 | |||
| 291 | parser_lookup_recipe = subparsers.add_parser('lookup-recipe', | 385 | parser_lookup_recipe = subparsers.add_parser('lookup-recipe', |
| 292 | help='Find recipe producing one or more packages', | 386 | help='Find recipe producing one or more packages', |
| 293 | description='Looks up the specified runtime package(s) to see which recipe they were produced by') | 387 | description='Looks up the specified runtime package(s) to see which recipe they were produced by') |
