diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bb/event.py | 3 | ||||
-rwxr-xr-x | lib/bb/ui/crumbs/builder.py | 124 | ||||
-rw-r--r-- | lib/bb/ui/crumbs/hig.py | 5 | ||||
-rw-r--r-- | lib/bb/ui/crumbs/hobeventhandler.py | 5 |
4 files changed, 120 insertions, 17 deletions
diff --git a/lib/bb/event.py b/lib/bb/event.py index deb1c2159..1889d09e1 100644 --- a/lib/bb/event.py +++ b/lib/bb/event.py @@ -562,6 +562,7 @@ class SanityCheckFailed(Event): """ Event to indicate sanity check has failed """ - def __init__(self, msg): + def __init__(self, msg, network_error=False): Event.__init__(self) self._msg = msg + self._network_error = network_error diff --git a/lib/bb/ui/crumbs/builder.py b/lib/bb/ui/crumbs/builder.py index 555ba7350..357089d7c 100755 --- a/lib/bb/ui/crumbs/builder.py +++ b/lib/bb/ui/crumbs/builder.py @@ -22,7 +22,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import glib -import gtk +import gtk, gobject import copy import os import subprocess @@ -36,6 +36,7 @@ from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage from bb.ui.crumbs.packageselectionpage import PackageSelectionPage from bb.ui.crumbs.builddetailspage import BuildDetailsPage from bb.ui.crumbs.imagedetailspage import ImageDetailsPage +from bb.ui.crumbs.sanitycheckpage import SanityCheckPage from bb.ui.crumbs.hobwidget import hwc, HobButton, HobAltButton from bb.ui.crumbs.hig import CrumbsMessageDialog, ImageSelectionDialog, \ AdvancedSettingDialog, SimpleSettingsDialog, \ @@ -266,6 +267,22 @@ class Configuration: template.setVar("CVS_PROXY_HOST", self.combine_host_only("cvs")) template.setVar("CVS_PROXY_PORT", self.combine_port_only("cvs")) + def __str__(self): + s = "VERSION: '%s', BBLAYERS: '%s', MACHINE: '%s', DISTRO: '%s', DL_DIR: '%s'," % \ + (hobVer, " ".join(self.layers), self.curr_mach, self.curr_distro, self.dldir ) + s += "SSTATE_DIR: '%s', SSTATE_MIRROR: '%s', PARALLEL_MAKE: '-j %s', BB_NUMBER_THREADS: '%s', PACKAGE_CLASSES: '%s', " % \ + (self.sstatedir, self.sstatemirror, self.pmake, self.bbthread, " ".join(["package_" + i for i in self.curr_package_format.split()])) + s += "IMAGE_ROOTFS_SIZE: '%s', IMAGE_EXTRA_SPACE: '%s', INCOMPATIBLE_LICENSE: '%s', SDKMACHINE: '%s', CONF_VERSION: '%s', " % \ + (self.image_rootfs_size, self.image_extra_size, self.incompat_license, self.curr_sdk_machine, self.conf_version) + s += "LCONF_VERSION: '%s', EXTRA_SETTING: '%s', TOOLCHAIN_BUILD: '%s', IMAGE_FSTYPES: '%s', __SELECTED_IMAGE__: '%s', " % \ + (self.lconf_version, self.extra_setting, self.toolchain_build, self.image_fstypes, self.selected_image) + s += "DEPENDS: '%s', IMAGE_INSTALL: '%s', enable_proxy: '%s', use_same_proxy: '%s', http_proxy: '%s', " % \ + (self.selected_recipes, self.user_selected_packages, self.enable_proxy, self.same_proxy, self.combine_proxy("http")) + s += "https_proxy: '%s', ftp_proxy: '%s', GIT_PROXY_HOST: '%s', GIT_PROXY_PORT: '%s', CVS_PROXY_HOST: '%s', CVS_PROXY_PORT: '%s'" % \ + (self.combine_proxy("https"), self.combine_proxy("ftp"),self.combine_host_only("git"), self.combine_port_only("git"), + self.combine_host_only("cvs"), self.combine_port_only("cvs")) + return s + class Parameters: '''Represents other variables like available machines, etc.''' @@ -341,7 +358,8 @@ def hob_conf_filter(fn, data): class Builder(gtk.Window): - (MACHINE_SELECTION, + (INITIAL_CHECKS, + MACHINE_SELECTION, RCPPKGINFO_POPULATING, RCPPKGINFO_POPULATED, BASEIMG_SELECTED, @@ -354,16 +372,18 @@ class Builder(gtk.Window): IMAGE_GENERATED, MY_IMAGE_OPENED, BACK, - END_NOOP) = range(14) + END_NOOP) = range(15) - (IMAGE_CONFIGURATION, + (SANITY_CHECK, + IMAGE_CONFIGURATION, RECIPE_DETAILS, BUILD_DETAILS, PACKAGE_DETAILS, IMAGE_DETAILS, - END_TAB) = range(6) + END_TAB) = range(7) __step2page__ = { + INITIAL_CHECKS : SANITY_CHECK, MACHINE_SELECTION : IMAGE_CONFIGURATION, RCPPKGINFO_POPULATING : IMAGE_CONFIGURATION, RCPPKGINFO_POPULATED : IMAGE_CONFIGURATION, @@ -379,6 +399,8 @@ class Builder(gtk.Window): END_NOOP : None, } + SANITY_CHECK_MIN_DISPLAY_TIME = 5 + def __init__(self, hobHandler, recipe_model, package_model): super(Builder, self).__init__() @@ -474,9 +496,14 @@ class Builder(gtk.Window): self.build_details_page = BuildDetailsPage(self) self.package_details_page = PackageSelectionPage(self) self.image_details_page = ImageDetailsPage(self) + self.sanity_check_page = SanityCheckPage(self) + self.display_sanity_check = False + self.sanity_check_post_func = False + self.had_network_error = False self.nb = gtk.Notebook() self.nb.set_show_tabs(False) + self.nb.insert_page(self.sanity_check_page, None, self.SANITY_CHECK) self.nb.insert_page(self.image_configuration_page, None, self.IMAGE_CONFIGURATION) self.nb.insert_page(self.recipe_details_page, None, self.RECIPE_DETAILS) self.nb.insert_page(self.build_details_page, None, self.BUILD_DETAILS) @@ -487,17 +514,46 @@ class Builder(gtk.Window): self.show_all() self.nb.set_current_page(0) + def sanity_check_timeout(self): + # The minimum time for showing the 'sanity check' page has passe + # If someone set the 'sanity_check_post_step' meanwhile, execute it now + self.display_sanity_check = False + if self.sanity_check_post_func: + temp = self.sanity_check_post_func + self.sanity_check_post_func = None + temp() + return False + + def show_sanity_check_page(self): + # This window must stay on screen for at least 5 seconds, according to the design document + self.nb.set_current_page(self.SANITY_CHECK) + self.sanity_check_post_step = None + self.display_sanity_check = True + self.sanity_check_page.start() + gobject.timeout_add(self.SANITY_CHECK_MIN_DISPLAY_TIME * 1000, self.sanity_check_timeout) + + def execute_after_sanity_check(self, func): + if not self.display_sanity_check: + func() + else: + sanity_check_post_func = func + + def generate_configuration(self): + self.show_sanity_check_page() + self.handler.generate_configuration() + def initiate_new_build_async(self): self.switch_page(self.MACHINE_SELECTION) if self.load_template(TemplateMgr.convert_to_template_pathfilename("default", ".hob/")) == False: + self.show_sanity_check_page() self.handler.init_cooker() self.handler.set_extra_inherit("image_types") - self.handler.generate_configuration() + self.generate_configuration() def update_config_async(self): self.switch_page(self.MACHINE_SELECTION) self.set_user_config() - self.handler.generate_configuration() + self.generate_configuration() def sanity_check(self): self.handler.trigger_sanity_check() @@ -754,6 +810,15 @@ class Builder(gtk.Window): def handler_package_formats_updated_cb(self, handler, formats): self.parameters.all_package_formats = formats + def switch_to_image_configuration_helper(self): + self.sanity_check_page.stop() + self.switch_page(self.IMAGE_CONFIGURATION) + self.image_configuration_page.switch_machine_combo() + + def show_network_error_dialog_helper(self): + self.sanity_check_page.stop() + self.show_network_error_dialog() + def handler_command_succeeded_cb(self, handler, initcmd): if initcmd == self.handler.GENERATE_CONFIGURATION: if not self.configuration.curr_mach: @@ -761,7 +826,13 @@ class Builder(gtk.Window): self.update_configuration_parameters(self.get_parameters_sync()) self.sanity_check() elif initcmd == self.handler.SANITY_CHECK: - self.image_configuration_page.switch_machine_combo() + if self.had_network_error: + self.had_network_error = False + self.execute_after_sanity_check(self.show_network_error_dialog_helper) + else: + # Switch to the 'image configuration' page now, but we might need + # to wait for the minimum display time of the sanity check page + self.execute_after_sanity_check(self.switch_to_image_configuration_helper) elif initcmd in [self.handler.GENERATE_RECIPES, self.handler.GENERATE_PACKAGES, self.handler.GENERATE_IMAGE]: @@ -786,15 +857,40 @@ class Builder(gtk.Window): response = dialog.run() dialog.destroy() + def show_network_error_dialog(self): + lbl = "<b>Hob cannot connect to the network</b>\n" + msg = "Please check your network connection. If you are using a proxy server, please make sure it is configured correctly." + lbl = lbl + "%s\n\n" % glib.markup_escape_text(msg) + dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_ERROR) + button = dialog.add_button("Close", gtk.RESPONSE_OK) + HobButton.style_button(button) + button = dialog.add_button("Proxy settings", gtk.RESPONSE_CANCEL) + HobButton.style_button(button) + res = dialog.run() + dialog.destroy() + if res == gtk.RESPONSE_CANCEL: + res, settings_changed = self.show_simple_settings_dialog(SimpleSettingsDialog.PROXIES_PAGE_ID) + if not res: + return + if settings_changed: + self.reparse_post_adv_settings() + def handler_command_failed_cb(self, handler, msg): if msg: self.show_error_dialog(msg) self.reset() - def handler_sanity_failed_cb(self, handler, msg): - msg = msg.replace("your local.conf", "Settings") - self.show_error_dialog(msg) + def handler_sanity_failed_cb(self, handler, msg, network_error): self.reset() + if network_error: + # Mark this in an internal field. The "network error" dialog will be + # shown later, when a SanityCheckPassed event will be handled + # (as sent by sanity.bbclass) + self.had_network_error = True + else: + msg = msg.replace("your local.conf", "Settings") + self.show_error_dialog(msg) + self.reset() def window_sensitive(self, sensitive): self.image_configuration_page.machine_combo.set_sensitive(sensitive) @@ -1171,7 +1267,7 @@ class Builder(gtk.Window): dialog.destroy() - def show_adv_settings_dialog(self): + def show_adv_settings_dialog(self, tab=None): dialog = AdvancedSettingDialog(title = "Advanced configuration", configuration = copy.deepcopy(self.configuration), all_image_types = self.parameters.image_types, @@ -1196,7 +1292,7 @@ class Builder(gtk.Window): dialog.destroy() return response == gtk.RESPONSE_YES, settings_changed - def show_simple_settings_dialog(self): + def show_simple_settings_dialog(self, tab=None): dialog = SimpleSettingsDialog(title = "Settings", configuration = copy.deepcopy(self.configuration), all_image_types = self.parameters.image_types, @@ -1212,6 +1308,8 @@ class Builder(gtk.Window): HobAltButton.style_button(button) button = dialog.add_button("Save", gtk.RESPONSE_YES) HobButton.style_button(button) + if tab: + dialog.switch_to_page(tab) response = dialog.run() settings_changed = False if response == gtk.RESPONSE_YES: diff --git a/lib/bb/ui/crumbs/hig.py b/lib/bb/ui/crumbs/hig.py index 778d84331..f52510c55 100644 --- a/lib/bb/ui/crumbs/hig.py +++ b/lib/bb/ui/crumbs/hig.py @@ -270,6 +270,9 @@ class CrumbsMessageDialog(CrumbsDialog): # class SimpleSettingsDialog (CrumbsDialog, SettingsUIHelper): + (BUILD_ENV_PAGE_ID, + PROXIES_PAGE_ID) = range(2) + def __init__(self, title, configuration, all_image_types, all_package_formats, all_distros, all_sdk_machines, max_threads, parent, flags, buttons=None): @@ -624,6 +627,8 @@ class SimpleSettingsDialog (CrumbsDialog, SettingsUIHelper): self.show_all() + def switch_to_page(self, page_id): + self.nb.set_current_page(page_id) # # AdvancedSettings Dialog diff --git a/lib/bb/ui/crumbs/hobeventhandler.py b/lib/bb/ui/crumbs/hobeventhandler.py index ed55acc4f..e8d7dc2ce 100644 --- a/lib/bb/ui/crumbs/hobeventhandler.py +++ b/lib/bb/ui/crumbs/hobeventhandler.py @@ -43,7 +43,7 @@ class HobHandler(gobject.GObject): (gobject.TYPE_STRING,)), "sanity-failed" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, - (gobject.TYPE_STRING,)), + (gobject.TYPE_STRING, gobject.TYPE_INT)), "generating-data" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), @@ -166,7 +166,6 @@ class HobHandler(gobject.GObject): def handle_event(self, event): if not event: return - if self.building: self.current_phase = "building" self.build.handle_event(event) @@ -180,7 +179,7 @@ class HobHandler(gobject.GObject): self.run_next_command() elif isinstance(event, bb.event.SanityCheckFailed): - self.emit("sanity-failed", event._msg) + self.emit("sanity-failed", event._msg, event._network_error) elif isinstance(event, logging.LogRecord): if not self.building: |