summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/ui/buildinfohelper.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/ui/buildinfohelper.py')
-rw-r--r--bitbake/lib/bb/ui/buildinfohelper.py96
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
45import logging 45import logging
46from datetime import datetime, timedelta 46from datetime import datetime, timedelta
47 47
48from django.db import transaction, connection 48from 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;