summaryrefslogtreecommitdiff
path: root/scripts/lib/devtool
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2015-05-25 15:12:43 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-06-18 09:12:00 +0100
commitcdcfedec5489a5d8d0df56bbe100e5fc2cca03af (patch)
tree558fe8685589dc7b20dd4d17c6aae2ce1d02aa47 /scripts/lib/devtool
parent5da26bfd8b34af9075b9b900d353df555d8f2ef0 (diff)
downloadopenembedded-core-cdcfedec5489a5d8d0df56bbe100e5fc2cca03af.tar.gz
openembedded-core-cdcfedec5489a5d8d0df56bbe100e5fc2cca03af.tar.bz2
openembedded-core-cdcfedec5489a5d8d0df56bbe100e5fc2cca03af.zip
devtool: split out 'patch' update mode into a separate function
Continue refactoring of update_recipe() by splitting out the 'patch' mode into a separate function. Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Diffstat (limited to 'scripts/lib/devtool')
-rw-r--r--scripts/lib/devtool/standard.py236
1 files changed, 122 insertions, 114 deletions
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index af73009ca2..fb3cc78de0 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -645,6 +645,119 @@ def _update_recipe_srcrev(args, srctree, rd, config_data):
_remove_patch_files(args, removepatches, destpath)
+def _update_recipe_patch(args, config, srctree, rd, config_data):
+ """Implement the 'patch' mode of update-recipe"""
+ import bb
+ import oe.recipeutils
+ from oe.patch import GitApplyTree
+
+ recipefile = rd.getVar('FILE', True)
+ append = os.path.join(config.workspace_path, 'appends', '%s.bbappend' %
+ os.path.splitext(os.path.basename(recipefile))[0])
+ if not os.path.exists(append):
+ raise DevtoolError('unable to find workspace bbappend for recipe %s' %
+ args.recipename)
+
+ initial_rev, update_rev = _get_patchset_revs(args, srctree, append)
+ if not initial_rev:
+ raise DevtoolError('Unable to find initial revision - please specify '
+ 'it with --initial-rev')
+
+ # Find list of existing patches in recipe file
+ existing_patches = oe.recipeutils.get_recipe_patches(rd)
+
+ removepatches = []
+ seqpatch_re = re.compile('^([0-9]{4}-)?(.+)')
+ if not args.no_remove:
+ # Get all patches from source tree and check if any should be removed
+ tempdir = tempfile.mkdtemp(prefix='devtool')
+ try:
+ GitApplyTree.extractPatches(srctree, initial_rev, tempdir)
+ # Strip numbering from patch names. If it's a git sequence named
+ # patch, the numbers might not match up since we are starting from
+ # a different revision This does assume that people are using
+ # unique shortlog values, but they ought to be anyway...
+ newpatches = [seqpatch_re.match(fname).group(2) for fname in
+ os.listdir(tempdir)]
+ for patch in existing_patches:
+ basename = seqpatch_re.match(
+ os.path.basename(patch)).group(2)
+ if basename not in newpatches:
+ removepatches.append(patch)
+ finally:
+ shutil.rmtree(tempdir)
+
+ # Get updated patches from source tree
+ tempdir = tempfile.mkdtemp(prefix='devtool')
+ try:
+ GitApplyTree.extractPatches(srctree, update_rev, tempdir)
+
+ # Match up and replace existing patches with corresponding new patches
+ updatepatches = False
+ updaterecipe = False
+ destpath = None
+ newpatches = os.listdir(tempdir)
+ if args.append:
+ patchfiles = {}
+ for patch in existing_patches:
+ patchfile = os.path.basename(patch)
+ if patchfile in newpatches:
+ patchfiles[os.path.join(tempdir, patchfile)] = patchfile
+ newpatches.remove(patchfile)
+ for patchfile in newpatches:
+ patchfiles[os.path.join(tempdir, patchfile)] = None
+
+ if patchfiles or removepatches:
+ removevalues = None
+ if removepatches:
+ srcuri = (rd.getVar('SRC_URI', False) or '').split()
+ removedentries, remaining = _remove_patch_entries(
+ srcuri, removepatches)
+ if removedentries or remaining:
+ remaining = ['file://' + os.path.basename(item) for
+ item in remaining]
+ removevalues = {'SRC_URI': removedentries + remaining}
+ _, destpath = oe.recipeutils.bbappend_recipe(
+ rd, args.append, patchfiles,
+ removevalues=removevalues)
+ else:
+ logger.info('No patches needed updating')
+ else:
+ for patch in existing_patches:
+ patchfile = os.path.basename(patch)
+ if patchfile in newpatches:
+ logger.info('Updating patch %s' % patchfile)
+ shutil.move(os.path.join(tempdir, patchfile), patch)
+ newpatches.remove(patchfile)
+ updatepatches = True
+ srcuri = (rd.getVar('SRC_URI', False) or '').split()
+ if newpatches:
+ # Add any patches left over
+ patchdir = os.path.join(os.path.dirname(recipefile),
+ rd.getVar('BPN', True))
+ bb.utils.mkdirhier(patchdir)
+ for patchfile in newpatches:
+ logger.info('Adding new patch %s' % patchfile)
+ shutil.move(os.path.join(tempdir, patchfile),
+ os.path.join(patchdir, patchfile))
+ srcuri.append('file://%s' % patchfile)
+ updaterecipe = True
+ if removepatches:
+ removedentries, _ = _remove_patch_entries(srcuri, removepatches)
+ if removedentries:
+ updaterecipe = True
+ if updaterecipe:
+ logger.info('Updating recipe %s' % os.path.basename(recipefile))
+ oe.recipeutils.patch_recipe(config_data, recipefile,
+ {'SRC_URI': ' '.join(srcuri)})
+ elif not updatepatches:
+ # Neither patches nor recipe were updated
+ logger.info('No patches need updating')
+ finally:
+ shutil.rmtree(tempdir)
+
+ _remove_patch_files(args, removepatches, destpath)
+
def update_recipe(args, config, basepath, workspace):
"""Entry point for the devtool 'update-recipe' subcommand"""
if not args.recipename in workspace:
@@ -660,20 +773,10 @@ def update_recipe(args, config, basepath, workspace):
return 2
tinfoil = setup_tinfoil()
- import bb
- from oe.patch import GitApplyTree
- import oe.recipeutils
rd = _parse_recipe(config, tinfoil, args.recipename, True)
if not rd:
return -1
- recipefile = rd.getVar('FILE', True)
-
- # Get initial revision from bbappend
- append = os.path.join(config.workspace_path, 'appends', '%s.bbappend' % os.path.splitext(os.path.basename(recipefile))[0])
- if not os.path.exists(append):
- logger.error('unable to find workspace bbappend for recipe %s' % args.recipename)
- return -1
orig_src_uri = rd.getVar('SRC_URI', False) or ''
if args.mode == 'auto':
@@ -686,111 +789,16 @@ def update_recipe(args, config, basepath, workspace):
srctree = workspace[args.recipename]
- removepatches = []
- destpath = None
- if mode == 'srcrev':
- try:
+ try:
+ if mode == 'srcrev':
_update_recipe_srcrev(args, srctree, rd, tinfoil.config_data)
- except DevtoolError as err:
- logger.error(err)
- return 1
- elif mode == 'patch':
- initial_rev, update_rev = _get_patchset_revs(args, srctree, append)
- if not initial_rev:
- logger.error('Unable to find initial revision - please specify it with --initial-rev')
- return -1
-
- # Find list of existing patches in recipe file
- existing_patches = oe.recipeutils.get_recipe_patches(rd)
-
- removepatches = []
- seqpatch_re = re.compile('^([0-9]{4}-)?(.+)')
- if not args.no_remove:
- # Get all patches from source tree and check if any should be removed
- tempdir = tempfile.mkdtemp(prefix='devtool')
- try:
- GitApplyTree.extractPatches(srctree, initial_rev, tempdir)
- # Strip numbering from patch names. If it's a git sequence
- # named patch, the numbers might not match up since we are
- # starting from a different revision This does assume that
- # people are using unique shortlog values, but they ought to be
- # anyway...
- newpatches = [seqpatch_re.match(fname).group(2) for fname in
- os.listdir(tempdir)]
- for patch in existing_patches:
- basename = seqpatch_re.match(
- os.path.basename(patch)).group(2)
- if basename not in newpatches:
- removepatches.append(patch)
- finally:
- shutil.rmtree(tempdir)
-
- # Get updated patches from source tree
- tempdir = tempfile.mkdtemp(prefix='devtool')
- try:
- GitApplyTree.extractPatches(srctree, update_rev, tempdir)
-
- # Match up and replace existing patches with corresponding new patches
- updatepatches = False
- updaterecipe = False
- newpatches = os.listdir(tempdir)
- if args.append:
- patchfiles = {}
- for patch in existing_patches:
- patchfile = os.path.basename(patch)
- if patchfile in newpatches:
- patchfiles[os.path.join(tempdir, patchfile)] = patchfile
- newpatches.remove(patchfile)
- for patchfile in newpatches:
- patchfiles[os.path.join(tempdir, patchfile)] = None
-
- if patchfiles or removepatches:
- removevalues = None
- if removepatches:
- srcuri = (rd.getVar('SRC_URI', False) or '').split()
- removedentries, remaining = _remove_patch_entries(srcuri, removepatches)
- if removedentries or remaining:
- removevalues = {'SRC_URI': removedentries + ['file://' + os.path.basename(item) for item in remaining]}
- (appendfile, destpath) = oe.recipeutils.bbappend_recipe(rd, args.append, patchfiles, removevalues=removevalues)
- else:
- logger.info('No patches needed updating')
- else:
- for patch in existing_patches:
- patchfile = os.path.basename(patch)
- if patchfile in newpatches:
- logger.info('Updating patch %s' % patchfile)
- shutil.move(os.path.join(tempdir, patchfile), patch)
- newpatches.remove(patchfile)
- updatepatches = True
- srcuri = (rd.getVar('SRC_URI', False) or '').split()
- if newpatches:
- # Add any patches left over
- patchdir = os.path.join(os.path.dirname(recipefile), rd.getVar('BPN', True))
- bb.utils.mkdirhier(patchdir)
- for patchfile in newpatches:
- logger.info('Adding new patch %s' % patchfile)
- shutil.move(os.path.join(tempdir, patchfile), os.path.join(patchdir, patchfile))
- srcuri.append('file://%s' % patchfile)
- updaterecipe = True
- if removepatches:
- removedentries, _ = remove_patch_entries(srcuri, removepatches)
- if removedentries:
- updaterecipe = True
- if updaterecipe:
- logger.info('Updating recipe %s' % os.path.basename(recipefile))
- oe.recipeutils.patch_recipe(tinfoil.config_data,
- recipefile, {'SRC_URI': ' '.join(srcuri)})
- elif not updatepatches:
- # Neither patches nor recipe were updated
- logger.info('No patches need updating')
-
- finally:
- shutil.rmtree(tempdir)
-
- _remove_patch_files(args, removepatches, destpath)
-
- else:
- logger.error('update_recipe: invalid mode %s' % mode)
+ elif mode == 'patch':
+ _update_recipe_patch(args, config, srctree, rd,
+ tinfoil.config_data)
+ else:
+ raise DevtoolError('update_recipe: invalid mode %s' % mode)
+ except DevtoolError as err:
+ logger.error(err)
return 1
return 0