diff options
author | Michael Wood <michael.g.wood@intel.com> | 2015-09-28 21:45:30 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-09-29 14:11:38 +0100 |
commit | e6d967dba254a9d2a53d8b5b9469ac6b672fb1b9 (patch) | |
tree | 1d609eea94fe72004a94cd39d2e3d6fafec4f159 /bitbake/lib/bb/ui | |
parent | 17fe16bbf4e375f941c44bcef2a205cf2ee6118f (diff) | |
download | poky-e6d967dba254a9d2a53d8b5b9469ac6b672fb1b9.tar.gz |
bitbake: toaster: buildinfohelper Create a copy of the built layer and recipe
Create a copy of the built layer and the recipes associated with it.
This is so that the user can view the historical information about a
build. i.e. a snapshot of the layer version and artifacts produced at
that build.
(Bitbake rev: 0683d9a2b15e3234a94437aaebac84bfcca1420b)
Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: brian avery <avery.brian@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/ui')
-rw-r--r-- | bitbake/lib/bb/ui/buildinfohelper.py | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index d0efaa9778..e036ef6dbc 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
@@ -66,6 +66,7 @@ class ORMWrapper(object): | |||
66 | 66 | ||
67 | def __init__(self): | 67 | def __init__(self): |
68 | self.layer_version_objects = [] | 68 | self.layer_version_objects = [] |
69 | self.layer_version_built = [] | ||
69 | self.task_objects = {} | 70 | self.task_objects = {} |
70 | self.recipe_objects = {} | 71 | self.recipe_objects = {} |
71 | 72 | ||
@@ -254,32 +255,59 @@ class ORMWrapper(object): | |||
254 | 255 | ||
255 | assert not recipe_information['file_path'].startswith("/") # we should have layer-relative paths at all times | 256 | assert not recipe_information['file_path'].startswith("/") # we should have layer-relative paths at all times |
256 | 257 | ||
257 | recipe_object, created = self._cached_get_or_create(Recipe, layer_version=recipe_information['layer_version'], | 258 | |
259 | def update_recipe_obj(recipe_object): | ||
260 | object_changed = False | ||
261 | for v in vars(recipe_object): | ||
262 | if v in recipe_information.keys(): | ||
263 | object_changed = True | ||
264 | vars(recipe_object)[v] = recipe_information[v] | ||
265 | |||
266 | if object_changed: | ||
267 | recipe_object.save() | ||
268 | |||
269 | recipe, created = self._cached_get_or_create(Recipe, layer_version=recipe_information['layer_version'], | ||
258 | file_path=recipe_information['file_path'], pathflags = recipe_information['pathflags']) | 270 | file_path=recipe_information['file_path'], pathflags = recipe_information['pathflags']) |
259 | if created and must_exist: | ||
260 | raise NotExisting("Recipe object created when expected to exist", recipe_information) | ||
261 | 271 | ||
262 | object_changed = False | 272 | update_recipe_obj(recipe) |
263 | for v in vars(recipe_object): | ||
264 | if v in recipe_information.keys(): | ||
265 | object_changed = True | ||
266 | vars(recipe_object)[v] = recipe_information[v] | ||
267 | 273 | ||
268 | if object_changed: | 274 | # Create a copy of the recipe for historical puposes and update it |
269 | recipe_object.save() | 275 | for built_layer in self.layer_version_built: |
276 | if built_layer.layer == recipe_information['layer_version'].layer: | ||
277 | built_recipe, c = self._cached_get_or_create(Recipe, | ||
278 | layer_version=built_layer, | ||
279 | file_path=recipe_information['file_path'], | ||
280 | pathflags = recipe_information['pathflags']) | ||
281 | update_recipe_obj(built_recipe) | ||
282 | break | ||
270 | 283 | ||
271 | return recipe_object | 284 | |
285 | |||
286 | if created and must_exist: | ||
287 | raise NotExisting("Recipe object created when expected to exist", recipe_information) | ||
288 | |||
289 | return recipe | ||
272 | 290 | ||
273 | def get_update_layer_version_object(self, build_obj, layer_obj, layer_version_information): | 291 | def get_update_layer_version_object(self, build_obj, layer_obj, layer_version_information): |
274 | if isinstance(layer_obj, Layer_Version): | 292 | if isinstance(layer_obj, Layer_Version): |
275 | # We already found our layer version for this build so just | 293 | # We already found our layer version for this build so just |
276 | # update it with the new build information | 294 | # update it with the new build information |
277 | logger.debug("We found our layer from toaster") | 295 | logger.debug("We found our layer from toaster") |
278 | layer_obj.build = build_obj | ||
279 | layer_obj.local_path = layer_version_information['local_path'] | 296 | layer_obj.local_path = layer_version_information['local_path'] |
280 | layer_obj.commit = layer_version_information['commit'] | ||
281 | layer_obj.save() | 297 | layer_obj.save() |
282 | self.layer_version_objects.append(layer_obj) | 298 | self.layer_version_objects.append(layer_obj) |
299 | |||
300 | # create a new copy of this layer version as a snapshot for | ||
301 | # historical purposes | ||
302 | layer_copy, c = Layer_Version.objects.get_or_create(build=build_obj, | ||
303 | layer=layer_obj.layer, | ||
304 | commit=layer_version_information['commit'], | ||
305 | local_path = layer_version_information['local_path'], | ||
306 | ) | ||
307 | logger.warning("created new historical layer version %d", layer_copy.pk) | ||
308 | |||
309 | self.layer_version_built.append(layer_copy) | ||
310 | |||
283 | return layer_obj | 311 | return layer_obj |
284 | 312 | ||
285 | assert isinstance(build_obj, Build) | 313 | assert isinstance(build_obj, Build) |