aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bb/utils.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2015-11-20 17:11:16 +1300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-12-07 17:00:16 +0000
commite9a0858023c7671e30cc8ebb08496304b7f26b31 (patch)
tree29ce570d27c0e19babe608e0cb1ad73109d670f9 /lib/bb/utils.py
parent8bce6fefdc5c046b916588962a2b429c0f648133 (diff)
downloadbitbake-e9a0858023c7671e30cc8ebb08496304b7f26b31.tar.gz
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). Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/bb/utils.py')
-rw-r--r--lib/bb/utils.py78
1 files changed, 64 insertions, 14 deletions
diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index 9b2895223..31ec2b7c9 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -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)