From cb4b07838c267a09ebedba6c30ec25bda2cd11be Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Thu, 5 Mar 2015 10:51:20 +0000 Subject: devtool: modify/extract: prevent usage with incompatible recipes Consolidate code for checking compatible recipes and consider meta and packagegroup recipes as well as package-index and gcc-source to be incompatible. (From OE-Core rev: 4be9bf637583b341a89af1b9924752abc7d49c94) Signed-off-by: Paul Eggleton Signed-off-by: Ross Burton Signed-off-by: Richard Purdie --- meta/lib/oeqa/selftest/devtool.py | 24 ++++++++++++++++++++ scripts/lib/devtool/standard.py | 48 ++++++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/meta/lib/oeqa/selftest/devtool.py b/meta/lib/oeqa/selftest/devtool.py index a8c339a..2574e4b 100644 --- a/meta/lib/oeqa/selftest/devtool.py +++ b/meta/lib/oeqa/selftest/devtool.py @@ -227,6 +227,30 @@ class DevtoolTests(oeSelfTest): matches = glob.glob(stampprefix + '*') self.assertFalse(matches, 'Stamp files exist for recipe mdadm that should have been cleaned') + def test_devtool_modify_invalid(self): + # Check preconditions + workspacedir = os.path.join(self.builddir, 'workspace') + self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory') + # Try modifying some recipes + tempdir = tempfile.mkdtemp(prefix='devtoolqa') + self.track_for_cleanup(tempdir) + self.track_for_cleanup(workspacedir) + self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + + testrecipes = 'perf gcc-source kernel-devsrc package-index core-image-minimal meta-toolchain packagegroup-core-sdk meta-ide-support'.split() + for testrecipe in testrecipes: + # Check it's a valid recipe + bitbake('%s -e' % testrecipe) + # devtool extract should fail + result = runCmd('devtool extract %s %s' % (testrecipe, os.path.join(tempdir, testrecipe)), ignore_status=True) + self.assertNotEqual(result.status, 0, 'devtool extract on %s should have failed' % testrecipe) + self.assertNotIn('Fetching ', result.output, 'devtool extract on %s should have errored out before trying to fetch' % testrecipe) + self.assertIn('ERROR: ', result.output, 'devtool extract on %s should have given an ERROR' % testrecipe) + # devtool modify should fail + result = runCmd('devtool modify %s -x %s' % (testrecipe, os.path.join(tempdir, testrecipe)), ignore_status=True) + self.assertNotEqual(result.status, 0, 'devtool modify on %s should have failed' % testrecipe) + self.assertIn('ERROR: ', result.output, 'devtool modify on %s should have given an ERROR' % testrecipe) + def test_devtool_modify_git(self): # Check preconditions workspacedir = os.path.join(self.builddir, 'workspace') diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py index f9369ee..54920b2 100644 --- a/scripts/lib/devtool/standard.py +++ b/scripts/lib/devtool/standard.py @@ -87,6 +87,38 @@ def add(args, config, basepath, workspace): return 0 +def _check_compatible_recipe(pn, d): + if pn == 'perf': + logger.error("The perf recipe does not actually check out source and thus cannot be supported by this tool") + return False + + if pn in ['gcc-source', 'kernel-devsrc', 'package-index']: + logger.error("The %s recipe is not supported by this tool" % pn) + return False + + if bb.data.inherits_class('image', d): + logger.error("The %s recipe is an image, and therefore is not supported by this tool" % pn) + return False + + if bb.data.inherits_class('populate_sdk', d): + logger.error("The %s recipe is an SDK, and therefore is not supported by this tool" % pn) + return False + + if bb.data.inherits_class('packagegroup', d): + logger.error("The %s recipe is a packagegroup, and therefore is not supported by this tool" % pn) + return False + + if bb.data.inherits_class('meta', d): + logger.error("The %s recipe is a meta-recipe, and therefore is not supported by this tool" % pn) + return False + + if bb.data.inherits_class('externalsrc', d) and d.getVar('EXTERNALSRC', True): + logger.error("externalsrc is currently enabled for the %s recipe. This prevents the normal do_patch task from working. You will need to disable this first." % pn) + return False + + return True + + def _get_recipe_file(cooker, pn): import oe.recipeutils recipefile = oe.recipeutils.pn_to_recipe(cooker, pn) @@ -133,16 +165,7 @@ def _extract_source(srctree, keep_temp, devbranch, d): pn = d.getVar('PN', True) - if pn == 'perf': - logger.error("The perf recipe does not actually check out source and thus cannot be supported by this tool") - return None - - if bb.data.inherits_class('image', d): - logger.error("The %s recipe is an image, and therefore is not supported by this tool" % pn) - return None - - if bb.data.inherits_class('externalsrc', d) and d.getVar('EXTERNALSRC', True): - logger.error("externalsrc is currently enabled for the %s recipe. This prevents the normal do_patch task from working. You will need to disable this first." % pn) + if not _check_compatible_recipe(pn, d): return None if os.path.exists(srctree): @@ -310,9 +333,8 @@ def modify(args, config, basepath, workspace): return -1 rd = oe.recipeutils.parse_recipe(recipefile, tinfoil.config_data) - if bb.data.inherits_class('image', rd): - logger.error("The %s recipe is an image, and therefore is not supported by this tool" % args.recipename) - return None + if not _check_compatible_recipe(args.recipename, rd): + return -1 initial_rev = None commits = [] -- cgit v1.1