From 3d98aafc43bf6d14aac997137348fe503efed04e Mon Sep 17 00:00:00 2001 From: Alexander Kanavin Date: Wed, 17 Jul 2024 20:22:15 +0200 Subject: recipeutils/get_recipe_upgrade_status: group recipes when they need to be upgraded together This will allow 'lockstep upgrades' of such recipes, improving success rates in automated version updating process. devtool check-upgrade-status now prints: These recipes need to be upgraded together { glib-2.0 2.80.2 2.80.4 Anuj Mittal glib-2.0-initial 2.80.2 2.80.4 Anuj Mittal } These recipes need to be upgraded together { util-linux 2.39.3 2.40.2 Chen Qi util-linux-libuuid 2.39.3 2.40.2 Chen Qi } These recipes need to be upgraded together { cmake 3.29.3 3.30.0 Unassigned cmake-native 3.29.3 3.30.0 Unassigned } etc. (From OE-Core rev: 7874aea5c62be3e8dbd19e04fce5389c5ed7aab6) Signed-off-by: Alexander Kanavin Signed-off-by: Richard Purdie --- meta/lib/oe/recipeutils.py | 23 ++++++++++++++++++++++- meta/lib/oeqa/selftest/cases/distrodata.py | 6 +++--- 2 files changed, 25 insertions(+), 4 deletions(-) (limited to 'meta/lib') diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py index 7586332fe0..56be75dc9c 100644 --- a/meta/lib/oe/recipeutils.py +++ b/meta/lib/oe/recipeutils.py @@ -1154,6 +1154,7 @@ def get_recipe_upgrade_status(recipes=None): if not recipes: recipes = tinfoil.all_recipe_files(variants=False) + recipeincludes = {} for fn in recipes: try: if fn.startswith("/"): @@ -1178,11 +1179,13 @@ def get_recipe_upgrade_status(recipes=None): data_copy_list.append(data_copy) + recipeincludes[data.getVar('FILE')] = {'bbincluded':data.getVar('BBINCLUDED').split(),'pn':data.getVar('PN')} + from concurrent.futures import ProcessPoolExecutor with ProcessPoolExecutor(max_workers=utils.cpu_count()) as executor: pkgs_list = executor.map(_get_recipe_upgrade_status, data_copy_list) - return pkgs_list + return _group_recipes(pkgs_list, _get_common_include_recipes(recipeincludes)) def get_common_include_recipes(): with bb.tinfoil.Tinfoil() as tinfoil: @@ -1220,3 +1223,21 @@ def _get_common_include_recipes(recipeincludes_all): recipes_with_shared_includes.append(recipeset) return recipes_with_shared_includes + +def _group_recipes(recipes, groups): + recipedict = {} + for r in recipes: + recipedict[r['pn']] = r + + recipegroups = [] + for g in groups: + recipeset = [] + for r in g: + if r in recipedict.keys(): + recipeset.append(recipedict[r]) + del recipedict[r] + recipegroups.append(recipeset) + + for r in recipedict.values(): + recipegroups.append([r]) + return recipegroups diff --git a/meta/lib/oeqa/selftest/cases/distrodata.py b/meta/lib/oeqa/selftest/cases/distrodata.py index bc56160522..bd37552364 100644 --- a/meta/lib/oeqa/selftest/cases/distrodata.py +++ b/meta/lib/oeqa/selftest/cases/distrodata.py @@ -20,10 +20,10 @@ class Distrodata(OESelftestTestCase): feature = 'LICENSE_FLAGS_ACCEPTED += " commercial"\n' self.write_config(feature) - pkgs = oe.recipeutils.get_recipe_upgrade_status() + pkggroups = oe.recipeutils.get_recipe_upgrade_status() - regressed_failures = [pkg['pn'] for pkg in pkgs if pkg['status'] == 'UNKNOWN_BROKEN'] - regressed_successes = [pkg['pn'] for pkg in pkgs if pkg['status'] == 'KNOWN_BROKEN'] + regressed_failures = [pkg['pn'] for pkgs in pkggroups for pkg in pkgs if pkg['status'] == 'UNKNOWN_BROKEN'] + regressed_successes = [pkg['pn'] for pkgs in pkggroups for pkg in pkgs if pkg['status'] == 'KNOWN_BROKEN'] msg = "" if len(regressed_failures) > 0: msg = msg + """ -- cgit v1.2.3-54-g00ecf