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 13:44:49 +0100 |
commit | 0683d9a2b15e3234a94437aaebac84bfcca1420b (patch) | |
tree | 120455d896d79e479f5ec5eaa487b55738e63f4d | |
parent | 8480e275e87275921d0dd54f2a7a445b1cd40203 (diff) | |
download | bitbake-0683d9a2b15e3234a94437aaebac84bfcca1420b.zip |
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.
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>
-rw-r--r-- | lib/bb/ui/buildinfohelper.py | 54 | ||||
-rw-r--r-- | lib/toaster/orm/models.py | 2 |
2 files changed, 42 insertions, 14 deletions
diff --git a/lib/bb/ui/buildinfohelper.py b/lib/bb/ui/buildinfohelper.py index d0efaa97..e036ef6d 100644 --- a/lib/bb/ui/buildinfohelper.py +++ b/lib/bb/ui/buildinfohelper.py @@ -66,6 +66,7 @@ class ORMWrapper(object): def __init__(self): self.layer_version_objects = [] + self.layer_version_built = [] self.task_objects = {} self.recipe_objects = {} @@ -254,32 +255,59 @@ class ORMWrapper(object): assert not recipe_information['file_path'].startswith("/") # we should have layer-relative paths at all times - recipe_object, created = self._cached_get_or_create(Recipe, layer_version=recipe_information['layer_version'], + + def update_recipe_obj(recipe_object): + object_changed = False + for v in vars(recipe_object): + if v in recipe_information.keys(): + object_changed = True + vars(recipe_object)[v] = recipe_information[v] + + if object_changed: + recipe_object.save() + + recipe, created = self._cached_get_or_create(Recipe, layer_version=recipe_information['layer_version'], file_path=recipe_information['file_path'], pathflags = recipe_information['pathflags']) - if created and must_exist: - raise NotExisting("Recipe object created when expected to exist", recipe_information) - object_changed = False - for v in vars(recipe_object): - if v in recipe_information.keys(): - object_changed = True - vars(recipe_object)[v] = recipe_information[v] + update_recipe_obj(recipe) - if object_changed: - recipe_object.save() + # Create a copy of the recipe for historical puposes and update it + for built_layer in self.layer_version_built: + if built_layer.layer == recipe_information['layer_version'].layer: + built_recipe, c = self._cached_get_or_create(Recipe, + layer_version=built_layer, + file_path=recipe_information['file_path'], + pathflags = recipe_information['pathflags']) + update_recipe_obj(built_recipe) + break - return recipe_object + + + if created and must_exist: + raise NotExisting("Recipe object created when expected to exist", recipe_information) + + return recipe def get_update_layer_version_object(self, build_obj, layer_obj, layer_version_information): if isinstance(layer_obj, Layer_Version): # We already found our layer version for this build so just # update it with the new build information logger.debug("We found our layer from toaster") - layer_obj.build = build_obj layer_obj.local_path = layer_version_information['local_path'] - layer_obj.commit = layer_version_information['commit'] layer_obj.save() self.layer_version_objects.append(layer_obj) + + # create a new copy of this layer version as a snapshot for + # historical purposes + layer_copy, c = Layer_Version.objects.get_or_create(build=build_obj, + layer=layer_obj.layer, + commit=layer_version_information['commit'], + local_path = layer_version_information['local_path'], + ) + logger.warning("created new historical layer version %d", layer_copy.pk) + + self.layer_version_built.append(layer_copy) + return layer_obj assert isinstance(build_obj, Build) diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py index e0b31a92..9a052bf7 100644 --- a/lib/toaster/orm/models.py +++ b/lib/toaster/orm/models.py @@ -194,7 +194,7 @@ class Project(models.Model): if release == None: release = self.release # layers on the same branch or layers specifically set for this project - queryset = Layer_Version.objects.filter((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = self) | Q(build__project = self)) + queryset = Layer_Version.objects.filter(((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = self)) & Q(build__isnull=True)) if layer_name is not None: # we select only a layer name |