1
0
mirror of https://git.yoctoproject.org/poky synced 2026-07-27 07:27:12 +00:00

devtool: search: also look in recipe cache

If pkgdata isn't present or is incomplete, then you get either a
traceback or you don't see the results you were hoping for. The recipe
cache that bitbake collects during startup contains some useful
information for each recipe that we could search through as well, and
we can access it easily using tinfoil's all_recipes() API function,
so add some code that does that. (We still show a warning if pkgdata
isn't present, as there are certain dynamic packages that are generated
at packaging time that won't show up in the cache).

One side-effect of this is that we will start showing non-target
recipes - that's actually a good thing, since seeing those is useful,
however we exclude nativesdk recipes when in the eSDK to avoid confusion
since nativesdk isn't directly applicable there.

Fixes [YOCTO #12356].

(From OE-Core rev: b8406383886d09a80a9a002150dcf364fa9902d7)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Paul Eggleton
2018-02-26 14:50:00 +13:00
committed by Richard Purdie
parent 2f48cb606b
commit e8c7c36c60
+63 -33
View File
@@ -36,44 +36,74 @@ def search(args, config, basepath, workspace):
keyword_rc = re.compile(args.keyword) keyword_rc = re.compile(args.keyword)
for fn in os.listdir(pkgdata_dir): def print_match(pn):
pfn = os.path.join(pkgdata_dir, fn) rd = parse_recipe(config, tinfoil, pn, True)
if not os.path.isfile(pfn): if not rd:
return
summary = rd.getVar('SUMMARY')
if summary == rd.expand(defsummary):
summary = ''
print("%s %s" % (pn.ljust(20), summary))
matches = []
if os.path.exists(pkgdata_dir):
for fn in os.listdir(pkgdata_dir):
pfn = os.path.join(pkgdata_dir, fn)
if not os.path.isfile(pfn):
continue
packages = []
match = False
if keyword_rc.search(fn):
match = True
if not match:
with open(pfn, 'r') as f:
for line in f:
if line.startswith('PACKAGES:'):
packages = line.split(':', 1)[1].strip().split()
for pkg in packages:
if keyword_rc.search(pkg):
match = True
break
if os.path.exists(os.path.join(pkgdata_dir, 'runtime', pkg + '.packaged')):
with open(os.path.join(pkgdata_dir, 'runtime', pkg), 'r') as f:
for line in f:
if ': ' in line:
splitline = line.split(':', 1)
key = splitline[0]
value = splitline[1].strip()
if key in ['PKG_%s' % pkg, 'DESCRIPTION', 'FILES_INFO'] or key.startswith('FILERPROVIDES_'):
if keyword_rc.search(value):
match = True
break
if match:
print_match(fn)
matches.append(fn)
else:
logger.warning('Package data is not available, results may be limited')
for recipe in tinfoil.all_recipes():
if args.fixed_setup and 'nativesdk' in recipe.inherits():
continue continue
packages = []
match = False match = False
if keyword_rc.search(fn): if keyword_rc.search(recipe.pn):
match = True match = True
else:
if not match: for prov in recipe.provides:
with open(pfn, 'r') as f: if keyword_rc.search(prov):
for line in f:
if line.startswith('PACKAGES:'):
packages = line.split(':', 1)[1].strip().split()
for pkg in packages:
if keyword_rc.search(pkg):
match = True match = True
break break
if os.path.exists(os.path.join(pkgdata_dir, 'runtime', pkg + '.packaged')): if not match:
with open(os.path.join(pkgdata_dir, 'runtime', pkg), 'r') as f: for rprov in recipe.rprovides:
for line in f: if keyword_rc.search(rprov):
if ': ' in line: match = True
splitline = line.split(':', 1) break
key = splitline[0] if match and not recipe.pn in matches:
value = splitline[1].strip() print_match(recipe.pn)
if key in ['PKG_%s' % pkg, 'DESCRIPTION', 'FILES_INFO'] or key.startswith('FILERPROVIDES_'):
if keyword_rc.search(value):
match = True
break
if match:
rd = parse_recipe(config, tinfoil, fn, True)
summary = rd.getVar('SUMMARY')
if summary == rd.expand(defsummary):
summary = ''
print("%s %s" % (fn.ljust(20), summary))
finally: finally:
tinfoil.shutdown() tinfoil.shutdown()
@@ -85,4 +115,4 @@ def register_commands(subparsers, context):
description='Searches for available target recipes. Matches on recipe name, package name, description and installed files, and prints the recipe name on match.', description='Searches for available target recipes. Matches on recipe name, package name, description and installed files, and prints the recipe name on match.',
group='info') group='info')
parser_search.add_argument('keyword', help='Keyword to search for (regular expression syntax allowed)') parser_search.add_argument('keyword', help='Keyword to search for (regular expression syntax allowed)')
parser_search.set_defaults(func=search, no_workspace=True) parser_search.set_defaults(func=search, no_workspace=True, fixed_setup=context.fixed_setup)