[V2,1/1] devtool: error out when using base name provided by multiple layers

Submitted by Qi.Chen@windriver.com on June 28, 2019, 6:25 a.m. | Patch ID: 162612

Details

Message ID 5ead749ee0cc6dc3f78dd7ca3b77c83bf88bfa51.1561702962.git.Qi.Chen@windriver.com
State New
Headers show

Commit Message

Qi.Chen@windriver.com June 28, 2019, 6:25 a.m.
Currently `devtool finish RECIPE meta' will silently succeed even
if there are multiple layers having the same base name of 'meta'.
e.g. meta layer from oe-core and meta layer from meta-secure-core.

We should error out and give users useful information in such case.
With the patch, we will get error like below.

ERROR: Multiple layers have the same base name 'meta'. Consider using path instead of base name to specify layer:
        PROJ_DIR/oe-core/meta
        PROJ_DIR/meta-secure-core/meta

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
 scripts/lib/devtool/standard.py | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index aca74b1..1841791 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -1866,13 +1866,27 @@  def reset(args, config, basepath, workspace):
 def _get_layer(layername, d):
     """Determine the base layer path for the specified layer name/path"""
     layerdirs = d.getVar('BBLAYERS').split()
-    layers = {os.path.basename(p): p for p in layerdirs}
+    layers = {}    # {basename: layer_paths}
+    for p in layerdirs:
+        bn = os.path.basename(p)
+        if bn not in layers:
+            layers[bn] = [p]
+        else:
+            layers[bn].append(p)
     # Provide some shortcuts
     if layername.lower() in ['oe-core', 'openembedded-core']:
-        layerdir = layers.get('meta', None)
+        layername = 'meta'
+    layer_paths = layers.get(layername, None)
+    if not layer_paths:
+        return os.path.abspath(layername)
+    elif len(layer_paths) == 1:
+        return os.path.abspath(layer_paths[0])
     else:
-        layerdir = layers.get(layername, None)
-    return os.path.abspath(layerdir or layername)
+        # multiple layers having the same base name
+        msg = "Multiple layers have the same base name '%s'. " % layername
+        msg += "Consider using path instead of base name to specify layer:\n\t%s" % '\n\t'.join(layer_paths)
+        raise DevtoolError(msg)
+
 
 def finish(args, config, basepath, workspace):
     """Entry point for the devtool 'finish' subcommand"""