diff options
| -rw-r--r-- | bitbake/lib/bb/ui/buildinfohelper.py | 142 |
1 files changed, 105 insertions, 37 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index 160cb03743..b1a418bca9 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
| @@ -43,6 +43,14 @@ class ORMWrapper(object): | |||
| 43 | 43 | ||
| 44 | 44 | ||
| 45 | def create_build_object(self, build_info): | 45 | def create_build_object(self, build_info): |
| 46 | assert 'machine' in build_info | ||
| 47 | assert 'image_fstypes' in build_info | ||
| 48 | assert 'distro' in build_info | ||
| 49 | assert 'distro_version' in build_info | ||
| 50 | assert 'started_on' in build_info | ||
| 51 | assert 'cooker_log_path' in build_info | ||
| 52 | assert 'build_name' in build_info | ||
| 53 | assert 'bitbake_version' in build_info | ||
| 46 | 54 | ||
| 47 | build = Build.objects.create( | 55 | build = Build.objects.create( |
| 48 | machine=build_info['machine'], | 56 | machine=build_info['machine'], |
| @@ -50,7 +58,7 @@ class ORMWrapper(object): | |||
| 50 | distro=build_info['distro'], | 58 | distro=build_info['distro'], |
| 51 | distro_version=build_info['distro_version'], | 59 | distro_version=build_info['distro_version'], |
| 52 | started_on=build_info['started_on'], | 60 | started_on=build_info['started_on'], |
| 53 | completed_on=build_info['completed_on'], | 61 | completed_on=build_info['started_on'], |
| 54 | cooker_log_path=build_info['cooker_log_path'], | 62 | cooker_log_path=build_info['cooker_log_path'], |
| 55 | build_name=build_info['build_name'], | 63 | build_name=build_info['build_name'], |
| 56 | bitbake_version=build_info['bitbake_version']) | 64 | bitbake_version=build_info['bitbake_version']) |
| @@ -58,6 +66,9 @@ class ORMWrapper(object): | |||
| 58 | return build | 66 | return build |
| 59 | 67 | ||
| 60 | def create_target_objects(self, target_info): | 68 | def create_target_objects(self, target_info): |
| 69 | assert 'build' in target_info | ||
| 70 | assert 'targets' in target_info | ||
| 71 | |||
| 61 | targets = [] | 72 | targets = [] |
| 62 | for tgt_name in target_info['targets']: | 73 | for tgt_name in target_info['targets']: |
| 63 | tgt_object = Target.objects.create( build = target_info['build'], | 74 | tgt_object = Target.objects.create( build = target_info['build'], |
| @@ -69,6 +80,9 @@ class ORMWrapper(object): | |||
| 69 | return targets | 80 | return targets |
| 70 | 81 | ||
| 71 | def update_build_object(self, build, errors, warnings, taskfailures): | 82 | def update_build_object(self, build, errors, warnings, taskfailures): |
| 83 | assert isinstance(build,Build) | ||
| 84 | assert isinstance(errors, int) | ||
| 85 | assert isinstance(warnings, int) | ||
| 72 | 86 | ||
| 73 | outcome = Build.SUCCEEDED | 87 | outcome = Build.SUCCEEDED |
| 74 | if errors or taskfailures: | 88 | if errors or taskfailures: |
| @@ -82,13 +96,20 @@ class ORMWrapper(object): | |||
| 82 | build.save() | 96 | build.save() |
| 83 | 97 | ||
| 84 | 98 | ||
| 85 | def get_update_task_object(self, task_information): | 99 | def get_update_task_object(self, task_information, must_exist = False): |
| 100 | assert 'build' in task_information | ||
| 101 | assert 'recipe' in task_information | ||
| 102 | assert 'task_name' in task_information | ||
| 103 | |||
| 86 | task_object, created = Task.objects.get_or_create( | 104 | task_object, created = Task.objects.get_or_create( |
| 87 | build=task_information['build'], | 105 | build=task_information['build'], |
| 88 | recipe=task_information['recipe'], | 106 | recipe=task_information['recipe'], |
| 89 | task_name=task_information['task_name'], | 107 | task_name=task_information['task_name'], |
| 90 | ) | 108 | ) |
| 91 | 109 | ||
| 110 | if must_exist and created: | ||
| 111 | raise Exception("Task object created when expected to exist") | ||
| 112 | |||
| 92 | for v in vars(task_object): | 113 | for v in vars(task_object): |
| 93 | if v in task_information.keys(): | 114 | if v in task_information.keys(): |
| 94 | vars(task_object)[v] = task_information[v] | 115 | vars(task_object)[v] = task_information[v] |
| @@ -112,6 +133,8 @@ class ORMWrapper(object): | |||
| 112 | 133 | ||
| 113 | 134 | ||
| 114 | def get_update_recipe_object(self, recipe_information): | 135 | def get_update_recipe_object(self, recipe_information): |
| 136 | assert 'layer_version' in recipe_information | ||
| 137 | assert 'file_path' in recipe_information | ||
| 115 | 138 | ||
| 116 | recipe_object, created = Recipe.objects.get_or_create( | 139 | recipe_object, created = Recipe.objects.get_or_create( |
| 117 | layer_version=recipe_information['layer_version'], | 140 | layer_version=recipe_information['layer_version'], |
| @@ -126,8 +149,13 @@ class ORMWrapper(object): | |||
| 126 | return recipe_object | 149 | return recipe_object |
| 127 | 150 | ||
| 128 | def get_update_layer_version_object(self, build_obj, layer_obj, layer_version_information): | 151 | def get_update_layer_version_object(self, build_obj, layer_obj, layer_version_information): |
| 152 | assert isinstance(build_obj, Build) | ||
| 153 | assert isinstance(layer_obj, Layer) | ||
| 154 | assert 'branch' in layer_version_information | ||
| 155 | assert 'commit' in layer_version_information | ||
| 156 | assert 'priority' in layer_version_information | ||
| 129 | 157 | ||
| 130 | layer_version_object = Layer_Version.objects.get_or_create( | 158 | layer_version_object, created = Layer_Version.objects.get_or_create( |
| 131 | build = build_obj, | 159 | build = build_obj, |
| 132 | layer = layer_obj, | 160 | layer = layer_obj, |
| 133 | branch = layer_version_information['branch'], | 161 | branch = layer_version_information['branch'], |
| @@ -135,22 +163,26 @@ class ORMWrapper(object): | |||
| 135 | priority = layer_version_information['priority'] | 163 | priority = layer_version_information['priority'] |
| 136 | ) | 164 | ) |
| 137 | 165 | ||
| 138 | layer_version_object[0].save() | 166 | return layer_version_object |
| 139 | |||
| 140 | return layer_version_object[0] | ||
| 141 | 167 | ||
| 142 | def get_update_layer_object(self, layer_information): | 168 | def get_update_layer_object(self, layer_information): |
| 169 | assert 'name' in layer_information | ||
| 170 | assert 'local_path' in layer_information | ||
| 171 | assert 'layer_index_url' in layer_information | ||
| 143 | 172 | ||
| 144 | layer_object = Layer.objects.get_or_create( | 173 | layer_object, created = Layer.objects.get_or_create( |
| 145 | name=layer_information['name'], | 174 | name=layer_information['name'], |
| 146 | local_path=layer_information['local_path'], | 175 | local_path=layer_information['local_path'], |
| 147 | layer_index_url=layer_information['layer_index_url']) | 176 | layer_index_url=layer_information['layer_index_url']) |
| 148 | layer_object[0].save() | ||
| 149 | 177 | ||
| 150 | return layer_object[0] | 178 | return layer_object |
| 151 | 179 | ||
| 152 | 180 | ||
| 153 | def save_target_package_information(self, build_obj, target_obj, packagedict, pkgpnmap, recipes): | 181 | def save_target_package_information(self, build_obj, target_obj, packagedict, pkgpnmap, recipes): |
| 182 | assert isinstance(build_obj, Build) | ||
| 183 | assert isinstance(target_obj, Target) | ||
| 184 | |||
| 185 | errormsg = "" | ||
| 154 | for p in packagedict: | 186 | for p in packagedict: |
| 155 | searchname = p | 187 | searchname = p |
| 156 | if 'OPKGN' in pkgpnmap[p].keys(): | 188 | if 'OPKGN' in pkgpnmap[p].keys(): |
| @@ -178,7 +210,7 @@ class ORMWrapper(object): | |||
| 178 | path = targetpath, | 210 | path = targetpath, |
| 179 | size = targetfilesize) | 211 | size = targetfilesize) |
| 180 | except KeyError as e: | 212 | except KeyError as e: |
| 181 | print "Key error, package", p, "key", e | 213 | errormsg += " stpi: Key error, package %s key %s \n" % ( p, e ) |
| 182 | 214 | ||
| 183 | # save disk installed size | 215 | # save disk installed size |
| 184 | packagedict[p]['object'].installed_size = packagedict[p]['size'] | 216 | packagedict[p]['object'].installed_size = packagedict[p]['size'] |
| @@ -198,8 +230,15 @@ class ORMWrapper(object): | |||
| 198 | dep_type = tdeptype, | 230 | dep_type = tdeptype, |
| 199 | target = target_obj); | 231 | target = target_obj); |
| 200 | 232 | ||
| 233 | if (len(errormsg) > 0): | ||
| 234 | raise Exception(errormsg) | ||
| 235 | |||
| 201 | 236 | ||
| 202 | def create_logmessage(self, log_information): | 237 | def create_logmessage(self, log_information): |
| 238 | assert 'build' in log_information | ||
| 239 | assert 'level' in log_information | ||
| 240 | assert 'message' in log_information | ||
| 241 | |||
| 203 | log_object = LogMessage.objects.create( | 242 | log_object = LogMessage.objects.create( |
| 204 | build = log_information['build'], | 243 | build = log_information['build'], |
| 205 | level = log_information['level'], | 244 | level = log_information['level'], |
| @@ -213,8 +252,10 @@ class ORMWrapper(object): | |||
| 213 | 252 | ||
| 214 | 253 | ||
| 215 | def save_build_package_information(self, build_obj, package_info, recipes): | 254 | def save_build_package_information(self, build_obj, package_info, recipes): |
| 255 | assert isinstance(build_obj, Build) | ||
| 256 | |||
| 216 | # create and save the object | 257 | # create and save the object |
| 217 | pname = package_info['PKG'] | 258 | pname = package_info['PKG'] |
| 218 | if 'OPKGN' in package_info.keys(): | 259 | if 'OPKGN' in package_info.keys(): |
| 219 | pname = package_info['OPKGN'] | 260 | pname = package_info['OPKGN'] |
| 220 | 261 | ||
| @@ -274,6 +315,8 @@ class ORMWrapper(object): | |||
| 274 | return bp_object | 315 | return bp_object |
| 275 | 316 | ||
| 276 | def save_build_variables(self, build_obj, vardump): | 317 | def save_build_variables(self, build_obj, vardump): |
| 318 | assert isinstance(build_obj, Build) | ||
| 319 | |||
| 277 | for k in vardump: | 320 | for k in vardump: |
| 278 | if not bool(vardump[k]['func']): | 321 | if not bool(vardump[k]['func']): |
| 279 | value = vardump[k]['v']; | 322 | value = vardump[k]['v']; |
| @@ -340,7 +383,7 @@ class BuildInfoHelper(object): | |||
| 340 | return build_info | 383 | return build_info |
| 341 | 384 | ||
| 342 | def _get_task_information(self, event, recipe): | 385 | def _get_task_information(self, event, recipe): |
| 343 | 386 | assert 'taskname' in vars(event) | |
| 344 | 387 | ||
| 345 | task_information = {} | 388 | task_information = {} |
| 346 | task_information['build'] = self.internal_state['build'] | 389 | task_information['build'] = self.internal_state['build'] |
| @@ -355,7 +398,11 @@ class BuildInfoHelper(object): | |||
| 355 | return task_information | 398 | return task_information |
| 356 | 399 | ||
| 357 | def _get_layer_version_for_path(self, path): | 400 | def _get_layer_version_for_path(self, path): |
| 401 | assert path.startswith("/") | ||
| 402 | assert 'build' in self.internal_state | ||
| 403 | |||
| 358 | def _slkey(layer_version): | 404 | def _slkey(layer_version): |
| 405 | assert isinstance(layer_version, Layer_Version) | ||
| 359 | return len(layer_version.layer.local_path) | 406 | return len(layer_version.layer.local_path) |
| 360 | 407 | ||
| 361 | # Heuristics: we always match recipe to the deepest layer path that | 408 | # Heuristics: we always match recipe to the deepest layer path that |
| @@ -369,16 +416,17 @@ class BuildInfoHelper(object): | |||
| 369 | return None | 416 | return None |
| 370 | 417 | ||
| 371 | def _get_recipe_information_from_taskfile(self, taskfile): | 418 | def _get_recipe_information_from_taskfile(self, taskfile): |
| 372 | 419 | localfilepath = taskfile.split(":")[-1] | |
| 373 | layer_version_obj = self._get_layer_version_for_path(re.split(':', taskfile)[-1]) | 420 | layer_version_obj = self._get_layer_version_for_path(localfilepath) |
| 374 | 421 | ||
| 375 | recipe_info = {} | 422 | recipe_info = {} |
| 376 | recipe_info['layer_version'] = layer_version_obj | 423 | recipe_info['layer_version'] = layer_version_obj |
| 377 | recipe_info['file_path'] = re.split(':', taskfile)[-1] | 424 | recipe_info['file_path'] = taskfile |
| 378 | 425 | ||
| 379 | return recipe_info | 426 | return recipe_info |
| 380 | 427 | ||
| 381 | def _get_path_information(self, task_object): | 428 | def _get_path_information(self, task_object): |
| 429 | assert isinstance(task_object, Task) | ||
| 382 | build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/" | 430 | build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/" |
| 383 | build_stats_path = [] | 431 | build_stats_path = [] |
| 384 | 432 | ||
| @@ -410,6 +458,7 @@ class BuildInfoHelper(object): | |||
| 410 | ## external available methods to store information | 458 | ## external available methods to store information |
| 411 | 459 | ||
| 412 | def store_layer_info(self, event): | 460 | def store_layer_info(self, event): |
| 461 | assert 'data' in vars(event) | ||
| 413 | layerinfos = event.data | 462 | layerinfos = event.data |
| 414 | self.internal_state['lvs'] = {} | 463 | self.internal_state['lvs'] = {} |
| 415 | for layer in layerinfos: | 464 | for layer in layerinfos: |
| @@ -417,7 +466,7 @@ class BuildInfoHelper(object): | |||
| 417 | 466 | ||
| 418 | 467 | ||
| 419 | def store_started_build(self, event): | 468 | def store_started_build(self, event): |
| 420 | 469 | assert '_pkgs' in vars(event) | |
| 421 | build_information = self._get_build_information() | 470 | build_information = self._get_build_information() |
| 422 | 471 | ||
| 423 | build_obj = self.orm_wrapper.create_build_object(build_information) | 472 | build_obj = self.orm_wrapper.create_build_object(build_information) |
| @@ -431,7 +480,7 @@ class BuildInfoHelper(object): | |||
| 431 | 480 | ||
| 432 | # create target information | 481 | # create target information |
| 433 | target_information = {} | 482 | target_information = {} |
| 434 | target_information['targets'] = event.getPkgs() | 483 | target_information['targets'] = event._pkgs |
| 435 | target_information['build'] = build_obj | 484 | target_information['build'] = build_obj |
| 436 | 485 | ||
| 437 | self.internal_state['targets'] = self.orm_wrapper.create_target_objects(target_information) | 486 | self.internal_state['targets'] = self.orm_wrapper.create_target_objects(target_information) |
| @@ -445,7 +494,12 @@ class BuildInfoHelper(object): | |||
| 445 | self.orm_wrapper.update_build_object(self.internal_state['build'], errors, warnings, taskfailures) | 494 | self.orm_wrapper.update_build_object(self.internal_state['build'], errors, warnings, taskfailures) |
| 446 | 495 | ||
| 447 | def store_started_task(self, event): | 496 | def store_started_task(self, event): |
| 448 | identifier = event.taskfile.split(":")[-1] + ":" + event.taskname | 497 | assert isinstance(event, (bb.runqueue.sceneQueueTaskStarted, bb.runqueue.runQueueTaskStarted, bb.runqueue.runQueueTaskSkipped)) |
| 498 | assert 'taskfile' in vars(event) | ||
| 499 | localfilepath = event.taskfile.split(":")[-1] | ||
| 500 | assert localfilepath.startswith("/") | ||
| 501 | |||
| 502 | identifier = event.taskfile + ":" + event.taskname | ||
| 449 | 503 | ||
| 450 | recipe_information = self._get_recipe_information_from_taskfile(event.taskfile) | 504 | recipe_information = self._get_recipe_information_from_taskfile(event.taskfile) |
| 451 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) | 505 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) |
| @@ -454,6 +508,7 @@ class BuildInfoHelper(object): | |||
| 454 | task_information['outcome'] = Task.OUTCOME_NA | 508 | task_information['outcome'] = Task.OUTCOME_NA |
| 455 | 509 | ||
| 456 | if isinstance(event, bb.runqueue.runQueueTaskSkipped): | 510 | if isinstance(event, bb.runqueue.runQueueTaskSkipped): |
| 511 | assert 'reason' in vars(event) | ||
| 457 | task_information['task_executed'] = False | 512 | task_information['task_executed'] = False |
| 458 | if event.reason == "covered": | 513 | if event.reason == "covered": |
| 459 | task_information['outcome'] = Task.OUTCOME_COVERED | 514 | task_information['outcome'] = Task.OUTCOME_COVERED |
| @@ -481,6 +536,9 @@ class BuildInfoHelper(object): | |||
| 481 | 536 | ||
| 482 | def store_tasks_stats(self, event): | 537 | def store_tasks_stats(self, event): |
| 483 | for (taskfile, taskname, taskstats) in event.data: | 538 | for (taskfile, taskname, taskstats) in event.data: |
| 539 | localfilepath = taskfile.split(":")[-1] | ||
| 540 | assert localfilepath.startswith("/") | ||
| 541 | |||
| 484 | recipe_information = self._get_recipe_information_from_taskfile(taskfile) | 542 | recipe_information = self._get_recipe_information_from_taskfile(taskfile) |
| 485 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) | 543 | recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) |
| 486 | 544 | ||
| @@ -490,10 +548,14 @@ class BuildInfoHelper(object): | |||
| 490 | task_information['task_name'] = taskname | 548 | task_information['task_name'] = taskname |
| 491 | task_information['cpu_usage'] = taskstats['cpu_usage'] | 549 | task_information['cpu_usage'] = taskstats['cpu_usage'] |
| 492 | task_information['disk_io'] = taskstats['disk_io'] | 550 | task_information['disk_io'] = taskstats['disk_io'] |
| 493 | task_obj = self.orm_wrapper.get_update_task_object(task_information) | 551 | task_obj = self.orm_wrapper.get_update_task_object(task_information, True) # must exist |
| 494 | 552 | ||
| 495 | def update_and_store_task(self, event): | 553 | def update_and_store_task(self, event): |
| 496 | identifier = event.taskfile.split(":")[-1] + ":" + event.taskname | 554 | assert 'taskfile' in vars(event) |
| 555 | localfilepath = event.taskfile.split(":")[-1] | ||
| 556 | assert localfilepath.startswith("/") | ||
| 557 | |||
| 558 | identifier = event.taskfile + ":" + event.taskname | ||
| 497 | assert identifier in self.internal_state['taskdata'] | 559 | assert identifier in self.internal_state['taskdata'] |
| 498 | 560 | ||
| 499 | recipe_information = self._get_recipe_information_from_taskfile(event.taskfile) | 561 | recipe_information = self._get_recipe_information_from_taskfile(event.taskfile) |
| @@ -525,10 +587,11 @@ class BuildInfoHelper(object): | |||
| 525 | task_information['outcome'] = Task.OUTCOME_FAILED | 587 | task_information['outcome'] = Task.OUTCOME_FAILED |
| 526 | del self.internal_state['taskdata'][identifier] | 588 | del self.internal_state['taskdata'][identifier] |
| 527 | 589 | ||
| 528 | self.orm_wrapper.get_update_task_object(task_information) | 590 | self.orm_wrapper.get_update_task_object(task_information, True) # must exist |
| 529 | 591 | ||
| 530 | 592 | ||
| 531 | def store_target_package_data(self, event): | 593 | def store_target_package_data(self, event): |
| 594 | assert 'data' in vars(event) | ||
| 532 | # for all image targets | 595 | # for all image targets |
| 533 | for target in self.internal_state['targets']: | 596 | for target in self.internal_state['targets']: |
| 534 | if target.is_image: | 597 | if target.is_image: |
| @@ -537,6 +600,13 @@ class BuildInfoHelper(object): | |||
| 537 | self.orm_wrapper.save_target_package_information(self.internal_state['build'], target, imgdata, pkgdata, self.internal_state['recipes']) | 600 | self.orm_wrapper.save_target_package_information(self.internal_state['build'], target, imgdata, pkgdata, self.internal_state['recipes']) |
| 538 | 601 | ||
| 539 | def store_dependency_information(self, event): | 602 | def store_dependency_information(self, event): |
| 603 | assert '_depgraph' in vars(event) | ||
| 604 | assert 'layer-priorities' in event._depgraph | ||
| 605 | assert 'pn' in event._depgraph | ||
| 606 | assert 'tdepends' in event._depgraph | ||
| 607 | |||
| 608 | errormsg = "" | ||
| 609 | |||
| 540 | # save layer version priorities | 610 | # save layer version priorities |
| 541 | if 'layer-priorities' in event._depgraph.keys(): | 611 | if 'layer-priorities' in event._depgraph.keys(): |
| 542 | for lv in event._depgraph['layer-priorities']: | 612 | for lv in event._depgraph['layer-priorities']: |
| @@ -550,8 +620,8 @@ class BuildInfoHelper(object): | |||
| 550 | self.internal_state['recipes'] = {} | 620 | self.internal_state['recipes'] = {} |
| 551 | for pn in event._depgraph['pn']: | 621 | for pn in event._depgraph['pn']: |
| 552 | 622 | ||
| 553 | file_name = re.split(':', event._depgraph['pn'][pn]['filename'])[-1] | 623 | file_name = event._depgraph['pn'][pn]['filename'] |
| 554 | layer_version_obj = self._get_layer_version_for_path(re.split(':', file_name)[-1]) | 624 | layer_version_obj = self._get_layer_version_for_path(file_name.split(":")[-1]) |
| 555 | 625 | ||
| 556 | assert layer_version_obj is not None | 626 | assert layer_version_obj is not None |
| 557 | 627 | ||
| @@ -579,6 +649,10 @@ class BuildInfoHelper(object): | |||
| 579 | t.save() | 649 | t.save() |
| 580 | self.internal_state['recipes'][pn] = recipe | 650 | self.internal_state['recipes'][pn] = recipe |
| 581 | 651 | ||
| 652 | # we'll not get recipes for key w/ values listed in ASSUME_PROVIDED | ||
| 653 | |||
| 654 | assume_provided = self.server.runCommand(["getVariable", "ASSUME_PROVIDED"])[0].split() | ||
| 655 | |||
| 582 | # save recipe dependency | 656 | # save recipe dependency |
| 583 | # buildtime | 657 | # buildtime |
| 584 | for recipe in event._depgraph['depends']: | 658 | for recipe in event._depgraph['depends']: |
| @@ -588,20 +662,9 @@ class BuildInfoHelper(object): | |||
| 588 | dependency = self.internal_state['recipes'][dep] | 662 | dependency = self.internal_state['recipes'][dep] |
| 589 | Recipe_Dependency.objects.get_or_create( recipe = target, | 663 | Recipe_Dependency.objects.get_or_create( recipe = target, |
| 590 | depends_on = dependency, dep_type = Recipe_Dependency.TYPE_DEPENDS) | 664 | depends_on = dependency, dep_type = Recipe_Dependency.TYPE_DEPENDS) |
| 591 | except KeyError: # we'll not get recipes for key w/ values listed in ASSUME_PROVIDED | 665 | except KeyError as e: |
| 592 | pass | 666 | if e not in assume_provided and not str(e).startswith("virtual/"): |
| 593 | 667 | errormsg += " stpd: KeyError saving recipe dependency for %s, %s \n" % (recipe, e) | |
| 594 | # runtime | ||
| 595 | for recipe in event._depgraph['rdepends-pn']: | ||
| 596 | try: | ||
| 597 | target = self.internal_state['recipes'][recipe] | ||
| 598 | for dep in event._depgraph['rdepends-pn'][recipe]: | ||
| 599 | dependency = self.internal_state['recipes'][dep] | ||
| 600 | Recipe_Dependency.objects.get_or_create( recipe = target, | ||
| 601 | depends_on = dependency, dep_type = Recipe_Dependency.TYPE_RDEPENDS) | ||
| 602 | |||
| 603 | except KeyError: # we'll not get recipes for key w/ values listed in ASSUME_PROVIDED | ||
| 604 | pass | ||
| 605 | 668 | ||
| 606 | # save all task information | 669 | # save all task information |
| 607 | def _save_a_task(taskdesc): | 670 | def _save_a_task(taskdesc): |
| @@ -632,7 +695,12 @@ class BuildInfoHelper(object): | |||
| 632 | dep = tasks[taskdep] | 695 | dep = tasks[taskdep] |
| 633 | Task_Dependency.objects.get_or_create( task = target, depends_on = dep ) | 696 | Task_Dependency.objects.get_or_create( task = target, depends_on = dep ) |
| 634 | 697 | ||
| 698 | if (len(errormsg) > 0): | ||
| 699 | raise Exception(errormsg) | ||
| 700 | |||
| 701 | |||
| 635 | def store_build_package_information(self, event): | 702 | def store_build_package_information(self, event): |
| 703 | assert 'data' in vars(event) | ||
| 636 | package_info = event.data | 704 | package_info = event.data |
| 637 | self.orm_wrapper.save_build_package_information(self.internal_state['build'], | 705 | self.orm_wrapper.save_build_package_information(self.internal_state['build'], |
| 638 | package_info, | 706 | package_info, |
