update.py: add layers when RECOMMENDS isn't satisfied

When layer_a RECOMMENDS layer_b, try to add layer_b before layer_a, but if
layer_b is not found, still add layer_a.

And print summary error mesage:

$ update.py -b master

ERROR: Issues found on branch master:
    openembedded-core: Added without LAYERRECOMMENDS
    meta-secure-env: Failed to add since LAYERDEPENDS is not satisfied

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
Robert Yang 2018-07-06 15:20:47 +08:00 committed by Paul Eggleton
parent a661ebe6ac
commit f5e2751034

View File

@ -299,6 +299,7 @@ def main():
last_rev = {} last_rev = {}
failed_layers = {} failed_layers = {}
for branch in branches: for branch in branches:
failed_layers[branch] = []
# If layer_A depends(or recommends) on layer_B, add layer_B before layer_A # If layer_A depends(or recommends) on layer_B, add layer_B before layer_A
deps_dict_all = {} deps_dict_all = {}
layerquery_sorted = [] layerquery_sorted = []
@ -399,28 +400,34 @@ def main():
deps = re.search("^LAYERDEPENDS = \"(.*)\"", output, re.M).group(1) or '' deps = re.search("^LAYERDEPENDS = \"(.*)\"", output, re.M).group(1) or ''
recs = re.search("^LAYERRECOMMENDS = \"(.*)\"", output, re.M).group(1) or '' recs = re.search("^LAYERRECOMMENDS = \"(.*)\"", output, re.M).group(1) or ''
deps_dict = utils.explode_dep_versions2(bitbakepath, deps + ' ' + recs) deps_dict = utils.explode_dep_versions2(bitbakepath, deps)
if len(deps_dict) == 0: recs_dict = utils.explode_dep_versions2(bitbakepath, recs)
if not (deps_dict or recs_dict):
# No depends, add it firstly # No depends, add it firstly
layerquery_sorted.append(layer) layerquery_sorted.append(layer)
collections.add((col, ver)) collections.add((col, ver))
continue continue
deps_dict_all[layer] = {'requires': deps_dict, 'collection': col, 'version': ver} deps_dict_all[layer] = {'deps': deps_dict, \
'recs': recs_dict, \
'collection': col, \
'version': ver}
# Move deps_dict_all to layerquery_sorted orderly # Move deps_dict_all to layerquery_sorted orderly
if deps_dict_all:
logger.info("Sorting layers for branch %s" % branch) logger.info("Sorting layers for branch %s" % branch)
while True: while True:
deps_dict_all_copy = deps_dict_all.copy() deps_dict_all_copy = deps_dict_all.copy()
for layer, value in deps_dict_all_copy.items(): for layer, value in deps_dict_all_copy.items():
for req_col, req_ver_list in value['requires'].copy().items(): for deps_recs in ('deps', 'recs'):
for req_col, req_ver_list in value[deps_recs].copy().items():
matched = False matched = False
if req_ver_list: if req_ver_list:
req_ver = req_ver_list[0] req_ver = req_ver_list[0]
else: else:
req_ver = None req_ver = None
if utils.is_deps_satisfied(req_col, req_ver, collections): if utils.is_deps_satisfied(req_col, req_ver, collections):
del(value['requires'][req_col]) del(value[deps_recs][req_col])
if not value['requires']: if not (value['deps'] or value['recs']):
# All the depends are in collections: # All the depends are in collections:
del(deps_dict_all[layer]) del(deps_dict_all[layer])
layerquery_sorted.append(layer) layerquery_sorted.append(layer)
@ -429,15 +436,32 @@ def main():
if not len(deps_dict_all): if not len(deps_dict_all):
break break
# If nothing changed after a run then some dependencies couldn't be resolved finished = True
# If nothing changed after a run, drop recs and try again
if operator.eq(deps_dict_all_copy, deps_dict_all): if operator.eq(deps_dict_all_copy, deps_dict_all):
logger.warning("Cannot find required collections on branch %s:" % branch)
layer_names = []
for layer, value in deps_dict_all.items(): for layer, value in deps_dict_all.items():
logger.error('%s: %s' % (layer.name, value['requires'])) if value['recs'] and not value['deps']:
layer_names.append(layer.name) # Add it if recs isn't satisfied only.
logger.warn('Adding %s without LAYERRECOMMENDS...' % layer.name)
del(deps_dict_all[layer])
layerquery_sorted.append(layer)
collections.add((value['collection'], value['version']))
failed_msg = '%s: Added without LAYERRECOMMENDS' % layer.name
failed_layers[branch].append(failed_msg)
finished = False
break
if not finished:
continue
logger.warning("Cannot find required collections on branch %s:" % branch)
for layer, value in deps_dict_all.items():
logger.warn('%s: LAYERDEPENDS: %s LAYERRECOMMENDS: %s' % (layer.name, value['deps'], value['recs']))
if value['deps']:
failed_layers[branch].append('%s: Failed to add since LAYERDEPENDS is not satisfied' % layer.name)
else:
# Should never come here
logger.error("Unexpected errors when sorting layers")
sys.exit(1)
logger.warning("Known collections on branch %s: %s" % (branch, collections)) logger.warning("Known collections on branch %s: %s" % (branch, collections))
failed_layers[branch] = layer_names
break break
for layer in layerquery_sorted: for layer in layerquery_sorted:
@ -479,9 +503,10 @@ def main():
logger.info('Update interrupted, exiting') logger.info('Update interrupted, exiting')
sys.exit(254) sys.exit(254)
if failed_layers: if failed_layers:
print()
for branch, err_msg_list in failed_layers.items(): for branch, err_msg_list in failed_layers.items():
logger.error("Failed layers on branch %s: %s" % (branch, " ".join(err_msg_list))) if err_msg_list:
print()
logger.error("Issues found on branch %s:\n %s" % (branch, "\n ".join(err_msg_list)))
print() print()
finally: finally:
utils.unlock_file(lockfile) utils.unlock_file(lockfile)