diff options
| -rwxr-xr-x | bitbake/lib/bb/ui/crumbs/builder.py | 52 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 | ||||
| -rwxr-xr-x | bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 24 | ||||
| -rwxr-xr-x | bitbake/lib/bb/ui/crumbs/packageselectionpage.py | 27 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/crumbs/runningbuild.py | 41 |
5 files changed, 129 insertions, 18 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/builder.py b/bitbake/lib/bb/ui/crumbs/builder.py index c2e7068428..cb2338e777 100755 --- a/bitbake/lib/bb/ui/crumbs/builder.py +++ b/bitbake/lib/bb/ui/crumbs/builder.py | |||
| @@ -27,6 +27,7 @@ import os | |||
| 27 | import subprocess | 27 | import subprocess |
| 28 | import shlex | 28 | import shlex |
| 29 | import re | 29 | import re |
| 30 | import logging | ||
| 30 | from bb.ui.crumbs.template import TemplateMgr | 31 | from bb.ui.crumbs.template import TemplateMgr |
| 31 | from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage | 32 | from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage |
| 32 | from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage | 33 | from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage |
| @@ -395,6 +396,11 @@ class Builder(gtk.Window): | |||
| 395 | 396 | ||
| 396 | self.template = None | 397 | self.template = None |
| 397 | 398 | ||
| 399 | # logger | ||
| 400 | self.logger = logging.getLogger("BitBake") | ||
| 401 | self.consolelog = None | ||
| 402 | self.current_logfile = None | ||
| 403 | |||
| 398 | # configuration and parameters | 404 | # configuration and parameters |
| 399 | self.configuration = Configuration() | 405 | self.configuration = Configuration() |
| 400 | self.parameters = Parameters() | 406 | self.parameters = Parameters() |
| @@ -433,6 +439,7 @@ class Builder(gtk.Window): | |||
| 433 | self.handler.build.connect("build-aborted", self.handler_build_aborted_cb) | 439 | self.handler.build.connect("build-aborted", self.handler_build_aborted_cb) |
| 434 | self.handler.build.connect("task-started", self.handler_task_started_cb) | 440 | self.handler.build.connect("task-started", self.handler_task_started_cb) |
| 435 | self.handler.build.connect("log-error", self.handler_build_failure_cb) | 441 | self.handler.build.connect("log-error", self.handler_build_failure_cb) |
| 442 | self.handler.build.connect("log", self.handler_build_log_cb) | ||
| 436 | self.handler.build.connect("no-provider", self.handler_no_provider_cb) | 443 | self.handler.build.connect("no-provider", self.handler_no_provider_cb) |
| 437 | self.handler.connect("generating-data", self.handler_generating_data_cb) | 444 | self.handler.connect("generating-data", self.handler_generating_data_cb) |
| 438 | self.handler.connect("data-generated", self.handler_data_generated_cb) | 445 | self.handler.connect("data-generated", self.handler_data_generated_cb) |
| @@ -501,25 +508,34 @@ class Builder(gtk.Window): | |||
| 501 | self.set_user_config() | 508 | self.set_user_config() |
| 502 | self.handler.generate_recipes() | 509 | self.handler.generate_recipes() |
| 503 | 510 | ||
| 504 | def generate_packages_async(self): | 511 | def generate_packages_async(self, log = False): |
| 505 | self.switch_page(self.PACKAGE_GENERATING) | 512 | self.switch_page(self.PACKAGE_GENERATING) |
| 513 | if log: | ||
| 514 | self.current_logfile = self.handler.get_logfile() | ||
| 515 | self.do_log(self.current_logfile) | ||
| 506 | # Build packages | 516 | # Build packages |
| 507 | _, all_recipes = self.recipe_model.get_selected_recipes() | 517 | _, all_recipes = self.recipe_model.get_selected_recipes() |
| 508 | self.set_user_config() | 518 | self.set_user_config() |
| 509 | self.handler.reset_build() | 519 | self.handler.reset_build() |
| 510 | self.handler.generate_packages(all_recipes, self.configuration.default_task) | 520 | self.handler.generate_packages(all_recipes, self.configuration.default_task) |
| 511 | 521 | ||
| 512 | def fast_generate_image_async(self): | 522 | def fast_generate_image_async(self, log = False): |
| 513 | self.switch_page(self.FAST_IMAGE_GENERATING) | 523 | self.switch_page(self.FAST_IMAGE_GENERATING) |
| 524 | if log: | ||
| 525 | self.current_logfile = self.handler.get_logfile() | ||
| 526 | self.do_log(self.current_logfile) | ||
| 514 | # Build packages | 527 | # Build packages |
| 515 | _, all_recipes = self.recipe_model.get_selected_recipes() | 528 | _, all_recipes = self.recipe_model.get_selected_recipes() |
| 516 | self.set_user_config() | 529 | self.set_user_config() |
| 517 | self.handler.reset_build() | 530 | self.handler.reset_build() |
| 518 | self.handler.generate_packages(all_recipes, self.configuration.default_task) | 531 | self.handler.generate_packages(all_recipes, self.configuration.default_task) |
| 519 | 532 | ||
| 520 | def generate_image_async(self): | 533 | def generate_image_async(self, cont = False): |
| 521 | self.switch_page(self.IMAGE_GENERATING) | 534 | self.switch_page(self.IMAGE_GENERATING) |
| 522 | self.handler.reset_build() | 535 | self.handler.reset_build() |
| 536 | if not cont: | ||
| 537 | self.current_logfile = self.handler.get_logfile() | ||
| 538 | self.do_log(self.current_logfile) | ||
| 523 | # Build image | 539 | # Build image |
| 524 | self.set_user_config() | 540 | self.set_user_config() |
| 525 | toolchain_packages = [] | 541 | toolchain_packages = [] |
| @@ -627,14 +643,14 @@ class Builder(gtk.Window): | |||
| 627 | pass | 643 | pass |
| 628 | 644 | ||
| 629 | elif next_step == self.PACKAGE_SELECTION: | 645 | elif next_step == self.PACKAGE_SELECTION: |
| 630 | pass | 646 | self.package_details_page.show_page(self.current_logfile) |
| 631 | 647 | ||
| 632 | elif next_step == self.PACKAGE_GENERATING or next_step == self.FAST_IMAGE_GENERATING: | 648 | elif next_step == self.PACKAGE_GENERATING or next_step == self.FAST_IMAGE_GENERATING: |
| 633 | # both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page | 649 | # both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page |
| 634 | self.build_details_page.show_page(next_step) | 650 | self.build_details_page.show_page(next_step) |
| 635 | 651 | ||
| 636 | elif next_step == self.PACKAGE_GENERATED: | 652 | elif next_step == self.PACKAGE_GENERATED: |
| 637 | pass | 653 | self.package_details_page.show_page(self.current_logfile) |
| 638 | 654 | ||
| 639 | elif next_step == self.IMAGE_GENERATING: | 655 | elif next_step == self.IMAGE_GENERATING: |
| 640 | # after packages are generated, selected_packages need to | 656 | # after packages are generated, selected_packages need to |
| @@ -736,7 +752,7 @@ class Builder(gtk.Window): | |||
| 736 | 752 | ||
| 737 | self.rcppkglist_populated() | 753 | self.rcppkglist_populated() |
| 738 | if self.current_step == self.FAST_IMAGE_GENERATING: | 754 | if self.current_step == self.FAST_IMAGE_GENERATING: |
| 739 | self.generate_image_async() | 755 | self.generate_image_async(True) |
| 740 | 756 | ||
| 741 | def show_error_dialog(self, msg): | 757 | def show_error_dialog(self, msg): |
| 742 | lbl = "<b>Error</b>\n" | 758 | lbl = "<b>Error</b>\n" |
| @@ -963,6 +979,10 @@ class Builder(gtk.Window): | |||
| 963 | def handler_build_failure_cb(self, running_build): | 979 | def handler_build_failure_cb(self, running_build): |
| 964 | self.build_details_page.show_issues() | 980 | self.build_details_page.show_issues() |
| 965 | 981 | ||
| 982 | def handler_build_log_cb(self, running_build, func, obj): | ||
| 983 | if hasattr(self.logger, func): | ||
| 984 | getattr(self.logger, func)(obj) | ||
| 985 | |||
| 966 | def destroy_window_cb(self, widget, event): | 986 | def destroy_window_cb(self, widget, event): |
| 967 | if not self.sensitive: | 987 | if not self.sensitive: |
| 968 | return True | 988 | return True |
| @@ -992,7 +1012,7 @@ class Builder(gtk.Window): | |||
| 992 | dialog.run() | 1012 | dialog.run() |
| 993 | dialog.destroy() | 1013 | dialog.destroy() |
| 994 | return | 1014 | return |
| 995 | self.generate_packages_async() | 1015 | self.generate_packages_async(True) |
| 996 | 1016 | ||
| 997 | def build_image(self): | 1017 | def build_image(self): |
| 998 | selected_packages = self.package_model.get_selected_packages() | 1018 | selected_packages = self.package_model.get_selected_packages() |
| @@ -1005,7 +1025,7 @@ class Builder(gtk.Window): | |||
| 1005 | dialog.run() | 1025 | dialog.run() |
| 1006 | dialog.destroy() | 1026 | dialog.destroy() |
| 1007 | return | 1027 | return |
| 1008 | self.generate_image_async() | 1028 | self.generate_image_async(True) |
| 1009 | 1029 | ||
| 1010 | def just_bake(self): | 1030 | def just_bake(self): |
| 1011 | selected_image = self.recipe_model.get_selected_image() | 1031 | selected_image = self.recipe_model.get_selected_image() |
| @@ -1022,7 +1042,7 @@ class Builder(gtk.Window): | |||
| 1022 | dialog.destroy() | 1042 | dialog.destroy() |
| 1023 | return | 1043 | return |
| 1024 | 1044 | ||
| 1025 | self.fast_generate_image_async() | 1045 | self.fast_generate_image_async(True) |
| 1026 | 1046 | ||
| 1027 | def show_binb_dialog(self, binb): | 1047 | def show_binb_dialog(self, binb): |
| 1028 | markup = "<b>Brought in by:</b>\n%s" % binb | 1048 | markup = "<b>Brought in by:</b>\n%s" % binb |
| @@ -1241,7 +1261,7 @@ class Builder(gtk.Window): | |||
| 1241 | response = dialog.run() | 1261 | response = dialog.run() |
| 1242 | dialog.destroy() | 1262 | dialog.destroy() |
| 1243 | if response == gtk.RESPONSE_YES: | 1263 | if response == gtk.RESPONSE_YES: |
| 1244 | self.generate_packages_async() | 1264 | self.generate_packages_async(True) |
| 1245 | else: | 1265 | else: |
| 1246 | self.switch_page(self.PACKAGE_SELECTION) | 1266 | self.switch_page(self.PACKAGE_SELECTION) |
| 1247 | else: | 1267 | else: |
| @@ -1289,3 +1309,15 @@ class Builder(gtk.Window): | |||
| 1289 | self.cancel_build_sync() | 1309 | self.cancel_build_sync() |
| 1290 | elif response == gtk.RESPONSE_YES: | 1310 | elif response == gtk.RESPONSE_YES: |
| 1291 | self.cancel_build_sync(True) | 1311 | self.cancel_build_sync(True) |
| 1312 | |||
| 1313 | def do_log(self, consolelogfile = None): | ||
| 1314 | if consolelogfile: | ||
| 1315 | if self.consolelog: | ||
| 1316 | self.logger.removeHandler(self.consolelog) | ||
| 1317 | self.consolelog = None | ||
| 1318 | self.consolelog = logging.FileHandler(consolelogfile) | ||
| 1319 | bb.msg.addDefaultlogFilter(self.consolelog) | ||
| 1320 | format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | ||
| 1321 | self.consolelog.setFormatter(format) | ||
| 1322 | |||
| 1323 | self.logger.addHandler(self.consolelog) \ No newline at end of file | ||
diff --git a/bitbake/lib/bb/ui/crumbs/hobeventhandler.py b/bitbake/lib/bb/ui/crumbs/hobeventhandler.py index a00fcd8eda..540dde0951 100644 --- a/bitbake/lib/bb/ui/crumbs/hobeventhandler.py +++ b/bitbake/lib/bb/ui/crumbs/hobeventhandler.py | |||
| @@ -390,6 +390,9 @@ class HobHandler(gobject.GObject): | |||
| 390 | def reset_build(self): | 390 | def reset_build(self): |
| 391 | self.build.reset() | 391 | self.build.reset() |
| 392 | 392 | ||
| 393 | def get_logfile(self): | ||
| 394 | return self.server.runCommand(["getVariable", "BB_CONSOLELOG"]) | ||
| 395 | |||
| 393 | def _remove_redundant(self, string): | 396 | def _remove_redundant(self, string): |
| 394 | ret = [] | 397 | ret = [] |
| 395 | for i in string.split(): | 398 | for i in string.split(): |
diff --git a/bitbake/lib/bb/ui/crumbs/imagedetailspage.py b/bitbake/lib/bb/ui/crumbs/imagedetailspage.py index 596fb851ec..40eb7a4540 100755 --- a/bitbake/lib/bb/ui/crumbs/imagedetailspage.py +++ b/bitbake/lib/bb/ui/crumbs/imagedetailspage.py | |||
| @@ -33,7 +33,7 @@ from bb.ui.crumbs.hig import CrumbsDialog | |||
| 33 | class ImageDetailsPage (HobPage): | 33 | class ImageDetailsPage (HobPage): |
| 34 | 34 | ||
| 35 | class DetailBox (gtk.EventBox): | 35 | class DetailBox (gtk.EventBox): |
| 36 | def __init__(self, widget = None, varlist = None, vallist = None, icon = None, button = None, color = HobColors.LIGHT_GRAY): | 36 | def __init__(self, widget = None, varlist = None, vallist = None, icon = None, button = None, button2=None, color = HobColors.LIGHT_GRAY): |
| 37 | gtk.EventBox.__init__(self) | 37 | gtk.EventBox.__init__(self) |
| 38 | 38 | ||
| 39 | # set color | 39 | # set color |
| @@ -72,7 +72,11 @@ class ImageDetailsPage (HobPage): | |||
| 72 | self.table.attach(self.line_widgets[varlist[index]], colid, 20, row, row + 1) | 72 | self.table.attach(self.line_widgets[varlist[index]], colid, 20, row, row + 1) |
| 73 | # pack the button on the right | 73 | # pack the button on the right |
| 74 | if button: | 74 | if button: |
| 75 | self.hbox.pack_end(button, expand=False, fill=False) | 75 | self.bbox = gtk.VBox() |
| 76 | self.bbox.pack_start(button, expand=True, fill=True) | ||
| 77 | if button2: | ||
| 78 | self.bbox.pack_start(button2, expand=True, fill=True) | ||
| 79 | self.hbox.pack_end(self.bbox, expand=False, fill=False) | ||
| 76 | 80 | ||
| 77 | def update_line_widgets(self, variable, value): | 81 | def update_line_widgets(self, variable, value): |
| 78 | if len(self.line_widgets) == 0: | 82 | if len(self.line_widgets) == 0: |
| @@ -164,8 +168,10 @@ class ImageDetailsPage (HobPage): | |||
| 164 | base_image = self.builder.recipe_model.get_selected_image() | 168 | base_image = self.builder.recipe_model.get_selected_image() |
| 165 | layers = self.builder.configuration.layers | 169 | layers = self.builder.configuration.layers |
| 166 | pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) | 170 | pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) |
| 171 | log_file = self.builder.current_logfile | ||
| 167 | else: | 172 | else: |
| 168 | pkg_num = "N/A" | 173 | pkg_num = "N/A" |
| 174 | log_file = None | ||
| 169 | 175 | ||
| 170 | # remove | 176 | # remove |
| 171 | for button_id, button in self.button_ids.items(): | 177 | for button_id, button in self.button_ids.items(): |
| @@ -243,11 +249,17 @@ class ImageDetailsPage (HobPage): | |||
| 243 | view_files_button = HobAltButton("View files") | 249 | view_files_button = HobAltButton("View files") |
| 244 | view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) | 250 | view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) |
| 245 | view_files_button.set_tooltip_text("Open the directory containing the image files") | 251 | view_files_button.set_tooltip_text("Open the directory containing the image files") |
| 246 | self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button) | 252 | view_log_button = None |
| 253 | if log_file: | ||
| 254 | view_log_button = HobAltButton("View log") | ||
| 255 | view_log_button.connect("clicked", self.view_log_clicked_cb, log_file) | ||
| 256 | view_log_button.set_tooltip_text("Open the building log files") | ||
| 257 | self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button, button2=view_log_button) | ||
| 247 | self.box_group_area.pack_start(self.image_detail, expand=False, fill=True) | 258 | self.box_group_area.pack_start(self.image_detail, expand=False, fill=True) |
| 248 | 259 | ||
| 249 | # The default kernel box for the qemu images | 260 | # The default kernel box for the qemu images |
| 250 | self.sel_kernel = "" | 261 | self.sel_kernel = "" |
| 262 | self.kernel_detail = None | ||
| 251 | if 'qemu' in image_name: | 263 | if 'qemu' in image_name: |
| 252 | self.sel_kernel = self.get_kernel_file_name() | 264 | self.sel_kernel = self.get_kernel_file_name() |
| 253 | 265 | ||
| @@ -315,12 +327,16 @@ class ImageDetailsPage (HobPage): | |||
| 315 | self.box_group_area.pack_start(self.details_bottom_buttons, expand=False, fill=False) | 327 | self.box_group_area.pack_start(self.details_bottom_buttons, expand=False, fill=False) |
| 316 | 328 | ||
| 317 | self.show_all() | 329 | self.show_all() |
| 318 | if not is_runnable: | 330 | if self.kernel_detail and (not is_runnable): |
| 319 | self.kernel_detail.hide() | 331 | self.kernel_detail.hide() |
| 320 | 332 | ||
| 321 | def view_files_clicked_cb(self, button, image_addr): | 333 | def view_files_clicked_cb(self, button, image_addr): |
| 322 | subprocess.call("xdg-open /%s" % image_addr, shell=True) | 334 | subprocess.call("xdg-open /%s" % image_addr, shell=True) |
| 323 | 335 | ||
| 336 | def view_log_clicked_cb(self, button, log_file): | ||
| 337 | if log_file: | ||
| 338 | os.system("xdg-open /%s" % log_file) | ||
| 339 | |||
| 324 | def refresh_package_detail_box(self, image_size): | 340 | def refresh_package_detail_box(self, image_size): |
| 325 | self.package_detail.update_line_widgets("Total image size: ", image_size) | 341 | self.package_detail.update_line_widgets("Total image size: ", image_size) |
| 326 | 342 | ||
diff --git a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py index 1b832eb633..d1015352f1 100755 --- a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py | |||
| @@ -143,8 +143,8 @@ class PackageSelectionPage (HobPage): | |||
| 143 | # add all into the dialog | 143 | # add all into the dialog |
| 144 | self.box_group_area.pack_start(self.ins, expand=True, fill=True) | 144 | self.box_group_area.pack_start(self.ins, expand=True, fill=True) |
| 145 | 145 | ||
| 146 | button_box = gtk.HBox(False, 6) | 146 | self.button_box = gtk.HBox(False, 6) |
| 147 | self.box_group_area.pack_start(button_box, expand=False, fill=False) | 147 | self.box_group_area.pack_start(self.button_box, expand=False, fill=False) |
| 148 | 148 | ||
| 149 | self.build_image_button = HobButton('Build image') | 149 | self.build_image_button = HobButton('Build image') |
| 150 | self.build_image_button.set_size_request(205, 49) | 150 | self.build_image_button.set_size_request(205, 49) |
| @@ -152,11 +152,11 @@ class PackageSelectionPage (HobPage): | |||
| 152 | self.build_image_button.set_flags(gtk.CAN_DEFAULT) | 152 | self.build_image_button.set_flags(gtk.CAN_DEFAULT) |
| 153 | self.build_image_button.grab_default() | 153 | self.build_image_button.grab_default() |
| 154 | self.build_image_button.connect("clicked", self.build_image_clicked_cb) | 154 | self.build_image_button.connect("clicked", self.build_image_clicked_cb) |
| 155 | button_box.pack_end(self.build_image_button, expand=False, fill=False) | 155 | self.button_box.pack_end(self.build_image_button, expand=False, fill=False) |
| 156 | 156 | ||
| 157 | self.back_button = HobAltButton("<< Back to image configuration") | 157 | self.back_button = HobAltButton("<< Back to image configuration") |
| 158 | self.back_button.connect("clicked", self.back_button_clicked_cb) | 158 | self.back_button.connect("clicked", self.back_button_clicked_cb) |
| 159 | button_box.pack_start(self.back_button, expand=False, fill=False) | 159 | self.button_box.pack_start(self.back_button, expand=False, fill=False) |
| 160 | 160 | ||
| 161 | def button_click_cb(self, widget, event): | 161 | def button_click_cb(self, widget, event): |
| 162 | path, col = widget.table_tree.get_cursor() | 162 | path, col = widget.table_tree.get_cursor() |
| @@ -166,6 +166,25 @@ class PackageSelectionPage (HobPage): | |||
| 166 | if binb: | 166 | if binb: |
| 167 | self.builder.show_binb_dialog(binb) | 167 | self.builder.show_binb_dialog(binb) |
| 168 | 168 | ||
| 169 | def view_log_clicked_cb(self, button, log_file): | ||
| 170 | if log_file: | ||
| 171 | os.system("xdg-open /%s" % log_file) | ||
| 172 | |||
| 173 | def show_page(self, log_file): | ||
| 174 | children = self.button_box.get_children() or [] | ||
| 175 | for child in children: | ||
| 176 | self.button_box.remove(child) | ||
| 177 | # re-packed the buttons as request, add the 'view log' button if build success | ||
| 178 | self.button_box.pack_start(self.back_button, expand=False, fill=False) | ||
| 179 | self.button_box.pack_end(self.build_image_button, expand=False, fill=False) | ||
| 180 | if log_file: | ||
| 181 | view_log_button = HobAltButton("View log") | ||
| 182 | view_log_button.connect("clicked", self.view_log_clicked_cb, log_file) | ||
| 183 | view_log_button.set_tooltip_text("Open the building log files") | ||
| 184 | self.button_box.pack_end(view_log_button, expand=False, fill=False) | ||
| 185 | |||
| 186 | self.show_all() | ||
| 187 | |||
| 169 | def build_image_clicked_cb(self, button): | 188 | def build_image_clicked_cb(self, button): |
| 170 | self.builder.build_image() | 189 | self.builder.build_image() |
| 171 | 190 | ||
diff --git a/bitbake/lib/bb/ui/crumbs/runningbuild.py b/bitbake/lib/bb/ui/crumbs/runningbuild.py index 0347058d7e..a57d6db5e5 100644 --- a/bitbake/lib/bb/ui/crumbs/runningbuild.py +++ b/bitbake/lib/bb/ui/crumbs/runningbuild.py | |||
| @@ -88,6 +88,9 @@ class RunningBuild (gobject.GObject): | |||
| 88 | 'no-provider' : (gobject.SIGNAL_RUN_LAST, | 88 | 'no-provider' : (gobject.SIGNAL_RUN_LAST, |
| 89 | gobject.TYPE_NONE, | 89 | gobject.TYPE_NONE, |
| 90 | (gobject.TYPE_PYOBJECT,)), | 90 | (gobject.TYPE_PYOBJECT,)), |
| 91 | 'log' : (gobject.SIGNAL_RUN_LAST, | ||
| 92 | gobject.TYPE_NONE, | ||
| 93 | (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,)), | ||
| 91 | } | 94 | } |
| 92 | pids_to_task = {} | 95 | pids_to_task = {} |
| 93 | tasks_to_iter = {} | 96 | tasks_to_iter = {} |
| @@ -126,6 +129,8 @@ class RunningBuild (gobject.GObject): | |||
| 126 | parent = self.tasks_to_iter[(package, task)] | 129 | parent = self.tasks_to_iter[(package, task)] |
| 127 | 130 | ||
| 128 | if(isinstance(event, logging.LogRecord)): | 131 | if(isinstance(event, logging.LogRecord)): |
| 132 | if event.taskpid == 0 or event.levelno > logging.INFO: | ||
| 133 | self.emit("log", "handle", event) | ||
| 129 | # FIXME: this is a hack! More info in Yocto #1433 | 134 | # FIXME: this is a hack! More info in Yocto #1433 |
| 130 | # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433, temporarily | 135 | # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433, temporarily |
| 131 | # mask the error message as it's not informative for the user. | 136 | # mask the error message as it's not informative for the user. |
| @@ -211,6 +216,7 @@ class RunningBuild (gobject.GObject): | |||
| 211 | self.tasks_to_iter[(package, task)] = i | 216 | self.tasks_to_iter[(package, task)] = i |
| 212 | 217 | ||
| 213 | elif isinstance(event, bb.build.TaskBase): | 218 | elif isinstance(event, bb.build.TaskBase): |
| 219 | self.emit("log", "info", event._message) | ||
| 214 | current = self.tasks_to_iter[(package, task)] | 220 | current = self.tasks_to_iter[(package, task)] |
| 215 | parent = self.tasks_to_iter[(package, None)] | 221 | parent = self.tasks_to_iter[(package, None)] |
| 216 | 222 | ||
| @@ -296,6 +302,7 @@ class RunningBuild (gobject.GObject): | |||
| 296 | self.buildaborted = True | 302 | self.buildaborted = True |
| 297 | 303 | ||
| 298 | elif isinstance(event, bb.command.CommandFailed): | 304 | elif isinstance(event, bb.command.CommandFailed): |
| 305 | self.emit("log", "error", "Command execution failed: %s" % (event.error)) | ||
| 299 | if event.error.startswith("Exited with"): | 306 | if event.error.startswith("Exited with"): |
| 300 | # If the command fails with an exit code we're done, emit the | 307 | # If the command fails with an exit code we're done, emit the |
| 301 | # generic signal for the UI to notify the user | 308 | # generic signal for the UI to notify the user |
| @@ -323,7 +330,24 @@ class RunningBuild (gobject.GObject): | |||
| 323 | elif isinstance(event, bb.event.ParseCompleted) and pbar: | 330 | elif isinstance(event, bb.event.ParseCompleted) and pbar: |
| 324 | pbar.hide() | 331 | pbar.hide() |
| 325 | #using runqueue events as many as possible to update the progress bar | 332 | #using runqueue events as many as possible to update the progress bar |
| 333 | elif isinstance(event, bb.runqueue.runQueueTaskFailed): | ||
| 334 | self.emit("log", "error", "Task %s (%s) failed with exit code '%s'" % (event.taskid, event.taskstring, event.exitcode)) | ||
| 335 | elif isinstance(event, bb.runqueue.sceneQueueTaskFailed): | ||
| 336 | self.emit("log", "warn", "Setscene task %s (%s) failed with exit code '%s' - real task will be run instead" \ | ||
| 337 | % (event.taskid, event.taskstring, event.exitcode)) | ||
| 326 | elif isinstance(event, (bb.runqueue.runQueueTaskStarted, bb.runqueue.sceneQueueTaskStarted)): | 338 | elif isinstance(event, (bb.runqueue.runQueueTaskStarted, bb.runqueue.sceneQueueTaskStarted)): |
| 339 | if isinstance(event, bb.runqueue.sceneQueueTaskStarted): | ||
| 340 | self.emit("log", "info", "Running setscene task %d of %d (%s)" % \ | ||
| 341 | (event.stats.completed + event.stats.active + event.stats.failed + 1, | ||
| 342 | event.stats.total, event.taskstring)) | ||
| 343 | else: | ||
| 344 | if event.noexec: | ||
| 345 | tasktype = 'noexec task' | ||
| 346 | else: | ||
| 347 | tasktype = 'task' | ||
| 348 | self.emit("log", "info", "Running %s %s of %s (ID: %s, %s)" % \ | ||
| 349 | (tasktype, event.stats.completed + event.stats.active + event.stats.failed + 1, | ||
| 350 | event.stats.total, event.taskid, event.taskstring)) | ||
| 327 | message = {} | 351 | message = {} |
| 328 | message["eventname"] = bb.event.getName(event) | 352 | message["eventname"] = bb.event.getName(event) |
| 329 | num_of_completed = event.stats.completed + event.stats.failed | 353 | num_of_completed = event.stats.completed + event.stats.failed |
| @@ -332,6 +356,10 @@ class RunningBuild (gobject.GObject): | |||
| 332 | message["title"] = "" | 356 | message["title"] = "" |
| 333 | message["task"] = event.taskstring | 357 | message["task"] = event.taskstring |
| 334 | self.emit("task-started", message) | 358 | self.emit("task-started", message) |
| 359 | elif isinstance(event, bb.event.MultipleProviders): | ||
| 360 | self.emit("log", "info", "multiple providers are available for %s%s (%s)" \ | ||
| 361 | % (event._is_runtime and "runtime " or "", event._item, ", ".join(event._candidates))) | ||
| 362 | self.emit("log", "info", "consider defining a PREFERRED_PROVIDER entry to match %s" % (event._item)) | ||
| 335 | elif isinstance(event, bb.event.NoProvider): | 363 | elif isinstance(event, bb.event.NoProvider): |
| 336 | msg = "" | 364 | msg = "" |
| 337 | if event._runtime: | 365 | if event._runtime: |
| @@ -346,6 +374,19 @@ class RunningBuild (gobject.GObject): | |||
| 346 | for reason in event._reasons: | 374 | for reason in event._reasons: |
| 347 | msg += ("%s\n" % reason) | 375 | msg += ("%s\n" % reason) |
| 348 | self.emit("no-provider", msg) | 376 | self.emit("no-provider", msg) |
| 377 | self.emit("log", msg) | ||
| 378 | else: | ||
| 379 | if not isinstance(event, (bb.event.BuildBase, | ||
| 380 | bb.event.StampUpdate, | ||
| 381 | bb.event.ConfigParsed, | ||
| 382 | bb.event.RecipeParsed, | ||
| 383 | bb.event.RecipePreFinalise, | ||
| 384 | bb.runqueue.runQueueEvent, | ||
| 385 | bb.runqueue.runQueueExitWait, | ||
| 386 | bb.event.OperationStarted, | ||
| 387 | bb.event.OperationCompleted, | ||
| 388 | bb.event.OperationProgress)): | ||
| 389 | self.emit("log", "error", "Unknown event: %s" % (event.error if hasattr(event, 'error') else 'error')) | ||
| 349 | 390 | ||
| 350 | return | 391 | return |
| 351 | 392 | ||
