diff options
Diffstat (limited to 'bitbake/lib/bb/ui/buildinfohelper.py')
-rw-r--r-- | bitbake/lib/bb/ui/buildinfohelper.py | 96 |
1 files changed, 43 insertions, 53 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index 43aa592842..8b212b7803 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
@@ -45,7 +45,7 @@ from pprint import pformat | |||
45 | import logging | 45 | import logging |
46 | from datetime import datetime, timedelta | 46 | from datetime import datetime, timedelta |
47 | 47 | ||
48 | from django.db import transaction, connection | 48 | from django.db import transaction |
49 | 49 | ||
50 | 50 | ||
51 | # pylint: disable=invalid-name | 51 | # pylint: disable=invalid-name |
@@ -227,6 +227,12 @@ class ORMWrapper(object): | |||
227 | build.completed_on = timezone.now() | 227 | build.completed_on = timezone.now() |
228 | build.outcome = outcome | 228 | build.outcome = outcome |
229 | build.save() | 229 | build.save() |
230 | |||
231 | # We force a sync point here to force the outcome status commit, | ||
232 | # which resolves a race condition with the build completion takedown | ||
233 | transaction.set_autocommit(True) | ||
234 | transaction.set_autocommit(False) | ||
235 | |||
230 | signal_runbuilds() | 236 | signal_runbuilds() |
231 | 237 | ||
232 | def update_target_set_license_manifest(self, target, license_manifest_path): | 238 | def update_target_set_license_manifest(self, target, license_manifest_path): |
@@ -483,14 +489,14 @@ class ORMWrapper(object): | |||
483 | 489 | ||
484 | # we already created the root directory, so ignore any | 490 | # we already created the root directory, so ignore any |
485 | # entry for it | 491 | # entry for it |
486 | if len(path) == 0: | 492 | if not path: |
487 | continue | 493 | continue |
488 | 494 | ||
489 | parent_path = "/".join(path.split("/")[:len(path.split("/")) - 1]) | 495 | parent_path = "/".join(path.split("/")[:len(path.split("/")) - 1]) |
490 | if len(parent_path) == 0: | 496 | if not parent_path: |
491 | parent_path = "/" | 497 | parent_path = "/" |
492 | parent_obj = self._cached_get(Target_File, target = target_obj, path = parent_path, inodetype = Target_File.ITYPE_DIRECTORY) | 498 | parent_obj = self._cached_get(Target_File, target = target_obj, path = parent_path, inodetype = Target_File.ITYPE_DIRECTORY) |
493 | tf_obj = Target_File.objects.create( | 499 | Target_File.objects.create( |
494 | target = target_obj, | 500 | target = target_obj, |
495 | path = path, | 501 | path = path, |
496 | size = size, | 502 | size = size, |
@@ -555,7 +561,7 @@ class ORMWrapper(object): | |||
555 | 561 | ||
556 | parent_obj = Target_File.objects.get(target = target_obj, path = parent_path, inodetype = Target_File.ITYPE_DIRECTORY) | 562 | parent_obj = Target_File.objects.get(target = target_obj, path = parent_path, inodetype = Target_File.ITYPE_DIRECTORY) |
557 | 563 | ||
558 | tf_obj = Target_File.objects.create( | 564 | Target_File.objects.create( |
559 | target = target_obj, | 565 | target = target_obj, |
560 | path = path, | 566 | path = path, |
561 | size = size, | 567 | size = size, |
@@ -571,7 +577,7 @@ class ORMWrapper(object): | |||
571 | assert isinstance(build_obj, Build) | 577 | assert isinstance(build_obj, Build) |
572 | assert isinstance(target_obj, Target) | 578 | assert isinstance(target_obj, Target) |
573 | 579 | ||
574 | errormsg = "" | 580 | errormsg = [] |
575 | for p in packagedict: | 581 | for p in packagedict: |
576 | # Search name swtiches round the installed name vs package name | 582 | # Search name swtiches round the installed name vs package name |
577 | # by default installed name == package name | 583 | # by default installed name == package name |
@@ -633,10 +639,10 @@ class ORMWrapper(object): | |||
633 | packagefile_objects.append(Package_File( package = packagedict[p]['object'], | 639 | packagefile_objects.append(Package_File( package = packagedict[p]['object'], |
634 | path = targetpath, | 640 | path = targetpath, |
635 | size = targetfilesize)) | 641 | size = targetfilesize)) |
636 | if len(packagefile_objects): | 642 | if packagefile_objects: |
637 | Package_File.objects.bulk_create(packagefile_objects) | 643 | Package_File.objects.bulk_create(packagefile_objects) |
638 | except KeyError as e: | 644 | except KeyError as e: |
639 | errormsg += " stpi: Key error, package %s key %s \n" % ( p, e ) | 645 | errormsg.append(" stpi: Key error, package %s key %s \n" % (p, e)) |
640 | 646 | ||
641 | # save disk installed size | 647 | # save disk installed size |
642 | packagedict[p]['object'].installed_size = packagedict[p]['size'] | 648 | packagedict[p]['object'].installed_size = packagedict[p]['size'] |
@@ -673,13 +679,13 @@ class ORMWrapper(object): | |||
673 | logger.warning("Could not add dependency to the package %s " | 679 | logger.warning("Could not add dependency to the package %s " |
674 | "because %s is an unknown package", p, px) | 680 | "because %s is an unknown package", p, px) |
675 | 681 | ||
676 | if len(packagedeps_objs) > 0: | 682 | if packagedeps_objs: |
677 | Package_Dependency.objects.bulk_create(packagedeps_objs) | 683 | Package_Dependency.objects.bulk_create(packagedeps_objs) |
678 | else: | 684 | else: |
679 | logger.info("No package dependencies created") | 685 | logger.info("No package dependencies created") |
680 | 686 | ||
681 | if len(errormsg) > 0: | 687 | if errormsg: |
682 | logger.warning("buildinfohelper: target_package_info could not identify recipes: \n%s", errormsg) | 688 | logger.warning("buildinfohelper: target_package_info could not identify recipes: \n%s", "".join(errormsg)) |
683 | 689 | ||
684 | def save_target_image_file_information(self, target_obj, file_name, file_size): | 690 | def save_target_image_file_information(self, target_obj, file_name, file_size): |
685 | Target_Image_File.objects.create(target=target_obj, | 691 | Target_Image_File.objects.create(target=target_obj, |
@@ -767,7 +773,7 @@ class ORMWrapper(object): | |||
767 | packagefile_objects.append(Package_File( package = bp_object, | 773 | packagefile_objects.append(Package_File( package = bp_object, |
768 | path = path, | 774 | path = path, |
769 | size = package_info['FILES_INFO'][path] )) | 775 | size = package_info['FILES_INFO'][path] )) |
770 | if len(packagefile_objects): | 776 | if packagefile_objects: |
771 | Package_File.objects.bulk_create(packagefile_objects) | 777 | Package_File.objects.bulk_create(packagefile_objects) |
772 | 778 | ||
773 | def _po_byname(p): | 779 | def _po_byname(p): |
@@ -809,7 +815,7 @@ class ORMWrapper(object): | |||
809 | packagedeps_objs.append(Package_Dependency( package = bp_object, | 815 | packagedeps_objs.append(Package_Dependency( package = bp_object, |
810 | depends_on = _po_byname(p), dep_type = Package_Dependency.TYPE_RCONFLICTS)) | 816 | depends_on = _po_byname(p), dep_type = Package_Dependency.TYPE_RCONFLICTS)) |
811 | 817 | ||
812 | if len(packagedeps_objs) > 0: | 818 | if packagedeps_objs: |
813 | Package_Dependency.objects.bulk_create(packagedeps_objs) | 819 | Package_Dependency.objects.bulk_create(packagedeps_objs) |
814 | 820 | ||
815 | return bp_object | 821 | return bp_object |
@@ -826,7 +832,7 @@ class ORMWrapper(object): | |||
826 | desc = vardump[root_var]['doc'] | 832 | desc = vardump[root_var]['doc'] |
827 | if desc is None: | 833 | if desc is None: |
828 | desc = '' | 834 | desc = '' |
829 | if len(desc): | 835 | if desc: |
830 | HelpText.objects.get_or_create(build=build_obj, | 836 | HelpText.objects.get_or_create(build=build_obj, |
831 | area=HelpText.VARIABLE, | 837 | area=HelpText.VARIABLE, |
832 | key=k, text=desc) | 838 | key=k, text=desc) |
@@ -846,7 +852,7 @@ class ORMWrapper(object): | |||
846 | file_name = vh['file'], | 852 | file_name = vh['file'], |
847 | line_number = vh['line'], | 853 | line_number = vh['line'], |
848 | operation = vh['op'])) | 854 | operation = vh['op'])) |
849 | if len(varhist_objects): | 855 | if varhist_objects: |
850 | VariableHistory.objects.bulk_create(varhist_objects) | 856 | VariableHistory.objects.bulk_create(varhist_objects) |
851 | 857 | ||
852 | 858 | ||
@@ -893,9 +899,6 @@ class BuildInfoHelper(object): | |||
893 | self.task_order = 0 | 899 | self.task_order = 0 |
894 | self.autocommit_step = 1 | 900 | self.autocommit_step = 1 |
895 | self.server = server | 901 | self.server = server |
896 | # we use manual transactions if the database doesn't autocommit on us | ||
897 | if not connection.features.autocommits_when_autocommit_is_off: | ||
898 | transaction.set_autocommit(False) | ||
899 | self.orm_wrapper = ORMWrapper() | 902 | self.orm_wrapper = ORMWrapper() |
900 | self.has_build_history = has_build_history | 903 | self.has_build_history = has_build_history |
901 | self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0] | 904 | self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0] |
@@ -1059,27 +1062,6 @@ class BuildInfoHelper(object): | |||
1059 | 1062 | ||
1060 | return recipe_info | 1063 | return recipe_info |
1061 | 1064 | ||
1062 | def _get_path_information(self, task_object): | ||
1063 | self._ensure_build() | ||
1064 | |||
1065 | assert isinstance(task_object, Task) | ||
1066 | build_stats_format = "{tmpdir}/buildstats/{buildname}/{package}/" | ||
1067 | build_stats_path = [] | ||
1068 | |||
1069 | for t in self.internal_state['targets']: | ||
1070 | buildname = self.internal_state['build'].build_name | ||
1071 | pe, pv = task_object.recipe.version.split(":",1) | ||
1072 | if len(pe) > 0: | ||
1073 | package = task_object.recipe.name + "-" + pe + "_" + pv | ||
1074 | else: | ||
1075 | package = task_object.recipe.name + "-" + pv | ||
1076 | |||
1077 | build_stats_path.append(build_stats_format.format(tmpdir=self.tmp_dir, | ||
1078 | buildname=buildname, | ||
1079 | package=package)) | ||
1080 | |||
1081 | return build_stats_path | ||
1082 | |||
1083 | 1065 | ||
1084 | ################################ | 1066 | ################################ |
1085 | ## external available methods to store information | 1067 | ## external available methods to store information |
@@ -1313,12 +1295,11 @@ class BuildInfoHelper(object): | |||
1313 | task_information['outcome'] = Task.OUTCOME_FAILED | 1295 | task_information['outcome'] = Task.OUTCOME_FAILED |
1314 | del self.internal_state['taskdata'][identifier] | 1296 | del self.internal_state['taskdata'][identifier] |
1315 | 1297 | ||
1316 | if not connection.features.autocommits_when_autocommit_is_off: | 1298 | # we force a sync point here, to get the progress bar to show |
1317 | # we force a sync point here, to get the progress bar to show | 1299 | if self.autocommit_step % 3 == 0: |
1318 | if self.autocommit_step % 3 == 0: | 1300 | transaction.set_autocommit(True) |
1319 | transaction.set_autocommit(True) | 1301 | transaction.set_autocommit(False) |
1320 | transaction.set_autocommit(False) | 1302 | self.autocommit_step += 1 |
1321 | self.autocommit_step += 1 | ||
1322 | 1303 | ||
1323 | self.orm_wrapper.get_update_task_object(task_information, True) # must exist | 1304 | self.orm_wrapper.get_update_task_object(task_information, True) # must exist |
1324 | 1305 | ||
@@ -1404,7 +1385,7 @@ class BuildInfoHelper(object): | |||
1404 | assert 'pn' in event._depgraph | 1385 | assert 'pn' in event._depgraph |
1405 | assert 'tdepends' in event._depgraph | 1386 | assert 'tdepends' in event._depgraph |
1406 | 1387 | ||
1407 | errormsg = "" | 1388 | errormsg = [] |
1408 | 1389 | ||
1409 | # save layer version priorities | 1390 | # save layer version priorities |
1410 | if 'layer-priorities' in event._depgraph.keys(): | 1391 | if 'layer-priorities' in event._depgraph.keys(): |
@@ -1496,7 +1477,7 @@ class BuildInfoHelper(object): | |||
1496 | elif dep in self.internal_state['recipes']: | 1477 | elif dep in self.internal_state['recipes']: |
1497 | dependency = self.internal_state['recipes'][dep] | 1478 | dependency = self.internal_state['recipes'][dep] |
1498 | else: | 1479 | else: |
1499 | errormsg += " stpd: KeyError saving recipe dependency for %s, %s \n" % (recipe, dep) | 1480 | errormsg.append(" stpd: KeyError saving recipe dependency for %s, %s \n" % (recipe, dep)) |
1500 | continue | 1481 | continue |
1501 | recipe_dep = Recipe_Dependency(recipe=target, | 1482 | recipe_dep = Recipe_Dependency(recipe=target, |
1502 | depends_on=dependency, | 1483 | depends_on=dependency, |
@@ -1537,8 +1518,8 @@ class BuildInfoHelper(object): | |||
1537 | taskdeps_objects.append(Task_Dependency( task = target, depends_on = dep )) | 1518 | taskdeps_objects.append(Task_Dependency( task = target, depends_on = dep )) |
1538 | Task_Dependency.objects.bulk_create(taskdeps_objects) | 1519 | Task_Dependency.objects.bulk_create(taskdeps_objects) |
1539 | 1520 | ||
1540 | if len(errormsg) > 0: | 1521 | if errormsg: |
1541 | logger.warning("buildinfohelper: dependency info not identify recipes: \n%s", errormsg) | 1522 | logger.warning("buildinfohelper: dependency info not identify recipes: \n%s", "".join(errormsg)) |
1542 | 1523 | ||
1543 | 1524 | ||
1544 | def store_build_package_information(self, event): | 1525 | def store_build_package_information(self, event): |
@@ -1618,7 +1599,7 @@ class BuildInfoHelper(object): | |||
1618 | 1599 | ||
1619 | if 'backlog' in self.internal_state: | 1600 | if 'backlog' in self.internal_state: |
1620 | # if we have a backlog of events, do our best to save them here | 1601 | # if we have a backlog of events, do our best to save them here |
1621 | if len(self.internal_state['backlog']): | 1602 | if self.internal_state['backlog']: |
1622 | tempevent = self.internal_state['backlog'].pop() | 1603 | tempevent = self.internal_state['backlog'].pop() |
1623 | logger.debug("buildinfohelper: Saving stored event %s " | 1604 | logger.debug("buildinfohelper: Saving stored event %s " |
1624 | % tempevent) | 1605 | % tempevent) |
@@ -1765,7 +1746,6 @@ class BuildInfoHelper(object): | |||
1765 | 1746 | ||
1766 | buildname = self.server.runCommand(['getVariable', 'BUILDNAME'])[0] | 1747 | buildname = self.server.runCommand(['getVariable', 'BUILDNAME'])[0] |
1767 | machine = self.server.runCommand(['getVariable', 'MACHINE'])[0] | 1748 | machine = self.server.runCommand(['getVariable', 'MACHINE'])[0] |
1768 | image_name = self.server.runCommand(['getVariable', 'IMAGE_NAME'])[0] | ||
1769 | 1749 | ||
1770 | # location of the manifest files for this build; | 1750 | # location of the manifest files for this build; |
1771 | # note that this file is only produced if an image is produced | 1751 | # note that this file is only produced if an image is produced |
@@ -1786,6 +1766,18 @@ class BuildInfoHelper(object): | |||
1786 | # filter out anything which isn't an image target | 1766 | # filter out anything which isn't an image target |
1787 | image_targets = [target for target in targets if target.is_image] | 1767 | image_targets = [target for target in targets if target.is_image] |
1788 | 1768 | ||
1769 | if len(image_targets) > 0: | ||
1770 | #if there are image targets retrieve image_name | ||
1771 | image_name = self.server.runCommand(['getVariable', 'IMAGE_NAME'])[0] | ||
1772 | if not image_name: | ||
1773 | #When build target is an image and image_name is not found as an environment variable | ||
1774 | logger.info("IMAGE_NAME not found, extracting from bitbake command") | ||
1775 | cmd = self.server.runCommand(['getVariable','BB_CMDLINE'])[0] | ||
1776 | #filter out tokens that are command line options | ||
1777 | cmd = [token for token in cmd if not token.startswith('-')] | ||
1778 | image_name = cmd[1].split(':', 1)[0] # remove everything after : in image name | ||
1779 | logger.info("IMAGE_NAME found as : %s " % image_name) | ||
1780 | |||
1789 | for image_target in image_targets: | 1781 | for image_target in image_targets: |
1790 | # this is set to True if we find at least one file relating to | 1782 | # this is set to True if we find at least one file relating to |
1791 | # this target; if this remains False after the scan, we copy the | 1783 | # this target; if this remains False after the scan, we copy the |
@@ -1990,8 +1982,6 @@ class BuildInfoHelper(object): | |||
1990 | # Do not skip command line build events | 1982 | # Do not skip command line build events |
1991 | self.store_log_event(tempevent,False) | 1983 | self.store_log_event(tempevent,False) |
1992 | 1984 | ||
1993 | if not connection.features.autocommits_when_autocommit_is_off: | ||
1994 | transaction.set_autocommit(True) | ||
1995 | 1985 | ||
1996 | # unset the brbe; this is to prevent subsequent command-line builds | 1986 | # unset the brbe; this is to prevent subsequent command-line builds |
1997 | # being incorrectly attached to the previous Toaster-triggered build; | 1987 | # being incorrectly attached to the previous Toaster-triggered build; |