summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Wood <michael.g.wood@intel.com>2015-09-28 21:45:30 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-09-29 13:44:49 +0100
commit0683d9a2b15e3234a94437aaebac84bfcca1420b (patch)
tree120455d896d79e479f5ec5eaa487b55738e63f4d
parent8480e275e87275921d0dd54f2a7a445b1cd40203 (diff)
downloadbitbake-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.py54
-rw-r--r--lib/toaster/orm/models.py2
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