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.

(From OE-Core rev: cdcfedec5489a5d8d0df56bbe100e5fc2cca03af)

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Markus Lehtonen 2015-05-25 15:12:43 +03:00 committed by Richard Purdie
parent 18efa996c6
commit 60278094cc
1 changed files with 122 additions and 114 deletions

View File

@ -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