diff options
author | David Reyna <David.Reyna@windriver.com> | 2017-08-20 18:01:48 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-23 12:07:42 +0100 |
commit | 52a67cc958185266f1b982555cf019a8b4f10817 (patch) | |
tree | 455d1e24d62b2a00c2926463d4ab405bbab80cba /bitbake | |
parent | e659fcc6b8d34955b2c38feffc86118f97b6dd9f (diff) | |
download | poky-52a67cc958185266f1b982555cf019a8b4f10817.tar.gz |
bitbake: toaster: custom image updates and original creation
When Toaster removes a package from a custom image, it must
also always remove the advised reverse-dependent recipes.
Similarly, when adding a package it must always add its advised
the packages it depends on. This code must be un-indented so
that it applies to all respective added or removed packages.
Toaster normally waits until a new custom image is built before
creating the custom layer and the recipe. However, an intermediate
different build can fail because the recipe has already been added
to the project, so the image's default recipe must be created
when the image is created.
[YOCTO #11915]
(Bitbake rev: bcd68fd7231f166baff875fb88e4f9ce0d9bf91d)
Signed-off-by: David Reyna <David.Reyna@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/toaster/orm/models.py | 2 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/api.py | 98 |
2 files changed, 62 insertions, 38 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index 7aaebedc2d..3a7dff8ca6 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py | |||
@@ -1658,7 +1658,7 @@ class CustomImageRecipe(Recipe): | |||
1658 | 1658 | ||
1659 | def get_base_recipe_file(self): | 1659 | def get_base_recipe_file(self): |
1660 | """Get the base recipe file path if it exists on the file system""" | 1660 | """Get the base recipe file path if it exists on the file system""" |
1661 | path_schema_one = "%s/%s" % (self.base_recipe.layer_version.dirpath, | 1661 | path_schema_one = "%s/%s" % (self.base_recipe.layer_version.local_path, |
1662 | self.base_recipe.file_path) | 1662 | self.base_recipe.file_path) |
1663 | 1663 | ||
1664 | path_schema_two = self.base_recipe.file_path | 1664 | path_schema_two = self.base_recipe.file_path |
diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/toastergui/api.py index 88d6aa7f68..cb8f0f3127 100644 --- a/bitbake/lib/toaster/toastergui/api.py +++ b/bitbake/lib/toaster/toastergui/api.py | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | # Please run flake8 on this file before sending patches | 19 | # Please run flake8 on this file before sending patches |
20 | 20 | ||
21 | import os | ||
21 | import re | 22 | import re |
22 | import logging | 23 | import logging |
23 | import json | 24 | import json |
@@ -28,7 +29,7 @@ from orm.models import LayerVersionDependency, LayerSource, ProjectLayer | |||
28 | from orm.models import Recipe, CustomImageRecipe, CustomImagePackage | 29 | from orm.models import Recipe, CustomImageRecipe, CustomImagePackage |
29 | from orm.models import Layer, Target, Package, Package_Dependency | 30 | from orm.models import Layer, Target, Package, Package_Dependency |
30 | from orm.models import ProjectVariable | 31 | from orm.models import ProjectVariable |
31 | from bldcontrol.models import BuildRequest | 32 | from bldcontrol.models import BuildRequest, BuildEnvironment |
32 | from bldcontrol import bbcontroller | 33 | from bldcontrol import bbcontroller |
33 | 34 | ||
34 | from django.http import HttpResponse, JsonResponse | 35 | from django.http import HttpResponse, JsonResponse |
@@ -509,6 +510,27 @@ class XhrCustomRecipe(View): | |||
509 | (tpackage.package.name, e)) | 510 | (tpackage.package.name, e)) |
510 | pass | 511 | pass |
511 | 512 | ||
513 | # pre-create layer directory structure, so that other builds | ||
514 | # are not blocked by this new recipe dependecy | ||
515 | # NOTE: this is parallel code to 'localhostbecontroller.py' | ||
516 | be = BuildEnvironment.objects.all()[0] | ||
517 | layerpath = os.path.join(be.builddir, | ||
518 | CustomImageRecipe.LAYER_NAME) | ||
519 | for name in ("conf", "recipes"): | ||
520 | path = os.path.join(layerpath, name) | ||
521 | if not os.path.isdir(path): | ||
522 | os.makedirs(path) | ||
523 | # pre-create layer.conf | ||
524 | config = os.path.join(layerpath, "conf", "layer.conf") | ||
525 | if not os.path.isfile(config): | ||
526 | with open(config, "w") as conf: | ||
527 | conf.write('BBPATH .= ":${LAYERDIR}"\nBBFILES += "${LAYERDIR}/recipes/*.bb"\n') | ||
528 | # pre-create new image's recipe file | ||
529 | recipe_path = os.path.join(layerpath, "recipes", "%s.bb" % | ||
530 | recipe.name) | ||
531 | with open(recipe_path, "w") as recipef: | ||
532 | recipef.write(recipe.generate_recipe_file_contents()) | ||
533 | |||
512 | return JsonResponse( | 534 | return JsonResponse( |
513 | {"error": "ok", | 535 | {"error": "ok", |
514 | "packages": recipe.get_all_packages().count(), | 536 | "packages": recipe.get_all_packages().count(), |
@@ -752,7 +774,6 @@ class XhrCustomRecipePackages(View): | |||
752 | return error_response("Package %s not found in excludes" | 774 | return error_response("Package %s not found in excludes" |
753 | " but was in included list" % | 775 | " but was in included list" % |
754 | package.name) | 776 | package.name) |
755 | |||
756 | else: | 777 | else: |
757 | recipe.appends_set.add(package) | 778 | recipe.appends_set.add(package) |
758 | # Make sure that package is not in the excludes set | 779 | # Make sure that package is not in the excludes set |
@@ -760,26 +781,27 @@ class XhrCustomRecipePackages(View): | |||
760 | recipe.excludes_set.remove(package) | 781 | recipe.excludes_set.remove(package) |
761 | except: | 782 | except: |
762 | pass | 783 | pass |
763 | # Add the dependencies we think will be added to the recipe | 784 | |
764 | # as a result of appending this package. | 785 | # Add the dependencies we think will be added to the recipe |
765 | # TODO this should recurse down the entire deps tree | 786 | # as a result of appending this package. |
766 | for dep in package.package_dependencies_source.all_depends(): | 787 | # TODO this should recurse down the entire deps tree |
788 | for dep in package.package_dependencies_source.all_depends(): | ||
789 | try: | ||
790 | cust_package = CustomImagePackage.objects.get( | ||
791 | name=dep.depends_on.name) | ||
792 | |||
793 | recipe.includes_set.add(cust_package) | ||
767 | try: | 794 | try: |
768 | cust_package = CustomImagePackage.objects.get( | 795 | # When adding the pre-requisite package, make |
769 | name=dep.depends_on.name) | 796 | # sure it's not in the excluded list from a |
770 | 797 | # prior removal. | |
771 | recipe.includes_set.add(cust_package) | 798 | recipe.excludes_set.remove(cust_package) |
772 | try: | 799 | except package.DoesNotExist: |
773 | # When adding the pre-requisite package, make | 800 | # Don't care if the package had never been excluded |
774 | # sure it's not in the excluded list from a | 801 | pass |
775 | # prior removal. | 802 | except: |
776 | recipe.excludes_set.remove(cust_package) | 803 | logger.warning("Could not add package's suggested" |
777 | except package.DoesNotExist: | 804 | "dependencies to the list") |
778 | # Don't care if the package had never been excluded | ||
779 | pass | ||
780 | except: | ||
781 | logger.warning("Could not add package's suggested" | ||
782 | "dependencies to the list") | ||
783 | return JsonResponse({"error": "ok"}) | 805 | return JsonResponse({"error": "ok"}) |
784 | 806 | ||
785 | def delete(self, request, *args, **kwargs): | 807 | def delete(self, request, *args, **kwargs): |
@@ -797,22 +819,24 @@ class XhrCustomRecipePackages(View): | |||
797 | recipe.excludes_set.add(package) | 819 | recipe.excludes_set.add(package) |
798 | else: | 820 | else: |
799 | recipe.appends_set.remove(package) | 821 | recipe.appends_set.remove(package) |
800 | all_current_packages = recipe.get_all_packages() | 822 | |
801 | 823 | # remove dependencies as well | |
802 | reverse_deps_dictlist = self._get_all_dependents( | 824 | all_current_packages = recipe.get_all_packages() |
803 | package.pk, | 825 | |
804 | all_current_packages) | 826 | reverse_deps_dictlist = self._get_all_dependents( |
805 | 827 | package.pk, | |
806 | ids = [entry['pk'] for entry in reverse_deps_dictlist] | 828 | all_current_packages) |
807 | reverse_deps = CustomImagePackage.objects.filter(id__in=ids) | 829 | |
808 | for r in reverse_deps: | 830 | ids = [entry['pk'] for entry in reverse_deps_dictlist] |
809 | try: | 831 | reverse_deps = CustomImagePackage.objects.filter(id__in=ids) |
810 | if r.id in included_packages: | 832 | for r in reverse_deps: |
811 | recipe.excludes_set.add(r) | 833 | try: |
812 | else: | 834 | if r.id in included_packages: |
813 | recipe.appends_set.remove(r) | 835 | recipe.excludes_set.add(r) |
814 | except: | 836 | else: |
815 | pass | 837 | recipe.appends_set.remove(r) |
838 | except: | ||
839 | pass | ||
816 | 840 | ||
817 | return JsonResponse({"error": "ok"}) | 841 | return JsonResponse({"error": "ok"}) |
818 | except CustomImageRecipe.DoesNotExist: | 842 | except CustomImageRecipe.DoesNotExist: |