Continue Hob fixes
cover Continue Hob fixes
The patches is to continue Shane Wang's previous submission to fix Hobs. They include:
- Replace an icon
- Add logs and allow users to retrieve the logs after successful build
- Misc fixes when testing
The following changes since commit f4b102cdf2cd021a0b5acacb034dd568a8e73817:
Hob: a minor fix on pmake (2012-04-02 16:25:56 +0800)
are available in the git repository at:
git://git.pokylinux.org/poky-contrib shane/hob-fixes-1
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=shane/hob-fixes-1
Shane Wang (4):
Hob: add the "info" indication icon for "information" in the dialogs.
Hob: log for Hob and allow users to show logs after successful build
Hob: remove grab_default() for deploy button
Hob: reset issue indication and build status before build starts on
build details screen
bitbake/lib/bb/ui/crumbs/builddetailspage.py | 3 + bitbake/lib/bb/ui/crumbs/builder.py | 38 +++++++++++++++--- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/hobwidget.py | 3 +- bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 15 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ bitbake/lib/bb/ui/icons/indicators/info.png | Bin 0 -> 3311 bytes 7 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 bitbake/lib/bb/ui/icons/indicators/info.png
Signature · 1 line
1.7.6
PATCH 1/4 Hob: add the "info" indication icon for "information" in the dialogs.
Previously we reused the info display file which is for indication of tooltips. But it is too small, when it is shown on the dialog as the dialog indication icon, it becomes unclear after being stretched out. So, we replace it with a larger icon.
--- bitbake/lib/bb/ui/crumbs/hobwidget.py | 3 ++- bitbake/lib/bb/ui/icons/indicators/info.png | Bin 0 -> 3311 bytes 2 files changed, 2 insertions(+), 1 deletions(-) create mode 100644 bitbake/lib/bb/ui/icons/indicators/info.png
bitbake/lib/bb/ui/crumbs/hobwidget.py +2 -1
@@ -60,6 +60,7 @@ class hic: ICON_INDI_REFRESH_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/refresh.png')) ICON_INDI_ALERT_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/alert.png')) ICON_INDI_TICK_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/tick.png')) + ICON_INDI_INFO_FILE = os.path.join(HOB_ICON_BASE_DIR, ('indicators/info.png')) class hcc:
@@ -826,7 +827,7 @@ class HobIconChecker(hic): """ def check_stock_icon(self, stock_name=""): HOB_CHECK_STOCK_NAME = { - ('hic-dialog-info', 'gtk-dialog-info', 'dialog-info') : self.ICON_INFO_DISPLAY_FILE, + ('hic-dialog-info', 'gtk-dialog-info', 'dialog-info') : self.ICON_INDI_INFO_FILE, ('hic-ok', 'gtk-ok', 'ok') : self.ICON_INDI_TICK_FILE, ('hic-dialog-error', 'gtk-dialog-error', 'dialog-error') : self.ICON_INDI_ERROR_FILE, ('hic-dialog-warning', 'gtk-dialog-warning', 'dialog-warning') : self.ICON_INDI_ALERT_FILE,
bitbake/lib/bb/ui/icons/indicators/info.png new file binary +0 -0
Signature · 1 line
1.7.6
PATCH 2/4 Hob: log for Hob and allow users to show logs after successful build
If users build images in Hob, record logs and allow users to retrieve the logs after successful build.
The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"
Only "build packages" will not write logs because there is no chance for users to retrieve on the GUI.
[Yocto #1991]
--- bitbake/lib/bb/ui/crumbs/builder.py | 36 +++++++++++++++-- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 14 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-)
bitbake/lib/bb/ui/crumbs/builder.py +32 -4
@@ -26,6 +26,7 @@ import copy import os import subprocess import shlex +import logging from bb.ui.crumbs.template import TemplateMgr from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage
@@ -260,6 +261,11 @@ class Builder(gtk.Window): self.template = None + # logger + self.logger = logging.getLogger("BitBake") + self.consolelog = None + self.current_logfile = None + # build step self.current_step = None self.previous_step = None
@@ -287,6 +293,7 @@ class Builder(gtk.Window): self.handler.build.connect("build-failed", self.handler_build_failed_cb) self.handler.build.connect("task-started", self.handler_task_started_cb) self.handler.build.connect("log-error", self.handler_build_failure_cb) + self.handler.build.connect("log", self.handler_build_log_cb) self.handler.connect("generating-data", self.handler_generating_data_cb) self.handler.connect("data-generated", self.handler_data_generated_cb) self.handler.connect("command-succeeded", self.handler_command_succeeded_cb)
@@ -396,7 +403,7 @@ class Builder(gtk.Window): elif next_step == self.PACKAGE_GENERATING or next_step == self.FAST_IMAGE_GENERATING: # both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page self.build_details_page.show_page(next_step) - self.generate_packages() + self.generate_packages(next_step == self.FAST_IMAGE_GENERATING) elif next_step == self.PACKAGE_GENERATED: pass
@@ -405,7 +412,7 @@ class Builder(gtk.Window): # after packages are generated, selected_packages need to # be updated in package_model per selected_image in recipe_model self.build_details_page.show_page(next_step) - self.generate_image() + self.generate_image(self.current_step == self.FAST_IMAGE_GENERATING) elif next_step == self.IMAGE_GENERATED: self.image_details_page.show_page(next_step)
@@ -454,7 +461,10 @@ class Builder(gtk.Window): left = self.package_model.set_selected_packages(selected_packages) self.configuration.selected_packages += left - def generate_packages(self): + def generate_packages(self, log = False): + if log: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build packages _, all_recipes = self.recipe_model.get_selected_recipes() self.set_user_config()
@@ -466,7 +476,10 @@ class Builder(gtk.Window): self.set_user_config() self.handler.generate_recipes() - def generate_image(self): + def generate_image(self, cont = False): + if not cont: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build image self.set_user_config() all_packages = self.package_model.get_selected_packages()
@@ -708,6 +721,10 @@ class Builder(gtk.Window): def handler_build_failure_cb(self, running_build): self.build_details_page.show_issues() + def handler_build_log_cb(self, running_build, func, obj): + if hasattr(self.logger, func): + getattr(self.logger, func)(obj) + def destroy_window_cb(self, widget, event): lbl = "<b>Do you really want to exit the Hob image creator?</b>" dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO)
@@ -1033,3 +1050,14 @@ class Builder(gtk.Window): self.handler.cancel_build() elif response == gtk.RESPONSE_YES: self.handler.cancel_build(True) + + def do_log(self, consolelogfile = None): + if consolelogfile: + if self.consolelog: + self.logger.removeHandler(self.consolelog) + self.consolelog = None + self.consolelog = logging.FileHandler(consolelogfile) + bb.msg.addDefaultlogFilter(self.consolelog) + format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + self.consolelog.setFormatter(format) + self.logger.addHandler(self.consolelog)
bitbake/lib/bb/ui/crumbs/hobeventhandler.py +3 -0
@@ -381,6 +381,9 @@ class HobHandler(gobject.GObject): def reset_build(self): self.build.reset() + def get_logfile(self): + return self.server.runCommand(["getVariable", "BB_CONSOLELOG"]) + def get_parameters(self): # retrieve the parameters from bitbake params = {}
bitbake/lib/bb/ui/crumbs/imagedetailspage.py +13 -1
@@ -159,8 +159,10 @@ class ImageDetailsPage (HobPage): machine = self.builder.configuration.curr_mach base_image = self.builder.recipe_model.get_selected_image() layers = self.builder.configuration.layers + log_file = self.builder.current_logfile pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) else: + log_file = None pkg_num = "N/A" self._remove_all_widget()
@@ -204,9 +206,15 @@ class ImageDetailsPage (HobPage): image_table = HobViewTable(self.__columns__) image_table.set_model(self.image_store) image_table.connect("toggled", self.toggled_cb) + view_buttons = gtk.VBox(False, 6) view_files_button = HobAltButton("View files") view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) - self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_files_button), expand=True, fill=True) + view_buttons.pack_start(view_files_button, expand=True, fill=True) + if log_file: + view_logs_button = HobAltButton("View logs") + view_logs_button.connect("clicked", self.view_logs_clicked_cb, log_file) + view_buttons.pack_end(view_logs_button, expand=True, fill=True) + self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_buttons), expand=True, fill=True) # Machine, Base image and Layers layer_num_limit = 15
@@ -258,6 +266,10 @@ class ImageDetailsPage (HobPage): def view_files_clicked_cb(self, button, image_addr): os.system("xdg-open /%s" % image_addr) + def view_logs_clicked_cb(self, button, log_file): + if log_file: + os.system("xdg-open /%s" % log_file) + def refresh_package_detail_box(self, image_size): self.package_detail.update_line_widgets("Total image size: ", image_size)
bitbake/lib/bb/ui/crumbs/runningbuild.py +53 -0
90 lines not on this page · raw message
Signature · 1 line
1.7.6
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Sorry: this was an omission on the design side. If deemed appropriate, we can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if this is something we should provide.
Cheers
Belen
Quoted 337 lines · Shane Wang
If users build images in Hob, record logs and allow users to retrieve the logs
after successful build.The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"Only "build packages" will not write logs because there is no chance for users
to retrieve on the GUI.[Yocto #1991]
Signed-off-by Shane Wang <[email protected]>---
bitbake/lib/bb/ui/crumbs/builder.py | 36 +++++++++++++++-- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 14 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -26,6 +26,7 @@ import copyimport os
import subprocess
import shlex
+import logging
from bb.ui.crumbs.template import TemplateMgr
from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPagebitbake/lib/bb/ui/crumbs/builder.py +6
-0@@ -260,6 +261,11 @@ class Builder(gtk.Window): self.template = None + # logger + self.logger = logging.getLogger("BitBake") + self.consolelog = None + self.current_logfile = None + # build step self.current_step = None self.previous_step = None@@ -287,6 +293,7 @@ class Builder(gtk.Window): self.handler.build.connect("build-failed", self.handler_build_failed_cb) self.handler.build.connect("task-started", self.handler_task_started_cb) self.handler.build.connect("log-error", self.handler_build_failure_cb) + self.handler.build.connect("log",self.handler_build_log_cb)
self.handler.connect("generating-data",
self.handler_generating_data_cb)
self.handler.connect("data-generated",
self.handler_data_generated_cb)
self.handler.connect("command-succeeded",
self.handler_command_succeeded_cb)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -396,7 +403,7 @@ class Builder(gtk.Window): elif next_step == self.PACKAGE_GENERATING or next_step ==self.FAST_IMAGE_GENERATING:
# both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_packages() + self.generate_packages(next_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.PACKAGE_GENERATED: passbitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -405,7 +412,7 @@ class Builder(gtk.Window): # after packages are generated, selected_packages need to # be updated in package_model per selected_image in
recipe_model
self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_image() + self.generate_image(self.current_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.IMAGE_GENERATED: self.image_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +4
-1@@ -454,7 +461,10 @@ class Builder(gtk.Window): left = self.package_model.set_selected_packages(selected_packages) self.configuration.selected_packages += left - def generate_packages(self): + def generate_packages(self, log = False): + if log: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build packages _, all_recipes = self.recipe_model.get_selected_recipes()
self.set_user_config()bitbake/lib/bb/ui/crumbs/builder.py +19
-1@@ -466,7 +476,10 @@ class Builder(gtk.Window): self.set_user_config() self.handler.generate_recipes() - def generate_image(self): + def generate_image(self, cont = False): + if not cont: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build image self.set_user_config() all_packages = self.package_model.get_selected_packages()@@ -708,6 +721,10 @@ class Builder(gtk.Window): def handler_build_failure_cb(self, running_build): self.build_details_page.show_issues() + def handler_build_log_cb(self, running_build, func, obj): + if hasattr(self.logger, func): + getattr(self.logger, func)(obj) + def destroy_window_cb(self, widget, event): lbl = "<b>Do you really want to exit the Hob image creator?</b>" dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO)@@ -1033,3 +1050,14 @@ class Builder(gtk.Window): self.handler.cancel_build() elif response == gtk.RESPONSE_YES: self.handler.cancel_build(True) + + def do_log(self, consolelogfile = None): + if consolelogfile: + if self.consolelog: + self.logger.removeHandler(self.consolelog) + self.consolelog = None + self.consolelog = logging.FileHandler(consolelogfile) + bb.msg.addDefaultlogFilter(self.consolelog) + format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + self.consolelog.setFormatter(format) + self.logger.addHandler(self.consolelog)bitbake/lib/bb/ui/crumbs/hobeventhandler.py +3
-0@@ -381,6 +381,9 @@ class HobHandler(gobject.GObject): def reset_build(self): self.build.reset() + def get_logfile(self): + return self.server.runCommand(["getVariable", "BB_CONSOLELOG"]) + def get_parameters(self): # retrieve the parameters from bitbake params = {}bitbake/lib/bb/ui/crumbs/imagedetailspage.py +2
-0@@ -159,8 +159,10 @@ class ImageDetailsPage (HobPage): machine = self.builder.configuration.curr_mach base_image = self.builder.recipe_model.get_selected_image() layers = self.builder.configuration.layers + log_file = self.builder.current_logfile pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) else: + log_file = None pkg_num = "N/A"
self._remove_all_widget()bitbake/lib/bb/ui/crumbs/imagedetailspage.py +2
-1@@ -204,9 +206,15 @@ class ImageDetailsPage (HobPage): image_table = HobViewTable(self.__columns__) image_table.set_model(self.image_store) image_table.connect("toggled", self.toggled_cb) + view_buttons = gtk.VBox(False, 6) view_files_button = HobAltButton("View files") view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) - self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_files_button), expand=True, fill=True) + view_buttons.pack_start(view_files_button, expand=True,fill=True)
bitbake/lib/bb/ui/crumbs/imagedetailspage.py +3
-0+ if log_file: + view_logs_button = HobAltButton("View logs") + view_logs_button.connect("clicked",self.view_logs_clicked_cb,
log_file)
+ view_buttons.pack_end(view_logs_button, expand=True,
fill=True)
+self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_buttons), expand=True, fill=True)# Machine, Base image and Layers
layer_num_limit= 15bitbake/lib/bb/ui/crumbs/imagedetailspage.py +4
-0@@ -258,6 +266,10 @@ class ImageDetailsPage (HobPage): def view_files_clicked_cb(self, button, image_addr): os.system("xdg-open /%s" % image_addr) + def view_logs_clicked_cb(self, button, log_file): + if log_file: + os.system("xdg-open /%s" % log_file) + def refresh_package_detail_box(self, image_size): self.package_detail.update_line_widgets("Total image size: ", image_size)bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -82,6 +82,9 @@ class RunningBuild (gobject.GObject): 'log-error' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), + 'log' : (gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,)), } pids_to_task = {}tasks_to_iter = {}bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -119,6 +122,8 @@ class RunningBuild (gobject.GObject): parent = self.tasks_to_iter[(package, task)] if(isinstance(event, logging.LogRecord)): + if event.taskpid == 0 or event.levelno > logging.INFO: + self.emit("log", "handle", event) # FIXME: this is a hack! More info in Yocto #1433 # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433,temporarily
# mask the error message as it's not informative for the user.bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -204,6 +209,7 @@ class RunningBuild (gobject.GObject): self.tasks_to_iter[(package, task)] = i elif isinstance(event, bb.build.TaskBase): + self.emit("log", "info", event._message) current = self.tasks_to_iter[(package, task)] parent = self.tasks_to_iter[(package, None)]@@ -284,6 +290,7 @@ class RunningBuild (gobject.GObject): pbar.set_text(event.msg) elif isinstance(event, bb.command.CommandFailed): + self.emit("log", "error", "Command execution failed: %s" % (event.error)) if event.error.startswith("Exited with"): # If the command fails with an exit code we're done,emit the
# generic signal for the UI to notify the userbitbake/lib/bb/ui/crumbs/runningbuild.py +0
-0@@ -311,7 +318,41 @@ class RunningBuild (gobject.GObject): elif isinstance(event, bb.event.ParseCompleted) and pbar: pbar.hide() #using runqueue events as many as possible to update theprogress bar
bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ elif isinstance(event, bb.event.MultipleProviders): + self.emit("log", "info", "multiple providers are availablefor %s%s (%s)" \
+ % (event._is_runtime and "runtime "
or "", event._item, ", ".join(event._candidates)))
+ self.emit("log", "info", "consider defining aPREFERRED_PROVIDERentry to match %s" % (event._item))bitbake/lib/bb/ui/crumbs/runningbuild.py +7
-0+ elif isinstance(event, bb.event.NoProvider): + if event._runtime: + r = "R" + else: + r = "" + if event._dependees: + self.emit("log", "error", "Nothing %sPROVIDES '%s' (but%s %sDEPENDS on or otherwise requires it)" \
+ % (r, event._item, ",
".join(event._dependees), r))bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ else: + self.emit("log", "error", "Nothing %sPROVIDES '%s'" %(r, event._item))
bitbake/lib/bb/ui/crumbs/runningbuild.py +5
-0+ if event._reasons: + for reason in event._reasons: + self.emit("log", "error", "%s" % (reason)) + elif isinstance(event, bb.runqueue.runQueueTaskFailed): + self.emit("log", "error", "Task %s (%s) failed with exitcode '%s'" % (event.taskid, event.taskstring, event.exitcode))
bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ elif isinstance(event, bb.runqueue.sceneQueueTaskFailed): + self.emit("log", "warn", "Setscene task %s (%s) failed withexit code '%s' - real task will be run instead" \
+ % (event.taskid, event.taskstring,
event.exitcode))
elif isinstance(event, (bb.runqueue.runQueueTaskStarted,
bb.runqueue.sceneQueueTaskStarted)):bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ if isinstance(event, bb.runqueue.sceneQueueTaskStarted): + self.emit("log", "info", "Running setscene task %d of %d(%s)" % \
+ (event.stats.completed +
event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskstring))bitbake/lib/bb/ui/crumbs/runningbuild.py +6
-0+ else: + if event.noexec: + tasktype = 'noexec task' + else: + tasktype = 'task' + self.emit("log", "info", "Running %s %s of %s (ID: %s,%s)" % \
+ (tasktype,
event.stats.completed + event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskid, event.taskstring))
message = {}
message["eventname"] =bb.event.getName(event)num_of_completed= event.stats.completed + event.stats.failedbitbake/lib/bb/ui/crumbs/runningbuild.py +12
-0@@ -320,6 +361,18 @@ class RunningBuild (gobject.GObject): message["title"] = "" message["task"] = event.taskstring self.emit("task-started", message) + else: + if not isinstance(event, (bb.event.BuildBase, + bb.event.StampUpdate, + bb.event.ConfigParsed, + bb.event.RecipeParsed, + bb.event.RecipePreFinalise, + bb.runqueue.runQueueEvent, + bb.runqueue.runQueueExitWait, + bb.event.OperationStarted, + bb.event.OperationCompleted, + bb.event.OperationProgress)): + self.emit("log", "error", "Unknown event: %s" % (error)) returnSignature · 7 lines
1.7.6 _______________________________________________ bitbake-devel mailing list [email protected] http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
---------------------------------------------------------------------
Intel Corporation (UK) Limited
Registered No. 1134945 (England)
Registered Office: Pipers Way, Swindon SN3 1RJ
VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Do you mean the image details screen is too busy with "View logs"? It was designed by Giulia.
Retrieving the packages build log in the packages screen is not good because the log is also for "build image"
--
Shane
Barros Pena, Belen wrote on 2012-04-03:
Quoted 9 lines
Sorry: this was an omission on the design side. If deemed appropriate, we can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if this is something we should provide.
Cheers
Belen
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Sorry Shane: on your previous email you said
Quoted 2 lines
Only "build packages" will not write logs because there is no chance for Users to retrieve on the GUI.
From the above I understood build packages and build images would normally create two separate logs, but you were changing that purely because there is no option in Hob to retrieve the build packages log. So I offered to provide an option in the Packages screen that would allow people to retrieve such log, if Jessica, who reported the bug, deemed it appropriate.
If I understood incorrectly just ignore my comment.
Cheers
Belen
Quoted 22 lines · Shane
Do you mean the image details screen is too busy with "View logs"? It was designed by Giulia.
Retrieving the packages build log in the packages screen is not good because the log is also for "build image"
--
ShaneBarros Pena, Belen wrote on 2012-04-03:
Quoted 11 lines
Sorry: this was an omission on the design side. If deemed appropriate, we
can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if
this is something we should provide.Cheers
Belen
---------------------------------------------------------------------
Intel Corporation (UK) Limited
Registered No. 1134945 (England)
Registered Office: Pipers Way, Swindon SN3 1RJ
VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
In reply to Barros Pena, BelenHi Belen,
I'd expect user to be able to retrieve all logs, image or package.
Thanks,
Jessica
-----Original Message-----
From: Barros Pena, Belen
Sent: Tuesday, April 03, 2012 2:25 AM
To: Wang, Shane; [email protected]
Cc: Zhang, Jessica; Giulia Piu
Subject: Re: [bitbake-devel] [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Sorry: this was an omission on the design side. If deemed appropriate, we can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if this is something we should provide.
Cheers
Belen
Quoted 342 lines · Shane Wang
If users build images in Hob, record logs and allow users to retrieve the logs after successful build.
The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"Only "build packages" will not write logs because there is no chance for users to retrieve on the GUI.
[Yocto #1991]
Signed-off-by Shane Wang <[email protected]>---
bitbake/lib/bb/ui/crumbs/builder.py | 36 +++++++++++++++-- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 14 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -26,6 +26,7 @@ import copyimport os
import subprocess
import shlex
+import logging
from bb.ui.crumbs.template import TemplateMgr from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage @@ -260,6 +261,11 @@ class Builder(gtk.Window):self.template = None
bitbake/lib/bb/ui/crumbs/builder.py +6
-0+ # logger + self.logger = logging.getLogger("BitBake") + self.consolelog = None + self.current_logfile = None + # build step self.current_step = None self.previous_step = None@@ -287,6 +293,7 @@ class Builder(gtk.Window): self.handler.build.connect("build-failed", self.handler_build_failed_cb) self.handler.build.connect("task-started", self.handler_task_started_cb) self.handler.build.connect("log-error", self.handler_build_failure_cb) + self.handler.build.connect("log",self.handler_build_log_cb)
self.handler.connect("generating-data",
self.handler_generating_data_cb)
self.handler.connect("data-generated",
self.handler_data_generated_cb)
self.handler.connect("command-succeeded",
self.handler_command_succeeded_cb)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -396,7 +403,7 @@ class Builder(gtk.Window): elif next_step == self.PACKAGE_GENERATING or next_step ==self.FAST_IMAGE_GENERATING:
# both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_packages() + self.generate_packages(next_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.PACKAGE_GENERATED: passbitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -405,7 +412,7 @@ class Builder(gtk.Window): # after packages are generated, selected_packages need to # be updated in package_model per selected_image in
recipe_model
self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_image() + self.generate_image(self.current_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.IMAGE_GENERATED: self.image_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +4
-1@@ -454,7 +461,10 @@ class Builder(gtk.Window): left = self.package_model.set_selected_packages(selected_packages) self.configuration.selected_packages += left - def generate_packages(self): + def generate_packages(self, log = False): + if log: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build packages _, all_recipes = self.recipe_model.get_selected_recipes()
self.set_user_config()bitbake/lib/bb/ui/crumbs/builder.py +19
-1@@ -466,7 +476,10 @@ class Builder(gtk.Window): self.set_user_config() self.handler.generate_recipes() - def generate_image(self): + def generate_image(self, cont = False): + if not cont: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build image self.set_user_config() all_packages = self.package_model.get_selected_packages()@@ -708,6 +721,10 @@ class Builder(gtk.Window): def handler_build_failure_cb(self, running_build): self.build_details_page.show_issues() + def handler_build_log_cb(self, running_build, func, obj): + if hasattr(self.logger, func): + getattr(self.logger, func)(obj) + def destroy_window_cb(self, widget, event): lbl = "<b>Do you really want to exit the Hob image creator?</b>" dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO)@@ -1033,3 +1050,14 @@ class Builder(gtk.Window): self.handler.cancel_build() elif response == gtk.RESPONSE_YES: self.handler.cancel_build(True) + + def do_log(self, consolelogfile = None): + if consolelogfile: + if self.consolelog: + self.logger.removeHandler(self.consolelog) + self.consolelog = None + self.consolelog = logging.FileHandler(consolelogfile) + bb.msg.addDefaultlogFilter(self.consolelog) + format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + self.consolelog.setFormatter(format) + self.logger.addHandler(self.consolelog)bitbake/lib/bb/ui/crumbs/hobeventhandler.py +4
-0@@ -381,6 +381,9 @@ class HobHandler(gobject.GObject): def reset_build(self): self.build.reset() + def get_logfile(self): + return self.server.runCommand(["getVariable", + "BB_CONSOLELOG"]) + def get_parameters(self): # retrieve the parameters from bitbake params = {}bitbake/lib/bb/ui/crumbs/imagedetailspage.py +2
-0@@ -159,8 +159,10 @@ class ImageDetailsPage (HobPage): machine = self.builder.configuration.curr_mach base_image = self.builder.recipe_model.get_selected_image() layers = self.builder.configuration.layers + log_file = self.builder.current_logfile pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) else: + log_file = None pkg_num = "N/A"
self._remove_all_widget()bitbake/lib/bb/ui/crumbs/imagedetailspage.py +1
-1@@ -204,9 +206,15 @@ class ImageDetailsPage (HobPage): image_table = HobViewTable(self.__columns__) image_table.set_model(self.image_store) image_table.connect("toggled", self.toggled_cb) + view_buttons = gtk.VBox(False, 6) view_files_button = HobAltButton("View files") view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) - self.box_group_area.pack_start(self.DetailBox(widget=image_table,button=view_files_button), expand=True, fill=True)
+ view_buttons.pack_start(view_files_button, expand=True,
fill=True)bitbake/lib/bb/ui/crumbs/imagedetailspage.py +3
-0+ if log_file: + view_logs_button = HobAltButton("View logs") + view_logs_button.connect("clicked",self.view_logs_clicked_cb,
log_file)
+ view_buttons.pack_end(view_logs_button, expand=True,
fill=True)
+self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_buttons), expand=True, fill=True)# Machine, Base image and Layers
layer_num_limit= 15bitbake/lib/bb/ui/crumbs/imagedetailspage.py +4
-0@@ -258,6 +266,10 @@ class ImageDetailsPage (HobPage): def view_files_clicked_cb(self, button, image_addr): os.system("xdg-open /%s" % image_addr) + def view_logs_clicked_cb(self, button, log_file): + if log_file: + os.system("xdg-open /%s" % log_file) + def refresh_package_detail_box(self, image_size): self.package_detail.update_line_widgets("Total image size: ", image_size)bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -82,6 +82,9 @@ class RunningBuild (gobject.GObject): 'log-error' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), + 'log' : (gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,)), } pids_to_task = {}tasks_to_iter = {}bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -119,6 +122,8 @@ class RunningBuild (gobject.GObject): parent = self.tasks_to_iter[(package, task)] if(isinstance(event, logging.LogRecord)): + if event.taskpid == 0 or event.levelno > logging.INFO: + self.emit("log", "handle", event) # FIXME: this is a hack! More info in Yocto #1433 # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433,temporarily
# mask the error message as it's not informative for the user.bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -204,6 +209,7 @@ class RunningBuild (gobject.GObject): self.tasks_to_iter[(package, task)] = i elif isinstance(event, bb.build.TaskBase): + self.emit("log", "info", event._message) current = self.tasks_to_iter[(package, task)] parent = self.tasks_to_iter[(package, None)]@@ -284,6 +290,7 @@ class RunningBuild (gobject.GObject): pbar.set_text(event.msg) elif isinstance(event, bb.command.CommandFailed): + self.emit("log", "error", "Command execution failed: %s" % (event.error)) if event.error.startswith("Exited with"): # If the command fails with an exit code we're done,emit the
# generic signal for the UI to notify the user @@ -311,7 +318,41 @@ class RunningBuild (gobject.GObject): elif isinstance(event, bb.event.ParseCompleted) and pbar: pbar.hide() #using runqueue events as many as possible to update the progress barbitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ elif isinstance(event, bb.event.MultipleProviders): + self.emit("log", "info", "multiple providers are availablefor %s%s (%s)" \
+ % (event._is_runtime and "runtime "
or "", event._item, ", ".join(event._candidates)))
+ self.emit("log", "info", "consider defining aPREFERRED_PROVIDERentry to match %s" % (event._item))bitbake/lib/bb/ui/crumbs/runningbuild.py +8
-0+ elif isinstance(event, bb.event.NoProvider): + if event._runtime: + r = "R" + else: + r = "" + if event._dependees: + self.emit("log", "error", "Nothing %sPROVIDES '%s' + (but%s %sDEPENDS on or otherwise requires it)" \
+ % (r, event._item, ",
".join(event._dependees), r))bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ else: + self.emit("log", "error", "Nothing %sPROVIDES '%s'" %(r, event._item))
bitbake/lib/bb/ui/crumbs/runningbuild.py +5
-0+ if event._reasons: + for reason in event._reasons: + self.emit("log", "error", "%s" % (reason)) + elif isinstance(event, bb.runqueue.runQueueTaskFailed): + self.emit("log", "error", "Task %s (%s) failed with exitcode '%s'" % (event.taskid, event.taskstring, event.exitcode))
bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ elif isinstance(event, bb.runqueue.sceneQueueTaskFailed): + self.emit("log", "warn", "Setscene task %s (%s) failed + withexit code '%s' - real task will be run instead" \
+ % (event.taskid,
+ event.taskstring,
event.exitcode))
elif isinstance(event, (bb.runqueue.runQueueTaskStarted,
bb.runqueue.sceneQueueTaskStarted)):bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ if isinstance(event, bb.runqueue.sceneQueueTaskStarted): + self.emit("log", "info", "Running setscene task %d of + %d(%s)" % \
+ (event.stats.completed +
event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskstring))bitbake/lib/bb/ui/crumbs/runningbuild.py +6
-0+ else: + if event.noexec: + tasktype = 'noexec task' + else: + tasktype = 'task' + self.emit("log", "info", "Running %s %s of %s (ID: %s,%s)" % \
+ (tasktype,
event.stats.completed + event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskid, event.taskstring))
message = {}
message["eventname"] =bb.event.getName(event)num_of_completed= event.stats.completed +
event.stats.failed @@ -320,6 +361,18 @@ class RunningBuild (gobject.GObject):
message["title"] = ""
message["task"] = event.taskstringself.emit("task-started", message)bitbake/lib/bb/ui/crumbs/runningbuild.py +13
-1+ else: + if not isinstance(event, (bb.event.BuildBase, + bb.event.StampUpdate, + bb.event.ConfigParsed, + bb.event.RecipeParsed, + bb.event.RecipePreFinalise, + bb.runqueue.runQueueEvent, + bb.runqueue.runQueueExitWait, + bb.event.OperationStarted, + bb.event.OperationCompleted, + bb.event.OperationProgress)): + self.emit("log", "error", "Unknown event: %s" % + (error)) return --1.7.6
_______________________________________________
bitbake-devel mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Sorry, guys. Now I am confused. Are the following assumptions correct?
1. Building packages via Hob will generate a log file stored somewhere in the YP directory
2. Building an image via Hob will generate a log file stored somewhere in the YP directory
3. The above logs are two separate files
Assuming the above is correct we need:
1. A 'View log' button in the Image details screen to access the building image log file
2. A 'View log' button in the Packages screen to access the building packages log file
Let me know if the above makes sense.
Thanks,
Belen
Quoted 362 lines · Jessica
Hi Belen,
I'd expect user to be able to retrieve all logs, image or package.
Thanks,
Jessica-----Original Message-----
From: Barros Pena, Belen
Sent: Tuesday, April 03, 2012 2:25 AM
To: Wang, Shane; [email protected]
Cc: Zhang, Jessica; Giulia Piu
Subject: Re: [bitbake-devel] [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful buildSorry: this was an omission on the design side. If deemed appropriate, we can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if this is something we should provide.
Cheers
Belen
Quoted 335 lines · Shane Wang
If users build images in Hob, record logs and allow users to retrieve the logs after successful build.
The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"Only "build packages" will not write logs because there is no chance for users to retrieve on the GUI.
[Yocto #1991]
Signed-off-by Shane Wang <[email protected]>---
bitbake/lib/bb/ui/crumbs/builder.py | 36 +++++++++++++++-- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 14 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -26,6 +26,7 @@ import copyimport os
import subprocess
import shlex
+import logging
from bb.ui.crumbs.template import TemplateMgr from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage @@ -260,6 +261,11 @@ class Builder(gtk.Window):self.template = None
bitbake/lib/bb/ui/crumbs/builder.py +6
-0+ # logger + self.logger = logging.getLogger("BitBake") + self.consolelog = None + self.current_logfile = None + # build step self.current_step = None self.previous_step = None@@ -287,6 +293,7 @@ class Builder(gtk.Window): self.handler.build.connect("build-failed", self.handler_build_failed_cb) self.handler.build.connect("task-started", self.handler_task_started_cb) self.handler.build.connect("log-error", self.handler_build_failure_cb) + self.handler.build.connect("log",self.handler_build_log_cb)
self.handler.connect("generating-data",
self.handler_generating_data_cb)
self.handler.connect("data-generated",
self.handler_data_generated_cb)
self.handler.connect("command-succeeded",
self.handler_command_succeeded_cb)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -396,7 +403,7 @@ class Builder(gtk.Window): elif next_step == self.PACKAGE_GENERATING or next_step ==self.FAST_IMAGE_GENERATING:
# both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_packages() + self.generate_packages(next_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.PACKAGE_GENERATED: passbitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -405,7 +412,7 @@ class Builder(gtk.Window): # after packages are generated, selected_packages need to # be updated in package_model per selected_image in
recipe_model
self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_image() + self.generate_image(self.current_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.IMAGE_GENERATED: self.image_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +4
-1@@ -454,7 +461,10 @@ class Builder(gtk.Window): left = self.package_model.set_selected_packages(selected_packages) self.configuration.selected_packages += left - def generate_packages(self): + def generate_packages(self, log = False): + if log: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build packages _, all_recipes = self.recipe_model.get_selected_recipes()
self.set_user_config()bitbake/lib/bb/ui/crumbs/builder.py +19
-1@@ -466,7 +476,10 @@ class Builder(gtk.Window): self.set_user_config() self.handler.generate_recipes() - def generate_image(self): + def generate_image(self, cont = False): + if not cont: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build image self.set_user_config() all_packages = self.package_model.get_selected_packages()@@ -708,6 +721,10 @@ class Builder(gtk.Window): def handler_build_failure_cb(self, running_build): self.build_details_page.show_issues() + def handler_build_log_cb(self, running_build, func, obj): + if hasattr(self.logger, func): + getattr(self.logger, func)(obj) + def destroy_window_cb(self, widget, event): lbl = "<b>Do you really want to exit the Hob image creator?</b>" dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO)@@ -1033,3 +1050,14 @@ class Builder(gtk.Window): self.handler.cancel_build() elif response == gtk.RESPONSE_YES: self.handler.cancel_build(True) + + def do_log(self, consolelogfile = None): + if consolelogfile: + if self.consolelog: + self.logger.removeHandler(self.consolelog) + self.consolelog = None + self.consolelog = logging.FileHandler(consolelogfile) + bb.msg.addDefaultlogFilter(self.consolelog) + format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + self.consolelog.setFormatter(format) + self.logger.addHandler(self.consolelog)bitbake/lib/bb/ui/crumbs/hobeventhandler.py +4
-0@@ -381,6 +381,9 @@ class HobHandler(gobject.GObject): def reset_build(self): self.build.reset() + def get_logfile(self): + return self.server.runCommand(["getVariable", + "BB_CONSOLELOG"]) + def get_parameters(self): # retrieve the parameters from bitbake params = {}bitbake/lib/bb/ui/crumbs/imagedetailspage.py +2
-0@@ -159,8 +159,10 @@ class ImageDetailsPage (HobPage): machine = self.builder.configuration.curr_mach base_image = self.builder.recipe_model.get_selected_image() layers = self.builder.configuration.layers + log_file = self.builder.current_logfile pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) else: + log_file = None pkg_num = "N/A"
self._remove_all_widget()bitbake/lib/bb/ui/crumbs/imagedetailspage.py +1
-1@@ -204,9 +206,15 @@ class ImageDetailsPage (HobPage): image_table = HobViewTable(self.__columns__) image_table.set_model(self.image_store) image_table.connect("toggled", self.toggled_cb) + view_buttons = gtk.VBox(False, 6) view_files_button = HobAltButton("View files") view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) - self.box_group_area.pack_start(self.DetailBox(widget=image_table,button=view_files_button), expand=True, fill=True)
+ view_buttons.pack_start(view_files_button, expand=True,
fill=True)bitbake/lib/bb/ui/crumbs/imagedetailspage.py +3
-0+ if log_file: + view_logs_button = HobAltButton("View logs") + view_logs_button.connect("clicked",self.view_logs_clicked_cb,
log_file)
+ view_buttons.pack_end(view_logs_button, expand=True,
fill=True)
+self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_buttons), expand=True, fill=True)# Machine, Base image and Layers
layer_num_limit= 15bitbake/lib/bb/ui/crumbs/imagedetailspage.py +4
-0@@ -258,6 +266,10 @@ class ImageDetailsPage (HobPage): def view_files_clicked_cb(self, button, image_addr): os.system("xdg-open /%s" % image_addr) + def view_logs_clicked_cb(self, button, log_file): + if log_file: + os.system("xdg-open /%s" % log_file) + def refresh_package_detail_box(self, image_size): self.package_detail.update_line_widgets("Total image size: ", image_size)bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -82,6 +82,9 @@ class RunningBuild (gobject.GObject): 'log-error' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), + 'log' : (gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,)), } pids_to_task = {}tasks_to_iter = {}bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -119,6 +122,8 @@ class RunningBuild (gobject.GObject): parent = self.tasks_to_iter[(package, task)] if(isinstance(event, logging.LogRecord)): + if event.taskpid == 0 or event.levelno > logging.INFO: + self.emit("log", "handle", event) # FIXME: this is a hack! More info in Yocto #1433 # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433,temporarily
# mask the error message as it's not informative for the user.bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -204,6 +209,7 @@ class RunningBuild (gobject.GObject): self.tasks_to_iter[(package, task)] = i elif isinstance(event, bb.build.TaskBase): + self.emit("log", "info", event._message) current = self.tasks_to_iter[(package, task)] parent = self.tasks_to_iter[(package, None)]@@ -284,6 +290,7 @@ class RunningBuild (gobject.GObject): pbar.set_text(event.msg) elif isinstance(event, bb.command.CommandFailed): + self.emit("log", "error", "Command execution failed: %s" % (event.error)) if event.error.startswith("Exited with"): # If the command fails with an exit code we're done,emit the
# generic signal for the UI to notify the user @@ -311,7 +318,41 @@ class RunningBuild (gobject.GObject): elif isinstance(event, bb.event.ParseCompleted) and pbar: pbar.hide() #using runqueue events as many as possible to update the progress barbitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ elif isinstance(event, bb.event.MultipleProviders): + self.emit("log", "info", "multiple providers are availablefor %s%s (%s)" \
+ % (event._is_runtime and "runtime "
or "", event._item, ", ".join(event._candidates)))
+ self.emit("log", "info", "consider defining aPREFERRED_PROVIDERentry to match %s" % (event._item))bitbake/lib/bb/ui/crumbs/runningbuild.py +8
-0+ elif isinstance(event, bb.event.NoProvider): + if event._runtime: + r = "R" + else: + r = "" + if event._dependees: + self.emit("log", "error", "Nothing %sPROVIDES '%s' + (but%s %sDEPENDS on or otherwise requires it)" \
+ % (r, event._item, ",
".join(event._dependees), r))bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ else: + self.emit("log", "error", "Nothing %sPROVIDES '%s'" %(r, event._item))
bitbake/lib/bb/ui/crumbs/runningbuild.py +5
-0+ if event._reasons: + for reason in event._reasons: + self.emit("log", "error", "%s" % (reason)) + elif isinstance(event, bb.runqueue.runQueueTaskFailed): + self.emit("log", "error", "Task %s (%s) failed with exitcode '%s'" % (event.taskid, event.taskstring, event.exitcode))
bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ elif isinstance(event, bb.runqueue.sceneQueueTaskFailed): + self.emit("log", "warn", "Setscene task %s (%s) failed + withexit code '%s' - real task will be run instead" \
+ % (event.taskid,
+ event.taskstring,
event.exitcode))
elif isinstance(event, (bb.runqueue.runQueueTaskStarted,
bb.runqueue.sceneQueueTaskStarted)):bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ if isinstance(event, bb.runqueue.sceneQueueTaskStarted): + self.emit("log", "info", "Running setscene task %d of + %d(%s)" % \
+ (event.stats.completed +
event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskstring))bitbake/lib/bb/ui/crumbs/runningbuild.py +6
-0+ else: + if event.noexec: + tasktype = 'noexec task' + else: + tasktype = 'task' + self.emit("log", "info", "Running %s %s of %s (ID: %s,%s)" % \
+ (tasktype,
event.stats.completed + event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskid, event.taskstring))
message = {}
message["eventname"] =bb.event.getName(event)num_of_completed= event.stats.completed +
event.stats.failed @@ -320,6 +361,18 @@ class RunningBuild (gobject.GObject):
message["title"] = ""
message["task"] = event.taskstringself.emit("task-started", message)bitbake/lib/bb/ui/crumbs/runningbuild.py +13
-0+ else: + if not isinstance(event, (bb.event.BuildBase, + bb.event.StampUpdate, + bb.event.ConfigParsed, + bb.event.RecipeParsed, + bb.event.RecipePreFinalise, + bb.runqueue.runQueueEvent, + bb.runqueue.runQueueExitWait, + bb.event.OperationStarted, + bb.event.OperationCompleted, + bb.event.OperationProgress)): + self.emit("log", "error", "Unknown event: %s" % + (error)) return
Quoted 9 lines
Quoted 8 lines
--
1.7.6_______________________________________________
bitbake-devel mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
---------------------------------------------------------------------
Intel Corporation (UK) Limited
Registered No. 1134945 (England)
Registered Office: Pipers Way, Swindon SN3 1RJ
VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Hi Belen,
I've talked with Shane to clarify all the different scenarios of log contents, so we have following combinations:
1. User build an image which includes build packages. In this case the log will show the build info for both packages and image
2. User just build packages. In this case the log will show build package info only.
3. User has previous build packages then do image customization and build the image. Then the log will contain build image info.
I think if we have a retrieve log button after both build image and build packages, we should be able to cover all the above scenarios with the corresponding log content.
Thanks,
Jessica
-----Original Message-----
From: Barros Pena, Belen
Sent: Wednesday, April 04, 2012 9:44 AM
To: Zhang, Jessica; Wang, Shane; [email protected]
Cc: Giulia Piu
Subject: Re: [bitbake-devel] [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Sorry, guys. Now I am confused. Are the following assumptions correct?
1. Building packages via Hob will generate a log file stored somewhere in the YP directory 2. Building an image via Hob will generate a log file stored somewhere in the YP directory 3. The above logs are two separate files
Assuming the above is correct we need:
1. A 'View log' button in the Image details screen to access the building image log file 2. A 'View log' button in the Packages screen to access the building packages log file
Let me know if the above makes sense.
Thanks,
Belen
Quoted 375 lines · Jessica
Hi Belen,
I'd expect user to be able to retrieve all logs, image or package.
Thanks,
Jessica-----Original Message-----
From: Barros Pena, Belen
Sent: Tuesday, April 03, 2012 2:25 AM
To: Wang, Shane; [email protected]
Cc: Zhang, Jessica; Giulia Piu
Subject: Re: [bitbake-devel] [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful buildSorry: this was an omission on the design side. If deemed appropriate, we can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if this is something we should provide.
Cheers
Belen
Quoted 347 lines · Shane Wang
If users build images in Hob, record logs and allow users to retrieve the logs after successful build.
The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"Only "build packages" will not write logs because there is no chance for users to retrieve on the GUI.
[Yocto #1991]
Signed-off-by Shane Wang <[email protected]>---
bitbake/lib/bb/ui/crumbs/builder.py | 36 +++++++++++++++-- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 14 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -26,6 +26,7 @@ import copyimport os
import subprocess
import shlex
+import logging
from bb.ui.crumbs.template import TemplateMgr from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage @@ -260,6
+261,11 @@ class Builder(gtk.Window):self.template = None
bitbake/lib/bb/ui/crumbs/builder.py +6
-0+ # logger + self.logger = logging.getLogger("BitBake") + self.consolelog = None + self.current_logfile = None + # build step self.current_step = None self.previous_step = None@@ -287,6 +293,7 @@ class Builder(gtk.Window): self.handler.build.connect("build-failed", self.handler_build_failed_cb) self.handler.build.connect("task-started", self.handler_task_started_cb) self.handler.build.connect("log-error", self.handler_build_failure_cb) + self.handler.build.connect("log",self.handler_build_log_cb)
self.handler.connect("generating-data",
self.handler_generating_data_cb)
self.handler.connect("data-generated",
self.handler_data_generated_cb)
self.handler.connect("command-succeeded",
self.handler_command_succeeded_cb)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -396,7 +403,7 @@ class Builder(gtk.Window): elif next_step == self.PACKAGE_GENERATING or next_step ==self.FAST_IMAGE_GENERATING:
# both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_packages() + self.generate_packages(next_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.PACKAGE_GENERATED: passbitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -405,7 +412,7 @@ class Builder(gtk.Window): # after packages are generated, selected_packages need to # be updated in package_model per selected_image in
recipe_model
self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_image() + self.generate_image(self.current_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.IMAGE_GENERATED: self.image_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +4
-1@@ -454,7 +461,10 @@ class Builder(gtk.Window): left = self.package_model.set_selected_packages(selected_packages) self.configuration.selected_packages += left - def generate_packages(self): + def generate_packages(self, log = False): + if log: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build packages _, all_recipes = self.recipe_model.get_selected_recipes()
self.set_user_config()bitbake/lib/bb/ui/crumbs/builder.py +8
-1@@ -466,7 +476,10 @@ class Builder(gtk.Window): self.set_user_config() self.handler.generate_recipes() - def generate_image(self): + def generate_image(self, cont = False): + if not cont: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build image self.set_user_config() all_packages = self.package_model.get_selected_packages()@@ -708,6 +721,10 @@ class Builder(gtk.Window): def handler_build_failure_cb(self, running_build): self.build_details_page.show_issues() + def handler_build_log_cb(self, running_build, func, obj): + if hasattr(self.logger, func): + getattr(self.logger, func)(obj) + def destroy_window_cb(self, widget, event): lbl = "<b>Do you really want to exit the Hob image creator?</b>" dialog = CrumbsMessageDialog(self, lbl,gtk.STOCK_DIALOG_INFO) @@ -1033,3 +1050,14 @@ class Builder(gtk.Window):
self.handler.cancel_build() elif response == gtk.RESPONSE_YES: self.handler.cancel_build(True)bitbake/lib/bb/ui/crumbs/builder.py +11
-0+ + def do_log(self, consolelogfile = None): + if consolelogfile: + if self.consolelog: + self.logger.removeHandler(self.consolelog) + self.consolelog = None + self.consolelog = logging.FileHandler(consolelogfile) + bb.msg.addDefaultlogFilter(self.consolelog) + format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") + self.consolelog.setFormatter(format) + self.logger.addHandler(self.consolelog)bitbake/lib/bb/ui/crumbs/hobeventhandler.py +4
-0@@ -381,6 +381,9 @@ class HobHandler(gobject.GObject): def reset_build(self): self.build.reset() + def get_logfile(self): + return self.server.runCommand(["getVariable", + "BB_CONSOLELOG"]) + def get_parameters(self): # retrieve the parameters from bitbake params = {}bitbake/lib/bb/ui/crumbs/imagedetailspage.py +2
-0@@ -159,8 +159,10 @@ class ImageDetailsPage (HobPage): machine = self.builder.configuration.curr_mach base_image = self.builder.recipe_model.get_selected_image() layers = self.builder.configuration.layers + log_file = self.builder.current_logfile pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) else: + log_file = None pkg_num = "N/A"
self._remove_all_widget()bitbake/lib/bb/ui/crumbs/imagedetailspage.py +1
-1@@ -204,9 +206,15 @@ class ImageDetailsPage (HobPage): image_table = HobViewTable(self.__columns__) image_table.set_model(self.image_store) image_table.connect("toggled", self.toggled_cb) + view_buttons = gtk.VBox(False, 6) view_files_button = HobAltButton("View files") view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) - self.box_group_area.pack_start(self.DetailBox(widget=image_table,button=view_files_button), expand=True, fill=True)
+ view_buttons.pack_start(view_files_button, expand=True,
fill=True)bitbake/lib/bb/ui/crumbs/imagedetailspage.py +3
-0+ if log_file: + view_logs_button = HobAltButton("View logs") + view_logs_button.connect("clicked",self.view_logs_clicked_cb,
log_file)
+ view_buttons.pack_end(view_logs_button, expand=True,
fill=True)
+self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_buttons), expand=True, fill=True)# Machine, Base image and Layers
layer_num_limit= 15bitbake/lib/bb/ui/crumbs/imagedetailspage.py +4
-0@@ -258,6 +266,10 @@ class ImageDetailsPage (HobPage): def view_files_clicked_cb(self, button, image_addr): os.system("xdg-open /%s" % image_addr) + def view_logs_clicked_cb(self, button, log_file): + if log_file: + os.system("xdg-open /%s" % log_file) + def refresh_package_detail_box(self, image_size): self.package_detail.update_line_widgets("Total image size: ", image_size)bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -82,6 +82,9 @@ class RunningBuild (gobject.GObject): 'log-error' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), + 'log' : (gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,)), } pids_to_task = {}tasks_to_iter = {}bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -119,6 +122,8 @@ class RunningBuild (gobject.GObject): parent = self.tasks_to_iter[(package, task)] if(isinstance(event, logging.LogRecord)): + if event.taskpid == 0 or event.levelno > logging.INFO: + self.emit("log", "handle", event) # FIXME: this is a hack! More info in Yocto #1433 # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433,temporarily
# mask the error message as it's not informative for the user.bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -204,6 +209,7 @@ class RunningBuild (gobject.GObject): self.tasks_to_iter[(package, task)] = i elif isinstance(event, bb.build.TaskBase): + self.emit("log", "info", event._message) current = self.tasks_to_iter[(package, task)] parent = self.tasks_to_iter[(package, None)]@@ -284,6 +290,7 @@ class RunningBuild (gobject.GObject): pbar.set_text(event.msg) elif isinstance(event, bb.command.CommandFailed): + self.emit("log", "error", "Command execution failed: %s" + % (event.error)) if event.error.startswith("Exited with"): # If the command fails with an exit code we're done,emit the
# generic signal for the UI to notify the user @@ -311,7 +318,41 @@ class RunningBuild (gobject.GObject): elif isinstance(event, bb.event.ParseCompleted) and pbar: pbar.hide() #using runqueue events as many as possible to update the progress barbitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ elif isinstance(event, bb.event.MultipleProviders): + self.emit("log", "info", "multiple providers are + availablefor %s%s (%s)" \
+ % (event._is_runtime and "runtime "
or "", event._item, ", ".join(event._candidates)))
+ self.emit("log", "info", "consider defining aPREFERRED_PROVIDERentry to match %s" % (event._item))bitbake/lib/bb/ui/crumbs/runningbuild.py +8
-0+ elif isinstance(event, bb.event.NoProvider): + if event._runtime: + r = "R" + else: + r = "" + if event._dependees: + self.emit("log", "error", "Nothing %sPROVIDES '%s' + (but%s %sDEPENDS on or otherwise requires it)" \
+ % (r, event._item, ",
".join(event._dependees), r))bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ else: + self.emit("log", "error", "Nothing %sPROVIDES '%s'" %(r, event._item))
bitbake/lib/bb/ui/crumbs/runningbuild.py +5
-0+ if event._reasons: + for reason in event._reasons: + self.emit("log", "error", "%s" % (reason)) + elif isinstance(event, bb.runqueue.runQueueTaskFailed): + self.emit("log", "error", "Task %s (%s) failed with exitcode '%s'" % (event.taskid, event.taskstring, event.exitcode))
bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ elif isinstance(event, bb.runqueue.sceneQueueTaskFailed): + self.emit("log", "warn", "Setscene task %s (%s) failed + withexit code '%s' - real task will be run instead" \
+ % (event.taskid,
+ event.taskstring,
event.exitcode))
elif isinstance(event, (bb.runqueue.runQueueTaskStarted,
bb.runqueue.sceneQueueTaskStarted)):bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ if isinstance(event, bb.runqueue.sceneQueueTaskStarted): + self.emit("log", "info", "Running setscene task %d of + %d(%s)" % \
+ (event.stats.completed +
event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskstring))bitbake/lib/bb/ui/crumbs/runningbuild.py +7
-0+ else: + if event.noexec: + tasktype = 'noexec task' + else: + tasktype = 'task' + self.emit("log", "info", "Running %s %s of %s (ID: + %s,%s)" % \
+ (tasktype,
event.stats.completed + event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskid, event.taskstring))
message = {}
message["eventname"] =bb.event.getName(event)num_of_completed= event.stats.completed +
event.stats.failed @@ -320,6 +361,18 @@ class RunningBuild (gobject.GObject):
message["title"] = ""
message["task"] = event.taskstringself.emit("task-started", message)bitbake/lib/bb/ui/crumbs/runningbuild.py +13
-1+ else: + if not isinstance(event, (bb.event.BuildBase, + bb.event.StampUpdate, + bb.event.ConfigParsed, + bb.event.RecipeParsed, + bb.event.RecipePreFinalise, + bb.runqueue.runQueueEvent, + bb.runqueue.runQueueExitWait, + bb.event.OperationStarted, + bb.event.OperationCompleted, + bb.event.OperationProgress)): + self.emit("log", "error", "Unknown event: %s" % + (error)) return --1.7.6
_______________________________________________
bitbake-devel mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
Re: [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful build
Thanks, Jessica. I think you are right.
1. User build an image which includes build packages. In this case the log will show the build info for both packages and image
'View log' in the Image details screen will provide access to this log file
2. User just build packages. In this case the log will show build package info only.
'View log' in the Packages screen will provide access to this log file
3. User has previous build packages then do image customization and build the image. Then the log will contain build image info.
'View log' in the Image details screen will provide access to this log file
I have added this to the bug 1991, together with a screenshot of the Packages screen with the 'View log' action
Cheers
Belen
Quoted 44 lines · Jessica
Hi Belen,
I've talked with Shane to clarify all the different scenarios of log contents, so we have following combinations:
1. User build an image which includes build packages. In this case the log will show the build info for both packages and image
2. User just build packages. In this case the log will show build package info only.
3. User has previous build packages then do image customization and build the image. Then the log will contain build image info.
I think if we have a retrieve log button after both build image and build packages, we should be able to cover all the above scenarios with the corresponding log content.
Thanks,
Jessica-----Original Message-----
From: Barros Pena, Belen
Sent: Wednesday, April 04, 2012 9:44 AM
To: Zhang, Jessica; Wang, Shane; [email protected]
Cc: Giulia Piu
Subject: Re: [bitbake-devel] [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful buildSorry, guys. Now I am confused. Are the following assumptions correct?
1. Building packages via Hob will generate a log file stored somewhere in the YP directory 2. Building an image via Hob will generate a log file stored somewhere in the YP directory 3. The above logs are two separate files
Assuming the above is correct we need:
1. A 'View log' button in the Image details screen to access the building image log file 2. A 'View log' button in the Packages screen to access the building packages log file
Let me know if the above makes sense.
Quoted 387 lines
Thanks,
Belen
Quoted 378 lines · Jessica
Hi Belen,
I'd expect user to be able to retrieve all logs, image or package.
Thanks,
Jessica-----Original Message-----
From: Barros Pena, Belen
Sent: Tuesday, April 03, 2012 2:25 AM
To: Wang, Shane; [email protected]
Cc: Zhang, Jessica; Giulia Piu
Subject: Re: [bitbake-devel] [PATCH 2/4] Hob: log for Hob and allow users to show logs after successful buildSorry: this was an omission on the design side. If deemed appropriate, we can incorporate an option to retrieve the packages build log in the Packages screen. I'll leave it to Jessica, who reported 1991, to decide if this is something we should provide.
Cheers
Belen
Quoted 350 lines · Shane Wang
If users build images in Hob, record logs and allow users to retrieve the logs after successful build.
The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"Only "build packages" will not write logs because there is no chance for users to retrieve on the GUI.
[Yocto #1991]
Signed-off-by Shane Wang <[email protected]>---
bitbake/lib/bb/ui/crumbs/builder.py | 36 +++++++++++++++-- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 3 + bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 14 ++++++- bitbake/lib/bb/ui/crumbs/runningbuild.py | 53 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -26,6 +26,7 @@ import copyimport os
import subprocess
import shlex
+import logging
from bb.ui.crumbs.template import TemplateMgr from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage @@ -260,6
+261,11 @@ class Builder(gtk.Window):self.template = None
bitbake/lib/bb/ui/crumbs/builder.py +6
-0+ # logger + self.logger = logging.getLogger("BitBake") + self.consolelog = None + self.current_logfile = None + # build step self.current_step = None self.previous_step = None@@ -287,6 +293,7 @@ class Builder(gtk.Window): self.handler.build.connect("build-failed", self.handler_build_failed_cb) self.handler.build.connect("task-started", self.handler_task_started_cb) self.handler.build.connect("log-error", self.handler_build_failure_cb) + self.handler.build.connect("log",self.handler_build_log_cb)
self.handler.connect("generating-data",
self.handler_generating_data_cb)
self.handler.connect("data-generated",
self.handler_data_generated_cb)
self.handler.connect("command-succeeded",
self.handler_command_succeeded_cb)bitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -396,7 +403,7 @@ class Builder(gtk.Window): elif next_step == self.PACKAGE_GENERATING or next_step ==self.FAST_IMAGE_GENERATING:
# both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_packages() + self.generate_packages(next_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.PACKAGE_GENERATED: passbitbake/lib/bb/ui/crumbs/builder.py +0
-0@@ -405,7 +412,7 @@ class Builder(gtk.Window): # after packages are generated, selected_packages need to # be updated in package_model per selected_image in
recipe_model
self.build_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +1
-1- self.generate_image() + self.generate_image(self.current_step ==self.FAST_IMAGE_GENERATING)
elif next_step == self.IMAGE_GENERATED: self.image_details_page.show_page(next_step)bitbake/lib/bb/ui/crumbs/builder.py +4
-1@@ -454,7 +461,10 @@ class Builder(gtk.Window): left = self.package_model.set_selected_packages(selected_packages) self.configuration.selected_packages += left - def generate_packages(self): + def generate_packages(self, log = False): + if log: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build packages _, all_recipes = self.recipe_model.get_selected_recipes()
self.set_user_config()bitbake/lib/bb/ui/crumbs/builder.py +8
-1@@ -466,7 +476,10 @@ class Builder(gtk.Window): self.set_user_config() self.handler.generate_recipes() - def generate_image(self): + def generate_image(self, cont = False): + if not cont: + self.current_logfile = self.handler.get_logfile() + self.do_log(self.current_logfile) # Build image self.set_user_config() all_packages = self.package_model.get_selected_packages()@@ -708,6 +721,10 @@ class Builder(gtk.Window): def handler_build_failure_cb(self, running_build): self.build_details_page.show_issues() + def handler_build_log_cb(self, running_build, func, obj): + if hasattr(self.logger, func): + getattr(self.logger, func)(obj) + def destroy_window_cb(self, widget, event): lbl = "<b>Do you really want to exit the Hob imagecreator?</b>"
dialog = CrumbsMessageDialog(self, lbl,
gtk.STOCK_DIALOG_INFO) @@ -1033,3 +1050,14 @@ class Builder(gtk.Window):self.handler.cancel_build() elif response == gtk.RESPONSE_YES: self.handler.cancel_build(True)bitbake/lib/bb/ui/crumbs/builder.py +9
-0+ + def do_log(self, consolelogfile = None): + if consolelogfile: + if self.consolelog: + self.logger.removeHandler(self.consolelog) + self.consolelog = None + self.consolelog = logging.FileHandler(consolelogfile) + bb.msg.addDefaultlogFilter(self.consolelog) + format = bb.msg.BBLogFormatter("%(levelname)s:%(message)s")
bitbake/lib/bb/ui/crumbs/builder.py +2
-0+ self.consolelog.setFormatter(format) + self.logger.addHandler(self.consolelog)bitbake/lib/bb/ui/crumbs/hobeventhandler.py +4
-0@@ -381,6 +381,9 @@ class HobHandler(gobject.GObject): def reset_build(self): self.build.reset() + def get_logfile(self): + return self.server.runCommand(["getVariable", + "BB_CONSOLELOG"]) + def get_parameters(self): # retrieve the parameters from bitbake params = {}bitbake/lib/bb/ui/crumbs/imagedetailspage.py +2
-0@@ -159,8 +159,10 @@ class ImageDetailsPage (HobPage): machine = self.builder.configuration.curr_mach base_image = self.builder.recipe_model.get_selected_image() layers = self.builder.configuration.layers + log_file = self.builder.current_logfile pkg_num = "%s" % len(self.builder.package_model.get_selected_packages()) else: + log_file = None pkg_num = "N/A"
self._remove_all_widget()bitbake/lib/bb/ui/crumbs/imagedetailspage.py +1
-1@@ -204,9 +206,15 @@ class ImageDetailsPage (HobPage): image_table = HobViewTable(self.__columns__) image_table.set_model(self.image_store) image_table.connect("toggled", self.toggled_cb) + view_buttons = gtk.VBox(False, 6) view_files_button = HobAltButton("View files") view_files_button.connect("clicked", self.view_files_clicked_cb, image_addr) - self.box_group_area.pack_start(self.DetailBox(widget=image_table,button=view_files_button), expand=True, fill=True)
+ view_buttons.pack_start(view_files_button, expand=True,
fill=True)bitbake/lib/bb/ui/crumbs/imagedetailspage.py +3
-0+ if log_file: + view_logs_button = HobAltButton("View logs") + view_logs_button.connect("clicked",self.view_logs_clicked_cb,
log_file)
+ view_buttons.pack_end(view_logs_button, expand=True,
fill=True)
+self.box_group_area.pack_start(self.DetailBox(widget=image_table, button=view_buttons), expand=True, fill=True)# Machine, Base image and Layers
layer_num_limit= 15bitbake/lib/bb/ui/crumbs/imagedetailspage.py +4
-0@@ -258,6 +266,10 @@ class ImageDetailsPage (HobPage): def view_files_clicked_cb(self, button, image_addr): os.system("xdg-open /%s" % image_addr) + def view_logs_clicked_cb(self, button, log_file): + if log_file: + os.system("xdg-open /%s" % log_file) + def refresh_package_detail_box(self, image_size): self.package_detail.update_line_widgets("Total image size: ", image_size)bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -82,6 +82,9 @@ class RunningBuild (gobject.GObject): 'log-error' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), + 'log' : (gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,)), } pids_to_task = {}tasks_to_iter = {}bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0@@ -119,6 +122,8 @@ class RunningBuild (gobject.GObject): parent = self.tasks_to_iter[(package, task)] if(isinstance(event, logging.LogRecord)): + if event.taskpid == 0 or event.levelno > logging.INFO: + self.emit("log", "handle", event) # FIXME: this is a hack! More info in Yocto #1433 # http://bugzilla.pokylinux.org/show_bug.cgi?id=1433,temporarily
# mask the error message as it's not informative for the user.bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0@@ -204,6 +209,7 @@ class RunningBuild (gobject.GObject): self.tasks_to_iter[(package, task)] = i elif isinstance(event, bb.build.TaskBase): + self.emit("log", "info", event._message) current = self.tasks_to_iter[(package, task)] parent = self.tasks_to_iter[(package, None)]@@ -284,6 +290,7 @@ class RunningBuild (gobject.GObject): pbar.set_text(event.msg) elif isinstance(event, bb.command.CommandFailed): + self.emit("log", "error", "Command execution failed: %s" + % (event.error)) if event.error.startswith("Exited with"): # If the command fails with an exit code we're done,emit the
# generic signal for the UI to notify the user @@ -311,7 +318,41 @@ class RunningBuild (gobject.GObject): elif isinstance(event, bb.event.ParseCompleted) and pbar: pbar.hide() #using runqueue events as many as possible to update the progress barbitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ elif isinstance(event, bb.event.MultipleProviders): + self.emit("log", "info", "multiple providers are + availablefor %s%s (%s)" \
+ % (event._is_runtime and "runtime
"
or "", event._item, ", ".join(event._candidates)))
+ self.emit("log", "info", "consider defining aPREFERRED_PROVIDERentry to match %s" % (event._item))bitbake/lib/bb/ui/crumbs/runningbuild.py +8
-0+ elif isinstance(event, bb.event.NoProvider): + if event._runtime: + r = "R" + else: + r = "" + if event._dependees: + self.emit("log", "error", "Nothing %sPROVIDES '%s' + (but%s %sDEPENDS on or otherwise requires it)" \
+ % (r, event._item, ",
".join(event._dependees), r))bitbake/lib/bb/ui/crumbs/runningbuild.py +2
-0+ else: + self.emit("log", "error", "Nothing %sPROVIDES '%s'" %(r, event._item))
bitbake/lib/bb/ui/crumbs/runningbuild.py +5
-0+ if event._reasons: + for reason in event._reasons: + self.emit("log", "error", "%s" % (reason)) + elif isinstance(event, bb.runqueue.runQueueTaskFailed): + self.emit("log", "error", "Task %s (%s) failed with exitcode '%s'" % (event.taskid, event.taskstring, event.exitcode))
bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ elif isinstance(event, bb.runqueue.sceneQueueTaskFailed): + self.emit("log", "warn", "Setscene task %s (%s) failed + withexit code '%s' - real task will be run instead" \
+ % (event.taskid,
+ event.taskstring,
event.exitcode))
elif isinstance(event, (bb.runqueue.runQueueTaskStarted,
bb.runqueue.sceneQueueTaskStarted)):bitbake/lib/bb/ui/crumbs/runningbuild.py +3
-0+ if isinstance(event, bb.runqueue.sceneQueueTaskStarted): + self.emit("log", "info", "Running setscene task %d of + %d(%s)" % \
+ (event.stats.completed +
event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskstring))bitbake/lib/bb/ui/crumbs/runningbuild.py +7
-0+ else: + if event.noexec: + tasktype = 'noexec task' + else: + tasktype = 'task' + self.emit("log", "info", "Running %s %s of %s (ID: + %s,%s)" % \
+ (tasktype,
event.stats.completed + event.stats.active + event.stats.failed + 1,
+ event.stats.total,
event.taskid, event.taskstring))
message = {}
message["eventname"] =bb.event.getName(event)num_of_completed= event.stats.completed +
event.stats.failed @@ -320,6 +361,18 @@ class RunningBuild (gobject.GObject):
message["title"] = ""
message["task"] = event.taskstringself.emit("task-started", message)bitbake/lib/bb/ui/crumbs/runningbuild.py +13
-1+ else: + if not isinstance(event, (bb.event.BuildBase, + bb.event.StampUpdate, + bb.event.ConfigParsed, + bb.event.RecipeParsed, + bb.event.RecipePreFinalise, + bb.runqueue.runQueueEvent, + bb.runqueue.runQueueExitWait, + bb.event.OperationStarted, + bb.event.OperationCompleted, + bb.event.OperationProgress)): + self.emit("log", "error", "Unknown event: %s" % + (error)) return --1.7.6
_______________________________________________
bitbake-devel mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
---------------------------------------------------------------------
Intel Corporation (UK) Limited
Registered No. 1134945 (England)
Registered Office: Pipers Way, Swindon SN3 1RJ
VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
PATCH 3/4 Hob: remove grab_default() for deploy button
In reply to Shane WangWhen the deploy button is disabled since there is no deployable image, the console will show the warning message:
WARNING: /home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/imagedetailspage.py:333:
GtkWarning: /build/buildd/gtk+2.0-2.22.0/gtk/gtkwidget.c:5684: widget not within a GtkWindow
self.deploy_button.grab_default()
This patch is to remove the warning message.
--- bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
bitbake/lib/bb/ui/crumbs/imagedetailspage.py +0 -1
@@ -330,7 +330,6 @@ class ImageDetailsPage (HobPage): self.deploy_button.set_size_request(205, 49) self.deploy_button.set_tooltip_text("Deploy image to get your target board") self.deploy_button.set_flags(gtk.CAN_DEFAULT) - self.deploy_button.grab_default() self.deploy_button.connect("clicked", self.deploy_button_clicked_cb) bottom_buttons.pack_end(self.deploy_button, expand=False, fill=False) created = True
Signature · 1 line
1.7.6
PATCH 4/4 Hob: reset issue indication and build status before build starts on build details screen
In reply to Shane Wang--- bitbake/lib/bb/ui/crumbs/builddetailspage.py | 3 +++ bitbake/lib/bb/ui/crumbs/builder.py | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-)
bitbake/lib/bb/ui/crumbs/builddetailspage.py +3 -0
@@ -214,6 +214,9 @@ class BuildDetailsPage (HobPage): self.show_all() self.back_button.hide() + self.reset_build_status() + self.reset_issues() + def update_progress_bar(self, title, fraction, status=None): self.progress_bar.update(fraction) self.progress_bar.set_title(title)
bitbake/lib/bb/ui/crumbs/builder.py +0 -2
@@ -639,8 +639,6 @@ class Builder(gtk.Window): elif self.current_step == self.PACKAGE_GENERATING: fraction = 0 self.build_details_page.update_progress_bar("Build Started: ", fraction) - self.build_details_page.reset_build_status() - self.build_details_page.reset_issues() self.build_details_page.show_configurations(self.configuration, self.parameters) def build_succeeded(self):
Signature · 1 line
1.7.6
Richard Purdie
AppliedQuoted 14 lines · Shane Wang
The patches is to continue Shane Wang's previous submission to fix Hobs. They include:
- Replace an icon
- Add logs and allow users to retrieve the logs after successful build
- Misc fixes when testingThe following changes since commit
f4b102cdf2cd021a0b5acacb034dd568a8e73817:Hob: a minor fix on pmake (2012-04-02 16:25:56 +0800)
are available in the git repository at:
git://git.pokylinux.org/poky-contribshane/hob-fixes-1
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=shane/hob-fixes-1
Quoted 6 lines
Shane Wang (4):
Hob: add the "info" indication icon for "information" in the dialogs.Hob: remove
grab_default()for deploy button
Hob: reset issue indication and build status before build starts on
build details screen
Merged to master, thanks.
Quoted 1 line
Hob: log for Hob and allow users to show logs after successful build
This has discussion so I've not merged it for now.
Cheers,
Richard
Thank you Richard.
One more patchset missing: "[PATCH 0/6][Resend] Hob fixes", sent by me.
Thanks.
--
Shane
Richard Purdie wrote on 2012-04-05:
Quoted 29 lines · Shane Wang
Quoted 15 lines
The patches is to continue Shane Wang's previous submission to fix Hobs. They include:
- Replace an icon
- Add logs and allow users to retrieve the logs after successful build
- Misc fixes when testing
The following changes since commitf4b102cdf2cd021a0b5acacb034dd568a8e73817:Hob: a minor fix on pmake (2012-04-02 16:25:56 +0800)
are available in the git repository at:
git://git.pokylinux.org/poky-contribshane/hob-fixes-1
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=shane/hob-fixes-1
Shane Wang (4):
Hob: add the "info" indication icon for "information" in the dialogs.Quoted 3 lines
Hob: remove
grab_default()for deploy button
Hob: reset issue indication and build status before build starts on
build details screenMerged to master, thanks.
Quoted 1 line
Hob: log for Hob and allow users to show logs after successful build
This has discussion so I've not merged it for now.
Cheers,
Richard