toaster: custom image enable layer add, protect pre-cloned layers
cover toaster: custom image enable layer add, protect pre-cloned layers
From: David Reyna <[email protected]>
Fix for Bug 12887:
* When attempting create a custom image in Toaster for a layer not yet added not cloned, two errors were found.
1) The "Add layer" button did not do anything, due to a missing data structure, easily fixed
2) If the layer was newly added but not yet cloned, the custom image create just hung.
This was because the problems were reported internally but not to the user. This patch adds the error return chain plus the helpful error recovery message to the user.
The following changes since commit bdb49647874e18e7d60374b8973a307551b36a14:
go.bbclass: Add -buildmode=pie for non mips arch (2018-10-01 13:04:50 +0100)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib dreyna/toaster/custom_image_protection_12887
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=dreyna/toaster/custom_image_protection_12887
David Reyna (1):
toaster: custom image enable layer add, protect pre-cloned layers
lib/toaster/orm/models.py | 4 ++-- lib/toaster/toastergui/api.py | 8 +++++++- lib/toaster/toastergui/static/js/libtoaster.js | 3 ++- lib/toaster/toastergui/static/js/newcustomimage_modal.js | 7 +++++++ lib/toaster/toastergui/templates/customise_btn.html | 6 +++++- 5 files changed, 23 insertions(+), 5 deletions(-)
Signature · 1 line
1.9.1
PATCH 1/1 toaster: custom image enable layer add, protect pre-cloned layers
From: David Reyna <[email protected]>
When creating custom image recipes, the layer add for new layers needs missing xhrLayerUrl data. Also, code is needed to check and inform user if the newly added layer has not been cloned yet, and provide helpful error message instead of the current frozen dialog.
[YOCTO #12887]
--- lib/toaster/orm/models.py | 4 ++-- lib/toaster/toastergui/api.py | 8 +++++++- lib/toaster/toastergui/static/js/libtoaster.js | 3 ++- lib/toaster/toastergui/static/js/newcustomimage_modal.js | 7 +++++++ lib/toaster/toastergui/templates/customise_btn.html | 6 +++++- 5 files changed, 23 insertions(+), 5 deletions(-)
lib/toaster/orm/models.py +2 -2
@@ -1750,8 +1750,8 @@ class CustomImageRecipe(Recipe): if base_recipe_path: base_recipe = open(base_recipe_path, 'r').read() else: - raise IOError("Based on recipe file not found: %s" % - base_recipe_path) + # Pass back None to trigger error message to user + return None # Add a special case for when the recipe we have based a custom image # recipe on requires another recipe.
lib/toaster/toastergui/api.py +7 -1
@@ -677,7 +677,13 @@ class XhrCustomRecipe(View): recipe_path = os.path.join(layerpath, "recipes", "%s.bb" % recipe.name) with open(recipe_path, "w") as recipef: - recipef.write(recipe.generate_recipe_file_contents()) + content = recipe.generate_recipe_file_contents() + if not content: + # Delete this incomplete image recipe object + recipe.delete() + return error_response("recipe-parent-not-exist") + else: + recipef.write(recipe.generate_recipe_file_contents()) return JsonResponse( {"error": "ok",
lib/toaster/toastergui/static/js/libtoaster.js +2 -1
@@ -275,7 +275,8 @@ var libtoaster = (function () { function _addRmLayer(layerObj, add, doneCb){ if (layerObj.xhrLayerUrl === undefined){ - throw("xhrLayerUrl is undefined") + alert("ERROR: missing xhrLayerUrl object. Please file a bug."); + return; } if (add === true) {
lib/toaster/toastergui/static/js/newcustomimage_modal.js +7 -0
@@ -25,6 +25,8 @@ function newCustomImageModalInit(){ var duplicateNameMsg = "An image with this name already exists. Image names must be unique."; var duplicateImageInProjectMsg = "An image with this name already exists in this project." var invalidBaseRecipeIdMsg = "Please select an image to customise."; + var missingParentRecipe = "The parent recipe file was not found. Cancel this action, build any target (like 'quilt-native') to force all new layers to clone, and try again"; + var unknownError = "Unexpected error: "; // set button to "submit" state and enable text entry so user can // enter the custom recipe name
@@ -62,6 +64,7 @@ function newCustomImageModalInit(){ if (nameInput.val().length > 0) { libtoaster.createCustomRecipe(nameInput.val(), baseRecipeId, function(ret) { + showSubmitState(); if (ret.error !== "ok") { console.warn(ret.error); if (ret.error === "invalid-name") {
@@ -73,6 +76,10 @@ function newCustomImageModalInit(){ } else if (ret.error === "image-already-exists") { showNameError(duplicateImageInProjectMsg); return; + } else if (ret.error === "recipe-parent-not-exist") { + showNameError(missingParentRecipe); + } else { + showNameError(unknownError + ret.error); } } else { imgCustomModal.modal('hide');
lib/toaster/toastergui/templates/customise_btn.html +5 -1
@@ -5,7 +5,11 @@ > Customise </button> -<button class="btn btn-default btn-block layer-add-{{data.layer_version.pk}} layerbtn" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add" +<button class="btn btn-default btn-block layer-add-{{data.layer_version.pk}} layerbtn" + data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", + "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}", + "xhrLayerUrl": "{% url "xhr_layer" extra.pid data.layer_version.pk %}"}' + data-directive="add" {% if data.layer_version.pk in extra.current_layers %} style="display:none;" {% endif %}
Signature · 1 line
1.9.1