diff options
author | Ross Burton <ross@burtonini.com> | 2022-02-02 13:00:11 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-02-05 17:46:05 +0000 |
commit | 8463a37d70e104b7c23328baf0265f57bdcba12d (patch) | |
tree | 25ecddae7c91d314216a2e7aa4bf709138d88469 /scripts/lib/checklayer/__init__.py | |
parent | 2b3ae4d1abdd4b800098625e52ac6e501c2063f4 (diff) | |
download | poky-8463a37d70e104b7c23328baf0265f57bdcba12d.tar.gz |
yocto-check-layer: check for duplicate layers when finding layers
detect_layers() is very greedy and if it recurses into poky or bitbake
it will find the test suite layers, such as
bitbake/lib/layerindexlib/tests/testdata/layer4. This is a dummy layer
which claims to be openembedded-layer, so if the real openembedded-layer
is a dependency then layer4 may be used instead, which will cause
errors: initially because it's only compatible with Sumo, but later
because it doesn't contain any recipes.
Add a check that the set of layers we've found doesn't contain any
duplicate collection names with different patterns, and abort if that is
the case as the test will be non-deterministic.
(From OE-Core rev: 0df4bae4ec67d38442620fa08c839528b425e2a8)
Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/checklayer/__init__.py')
-rw-r--r-- | scripts/lib/checklayer/__init__.py | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/scripts/lib/checklayer/__init__.py b/scripts/lib/checklayer/__init__.py index e69a10f452..f91888ccbb 100644 --- a/scripts/lib/checklayer/__init__.py +++ b/scripts/lib/checklayer/__init__.py | |||
@@ -156,6 +156,27 @@ def _find_layer(depend, layers): | |||
156 | return layer | 156 | return layer |
157 | return None | 157 | return None |
158 | 158 | ||
159 | def sanity_check_layers(layers, logger): | ||
160 | """ | ||
161 | Check that we didn't find duplicate collection names, as the layer that will | ||
162 | be used is non-deterministic. The precise check is duplicate collections | ||
163 | with different patterns, as the same pattern being repeated won't cause | ||
164 | problems. | ||
165 | """ | ||
166 | import collections | ||
167 | |||
168 | passed = True | ||
169 | seen = collections.defaultdict(set) | ||
170 | for layer in layers: | ||
171 | for name, data in layer.get("collections", {}).items(): | ||
172 | seen[name].add(data["pattern"]) | ||
173 | |||
174 | for name, patterns in seen.items(): | ||
175 | if len(patterns) > 1: | ||
176 | passed = False | ||
177 | logger.error("Collection %s found multiple times: %s" % (name, ", ".join(patterns))) | ||
178 | return passed | ||
179 | |||
159 | def get_layer_dependencies(layer, layers, logger): | 180 | def get_layer_dependencies(layer, layers, logger): |
160 | def recurse_dependencies(depends, layer, layers, logger, ret = []): | 181 | def recurse_dependencies(depends, layer, layers, logger, ret = []): |
161 | logger.debug('Processing dependencies %s for layer %s.' % \ | 182 | logger.debug('Processing dependencies %s for layer %s.' % \ |