@@ -105,6 +105,12 @@ def parse_cmdline():
help="do not compile, just change the checksums, remove PR, and commit")
parser.add_argument("-c", "--config-file", default=None,
help="Path to the configuration file. Default is $BUILDDIR/upgrade-helper/upgrade-helper.conf")
+ parser.add_argument("-l", "--layer-names", nargs='*', action="store", default='',
+ help="layers to include in the upgrade research")
+ parser.add_argument("-L", "--layer-dir", action="store", default='',
+ help="the layers root directory")
+ parser.add_argument("-m", "--layer-machines", nargs='*', action="store", default='',
+ help="machine to build for the layers")
return parser.parse_args()
def parse_config_file(config_file):
@@ -440,8 +446,8 @@ class Updater(object):
pkgs_ctx = {}
I(" ########### The list of recipes to be upgraded #############")
- for p, ov, nv, m, r in pkgs_to_upgrade:
- I(" %s, %s, %s, %s, %s" % (p, ov, nv, m, r))
+ for l, p, ov, nv, m, r in pkgs_to_upgrade:
+ I(" %s, %s, %s, %s, %s, %s" % (l, p, ov, nv, m, r))
pkgs_ctx[p] = {}
pkgs_ctx[p]['PN'] = p
@@ -471,7 +477,7 @@ class Updater(object):
succeeded_pkgs_ctx = []
failed_pkgs_ctx = []
attempted_pkgs = 0
- for pn, _, _, _, _ in pkgs_to_upgrade:
+ for l, pn, _, _, _, _ in pkgs_to_upgrade:
pkg_ctx = pkgs_ctx[pn]
pkg_ctx['error'] = None
@@ -577,21 +583,24 @@ class UniverseUpdater(Updater):
if len(args.recipe) == 1 and args.recipe[0] == "all":
self.recipes = []
else:
- self.recipes = args.recipe
+ self.recipes = ('', args.recipe)
# to filter recipes in upgrade
if not self.recipes and self.opts['layer_mode'] == 'yes':
# when layer mode is enabled and no recipes are specified
# we need to figure out what recipes are provided by the
# layer to try upgrade
- self.recipes = self._get_recipes_by_layer()
+ for layer in self.opts['layer_name'].split(' '):
+ recipes_for_layer = self._get_recipes_by_layer(layer)
+ I("layer %s => Receipes %s", layer, recipes_for_layer)
+ self.recipes.append((layer, recipes_for_layer))
if args.to_version:
if len(self.recipes) != 1:
E(" -t is only supported when upgrade one recipe\n")
exit(1)
- def _get_recipes_by_layer(self):
+ def _get_recipes_by_layer(self, layer=''):
recipes = []
recipe_regex = re.compile('^(?P<name>.*):$')
@@ -611,7 +620,7 @@ class UniverseUpdater(Updater):
if not 'skipped' in line:
s = layer_regex.search(line)
if s:
- if s.group('name').strip() == self.opts['layer_name']:
+ if s.group('name').strip() == layer:
recipes.append(name)
return recipes
@@ -662,31 +671,31 @@ class UniverseUpdater(Updater):
return True
def _get_packages_to_upgrade(self, packages=None):
+ pkgs_list = []
+ for layer_name, layer_recipes in self.recipes:
+ pkgs = oe.recipeutils.get_recipe_upgrade_status(layer_recipes)
- pkgs = oe.recipeutils.get_recipe_upgrade_status(self.recipes)
+ for pkg in pkgs:
+ pn, status, cur_ver, next_ver, maintainer, revision, no_upgrade_reason = pkg
- pkgs_list = []
- for pkg in pkgs:
- pn, status, cur_ver, next_ver, maintainer, revision, no_upgrade_reason = pkg
-
- if self.args.to_version:
- next_ver = self.args.to_version
-
- if status == 'UPDATE' and not no_upgrade_reason:
- # Always do the upgrade if recipes are specified
- if self.recipes and pn in self.recipes:
- pkgs_list.append((pn, cur_ver, next_ver, maintainer, revision))
- elif self._pkg_upgradable(pn, next_ver, maintainer):
- pkgs_list.append((pn, cur_ver, next_ver, maintainer, revision))
- else:
- if no_upgrade_reason:
- I(" Skip package %s (status = %s, current version = %s," \
- " next version = %s, no upgrade reason = %s)" %
- (pn, status, cur_ver, next_ver, no_upgrade_reason))
+ if self.args.to_version:
+ next_ver = self.args.to_version
+
+ if status == 'UPDATE' and not no_upgrade_reason:
+ # Always do the upgrade if recipes are specified
+ if layer_recipes and pn in layer_recipes:
+ pkgs_list.append((layer_name, pn, cur_ver, next_ver, maintainer, revision))
+ elif self._pkg_upgradable(pn, next_ver, maintainer):
+ pkgs_list.append((layer_name, pn, cur_ver, next_ver, maintainer, revision))
else:
- I(" Skip package %s (status = %s, current version = %s," \
- " next version = %s)" %
- (pn, status, cur_ver, next_ver))
+ if no_upgrade_reason:
+ I(" Skip package %s/%s (status = %s, current version = %s," \
+ " next version = %s, no upgrade reason = %s)" %
+ (layer_name, pn, status, cur_ver, next_ver, no_upgrade_reason))
+ else:
+ I(" Skip package %s/%s (status = %s, current version = %s," \
+ " next version = %s)" %
+ (layer_name, pn, status, cur_ver, next_ver))
return pkgs_list
@@ -731,6 +740,14 @@ if __name__ == "__main__":
log.basicConfig(format='%(levelname)s:%(message)s',
level=debug_levels[args.debug_level - 1])
settings, maintainer_override = parse_config_file(args.config_file)
+ if args.layer_names != '' and args.layer_dir == '':
+ E("layer-dir is mandatory if layers are defined")
+ exit(1)
+ elif args.layer_names != '':
+ settings['layer_mode'] = 'yes'
+ settings['layer_dir'] = args.layer_dir
+ settings['layer_name'] = ' '.join(args.layer_names)
+ settings['layer_machines'] = ' '.join(args.layer_machines)
updater = UniverseUpdater(args)
updater.run()
new file mode 100755
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+# Cronjob which can be run weekly to run the upgrade helper script.
+# Add the job in /etc/crontab like below.
+#
+# It will execute weekly at the same hour (8 AM).
+#
+# 00 8 * * 6 auh /home/auh/bin/weeklyjob-oe.sh
+
+# Re-assign these to match your setup!
+auh_dir=~/auto-upgrade-helper
+poky_dir=~/poky
+openembedded_dir=~/meta-openembedded
+build_dir=~/build-tmp-auh-upgrades
+sstate_dir=~/sstate-cache
+
+meta_list="${openembedded_dir}/meta-*"
+machine_list="qemux86 qemux86-64 qemuarm qemumips qemuppc qemux86_musl"
+
+pushd $poky_dir
+# Base the upgrades on meta_openembedded master
+git fetch origin
+git checkout -B tmp-auh-upgrades origin/master
+popd
+
+pushd $openembedded_dir || exit 1
+# Base the upgrades on meta_openembedded master
+git fetch origin
+git checkout -B tmp-auh-upgrades origin/master
+
+# enter the build environment
+source $poky_dir/oe-init-build-env $build_dir
+
+# upgrade helper need to use ?= for MACHINE
+sed -i.bak -E 's|^(MACHINE[[:space:]]*)[?+=]+([[:space:]]*.*)$|\1?=\2|' $build_dir/conf/local.conf
+
+mkdir -p $build_dir/upgrade-helper/
+
+# Add all the meta to the current build
+bitbake-layers add-layer ${meta_list}
+
+# build the layer_names variable to be used in the command line
+layer_names=""
+for m in $meta_list; do
+ layer_names+=" $(basename ${m})"
+done
+
+python3 $auh_dir/upgrade-helper.py -e --layer-dir ${openembedded_dir} --layer-names ${layer_names} --layer-machines ${machine_list} -- all
+
+# clean up to avoid the disk filling up
+rm -rf $build_dir/tmp/
+rm -rf $build_dir/workspace/sources/*
+find $sstate_dir -atime +10 -delete
+
+popd || exit 1