1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-31 00:39:46 +00:00

bitbake: lib/bb/utils: improve edit_bblayers_conf() handling of bblayers.conf formatting

Make the following improvements to edit_bblayers_conf():

* Support ~ in BBLAYERS entries
* Handle where BBLAYERS items are added over multiple lines with +=
  instead of one single long item

Also add some comments documenting the function arguments and return
values as well as a set of bitbake-selftest tests.

(This function is used by the bitbake-layers add, remove and
layerindex-fetch subcommands, as well as devtool when adding the
workspace layer).

(Bitbake rev: e9a0858023c7671e30cc8ebb08496304b7f26b31)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Paul Eggleton
2015-11-20 17:11:16 +13:00
committed by Richard Purdie
parent 0debb11883
commit 4de214f752
2 changed files with 267 additions and 14 deletions
+64 -14
View File
@@ -1201,7 +1201,19 @@ def edit_metadata_file(meta_file, variables, varfunc):
def edit_bblayers_conf(bblayers_conf, add, remove):
"""Edit bblayers.conf, adding and/or removing layers"""
"""Edit bblayers.conf, adding and/or removing layers
Parameters:
bblayers_conf: path to bblayers.conf file to edit
add: layer path (or list of layer paths) to add; None or empty
list to add nothing
remove: layer path (or list of layer paths) to remove; None or
empty list to remove nothing
Returns a tuple:
notadded: list of layers specified to be added but weren't
(because they were already in the list)
notremoved: list of layers that were specified to be removed
but weren't (because they weren't in the list)
"""
import fnmatch
@@ -1210,6 +1222,13 @@ def edit_bblayers_conf(bblayers_conf, add, remove):
pth = pth[:-1]
return pth
approved = bb.utils.approved_variables()
def canonicalise_path(pth):
pth = remove_trailing_sep(pth)
if 'HOME' in approved and '~' in pth:
pth = os.path.expanduser(pth)
return pth
def layerlist_param(value):
if not value:
return []
@@ -1218,49 +1237,80 @@ def edit_bblayers_conf(bblayers_conf, add, remove):
else:
return [remove_trailing_sep(value)]
notadded = []
notremoved = []
addlayers = layerlist_param(add)
removelayers = layerlist_param(remove)
# Need to use a list here because we can't set non-local variables from a callback in python 2.x
bblayercalls = []
removed = []
plusequals = False
orig_bblayers = []
def handle_bblayers_firstpass(varname, origvalue, op, newlines):
bblayercalls.append(op)
if op == '=':
del orig_bblayers[:]
orig_bblayers.extend([canonicalise_path(x) for x in origvalue.split()])
return (origvalue, None, 2, False)
def handle_bblayers(varname, origvalue, op, newlines):
bblayercalls.append(varname)
updated = False
bblayers = [remove_trailing_sep(x) for x in origvalue.split()]
if removelayers:
for removelayer in removelayers:
matched = False
for layer in bblayers:
if fnmatch.fnmatch(layer, removelayer):
if fnmatch.fnmatch(canonicalise_path(layer), canonicalise_path(removelayer)):
updated = True
matched = True
bblayers.remove(layer)
removed.append(removelayer)
break
if not matched:
notremoved.append(removelayer)
if addlayers:
if addlayers and not plusequals:
for addlayer in addlayers:
if addlayer not in bblayers:
updated = True
bblayers.append(addlayer)
else:
notadded.append(addlayer)
del addlayers[:]
if updated:
if op == '+=' and not bblayers:
bblayers = None
return (bblayers, None, 2, False)
else:
return (origvalue, None, 2, False)
edit_metadata_file(bblayers_conf, ['BBLAYERS'], handle_bblayers)
with open(bblayers_conf, 'r') as f:
(_, newlines) = edit_metadata(f, ['BBLAYERS'], handle_bblayers_firstpass)
if not bblayercalls:
raise Exception('Unable to find BBLAYERS in %s' % bblayers_conf)
# Try to do the "smart" thing depending on how the user has laid out
# their bblayers.conf file
if bblayercalls.count('+=') > 1:
plusequals = True
removelayers_canon = [canonicalise_path(layer) for layer in removelayers]
notadded = []
for layer in addlayers:
layer_canon = canonicalise_path(layer)
if layer_canon in orig_bblayers and not layer_canon in removelayers_canon:
notadded.append(layer)
notadded_canon = [canonicalise_path(layer) for layer in notadded]
addlayers[:] = [layer for layer in addlayers if canonicalise_path(layer) not in notadded_canon]
(updated, newlines) = edit_metadata(newlines, ['BBLAYERS'], handle_bblayers)
if addlayers:
# Still need to add these
for addlayer in addlayers:
newlines.append('BBLAYERS += "%s"\n' % addlayer)
updated = True
if updated:
with open(bblayers_conf, 'w') as f:
f.writelines(newlines)
notremoved = list(set(removelayers) - set(removed))
return (notadded, notremoved)