From patchwork Thu Mar 22 15:38:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel,6/8] Hob: remember the settings between Hob sessions Date: Thu, 22 Mar 2012 15:38:08 -0000 From: Shane Wang X-Patchwork-Id: 24153 Message-Id: <09f4dd59adb400073f21dcff12c99f1559d34b70.1332430442.git.shane.wang@intel.com> To: bitbake-devel@lists.openembedded.org This patch is to add support to remember and restore the settings between different Hob sessions. The settings include: - Layers - Settings including proxies [Yocto #2113] Signed-off-by: Shane Wang --- bitbake/lib/bb/ui/crumbs/builder.py | 125 ++++++++++++++++++++------- bitbake/lib/bb/ui/crumbs/hig.py | 8 +- bitbake/lib/bb/ui/crumbs/hobeventhandler.py | 5 +- bitbake/lib/bb/ui/crumbs/template.py | 55 ++++++++---- 4 files changed, 141 insertions(+), 52 deletions(-) diff --git a/bitbake/lib/bb/ui/crumbs/builder.py b/bitbake/lib/bb/ui/crumbs/builder.py index 12bfc59..9c6392a 100755 --- a/bitbake/lib/bb/ui/crumbs/builder.py +++ b/bitbake/lib/bb/ui/crumbs/builder.py @@ -87,8 +87,27 @@ class Configuration: else: os.environ[proxy_key] = proxy + def _setup_proxy(self): + if self.enable_proxy: + self.set_os_proxy("all_proxy", self.all_proxy) + self.set_os_proxy("http_proxy", self.http_proxy) + self.set_os_proxy("https_proxy", self.https_proxy) + self.set_os_proxy("ftp_proxy", self.ftp_proxy) + def load(self, template): + self.load_machine(template) + self.load_configuration(template) + self.load_layers(template) + self.load_image(template) + + def load_settings_only(self, template): + self.load_configuration(template) + self.load_layers(template) + + def load_machine(self, template): self.curr_mach = template.getVar("MACHINE") + + def load_configuration(self, template): self.curr_package_format = " ".join(template.getVar("PACKAGE_CLASSES").split("package_")).strip() self.curr_distro = template.getVar("DISTRO") self.dldir = template.getVar("DL_DIR") @@ -98,7 +117,7 @@ class Configuration: self.bbthread = int(template.getVar("BB_NUMBER_THREAD")) self.image_rootfs_size = int(template.getVar("IMAGE_ROOTFS_SIZE")) self.image_extra_size = int(template.getVar("IMAGE_EXTRA_SPACE")) - # image_overhead_factor is read-only. + # image_overhead_factor is read-only. self.incompat_license = template.getVar("INCOMPATIBLE_LICENSE") self.curr_sdk_machine = template.getVar("SDKMACHINE") self.conf_version = template.getVar("CONF_VERSION") @@ -106,24 +125,43 @@ class Configuration: self.extra_setting = eval(template.getVar("EXTRA_SETTING")) self.toolchain_build = eval(template.getVar("TOOLCHAIN_BUILD")) self.image_fstypes = template.getVar("IMAGE_FSTYPES").split() - # bblayers.conf - self.layers = template.getVar("BBLAYERS").split() - # image/recipes/packages - self.selected_image = template.getVar("__SELECTED_IMAGE__") - self.selected_recipes = template.getVar("DEPENDS").split() - self.selected_packages = template.getVar("IMAGE_INSTALL").split() # proxy self.all_proxy = template.getVar("all_proxy") self.http_proxy = template.getVar("http_proxy") self.ftp_proxy = template.getVar("ftp_proxy") self.https_proxy = template.getVar("https_proxy") self.enable_proxy = (template.getVar("enable_proxy") == "True") + self._setup_proxy() + + def load_layers(self, template): + # bblayers.conf + self.layers = template.getVar("BBLAYERS").split() + + def load_image(self, template): + # image/recipes/packages + self.selected_image = template.getVar("__SELECTED_IMAGE__") + self.selected_recipes = template.getVar("DEPENDS").split() + self.selected_packages = template.getVar("IMAGE_INSTALL").split() def save(self, template, filename): + self.save_machine(template) + self.save_configuration(template) + self.save_layers(template) + self.save_image(template) + + def save_settings_only(self, template): + self.save_configuration(template) + self.save_layers(template) + + def save_layers(self, template): # bblayers.conf template.setVar("BBLAYERS", " ".join(self.layers)) + + def save_machine(self, template): # local.conf template.setVar("MACHINE", self.curr_mach) + + def save_configuration(self, template): template.setVar("DISTRO", self.curr_distro) template.setVar("DL_DIR", self.dldir) template.setVar("SSTATE_DIR", self.sstatedir) @@ -140,11 +178,6 @@ class Configuration: template.setVar("EXTRA_SETTING", self.extra_setting) template.setVar("TOOLCHAIN_BUILD", self.toolchain_build) template.setVar("IMAGE_FSTYPES", " ".join(self.image_fstypes).lstrip(" ")) - # image/recipes/packages - self.selected_image = filename - template.setVar("__SELECTED_IMAGE__", self.selected_image) - template.setVar("DEPENDS", self.selected_recipes) - template.setVar("IMAGE_INSTALL", self.selected_packages) # proxy template.setVar("all_proxy", self.all_proxy) template.setVar("http_proxy", self.http_proxy) @@ -152,6 +185,13 @@ class Configuration: template.setVar("https_proxy", self.https_proxy) template.setVar("enable_proxy", ("%s" % self.enable_proxy)) + def save_image(self, template, filename): + # image/recipes/packages + self.selected_image = filename + template.setVar("__SELECTED_IMAGE__", self.selected_image) + template.setVar("DEPENDS", self.selected_recipes) + template.setVar("IMAGE_INSTALL", self.selected_packages) + class Parameters: '''Represents other variables like available machines, etc.''' @@ -256,6 +296,10 @@ class Builder(gtk.Window): self.handler.connect("command-succeeded", self.handler_command_succeeded_cb) self.handler.connect("command-failed", self.handler_command_failed_cb) + # restore the settings from the last Hob session + self.load_default_settings() + self.handler.parse_layers(self.configuration.layers) + self.switch_page(self.MACHINE_SELECTION) def create_visual_elements(self): @@ -292,21 +336,32 @@ class Builder(gtk.Window): self.show_all() self.nb.set_current_page(0) - def load_template(self, path): + def load_template(self, path, load_settings_only=False): self.template = TemplateMgr() - self.template.load(path) - self.configuration.load(self.template) - - for layer in self.configuration.layers: - if not os.path.exists(layer+'/conf/layer.conf'): - return False + ret = True + if not self.template.exists(path): + ret = False + else: + self.template.load(path) + if not load_settings_only: + self.configuration.load(self.template) + else: + self.configuration.load_settings_only(self.template) - self.switch_page(self.LAYER_CHANGED) + for layer in self.configuration.layers: + if not os.path.exists(layer+'/conf/layer.conf'): + ret = False + if ret: + self.switch_page(self.LAYER_CHANGED) self.template.destroy() self.template = None + return ret - def save_template(self, path): + def load_default_settings(self): + self.load_template(TemplateMgr.convert_to_template_pathfilename("default", ".hob/"), load_settings_only=True) + + def save_template(self, path, save_settings_only=False): if path.rfind("/") == -1: filename = "default" path = "." @@ -314,14 +369,27 @@ class Builder(gtk.Window): filename = path[path.rfind("/") + 1:len(path)] path = path[0:path.rfind("/")] - self.template = TemplateMgr() + if not save_settings_only: + self.template = TemplateMgr() + else: + self.template = TemplateMgr(save_template_only=True) + self.template.open(filename, path) - self.configuration.save(self.template, filename) + + if not save_settings_only: + self.configuration.save(self.template, filename) + else: + self.configuration.save_settings_only(self.template) self.template.save() self.template.destroy() self.template = None + def save_default_settings(self): + if not os.path.exists(".hob/"): + os.mkdir(".hob/") + self.save_template(".hob/default", save_settings_only=True) + def switch_page(self, next_step): # Main Workflow (Business Logic) self.nb.set_current_page(self.__step2page__[next_step]) @@ -645,6 +713,8 @@ class Builder(gtk.Window): response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_YES: + # save the settings from the next Hob session + self.save_default_settings() gtk.main_quit() return False else: @@ -764,13 +834,6 @@ class Builder(gtk.Window): dialog.destroy() - def _setup_proxy(self): - if self.configuration.enable_proxy: - self.configuration.set_os_proxy("all_proxy", self.configuration.all_proxy) - self.configuration.set_os_proxy("http_proxy", self.configuration.http_proxy) - self.configuration.set_os_proxy("https_proxy", self.configuration.https_proxy) - self.configuration.set_os_proxy("ftp_proxy", self.configuration.ftp_proxy) - def show_adv_settings_dialog(self): dialog = AdvancedSettingDialog(title = "Settings", configuration = copy.deepcopy(self.configuration), @@ -800,7 +863,7 @@ class Builder(gtk.Window): self.configuration.http_proxy = dialog.http_proxy self.configuration.https_proxy = dialog.https_proxy self.configuration.ftp_proxy = dialog.ftp_proxy - self._setup_proxy() + self.configuration._setup_proxy() # DO reparse recipes if dialog.settings_changed: if self.configuration.curr_mach == "": diff --git a/bitbake/lib/bb/ui/crumbs/hig.py b/bitbake/lib/bb/ui/crumbs/hig.py index b555196..4cc3019 100644 --- a/bitbake/lib/bb/ui/crumbs/hig.py +++ b/bitbake/lib/bb/ui/crumbs/hig.py @@ -539,7 +539,7 @@ class AdvancedSettingDialog (CrumbsDialog): label = self.gen_label_widget("Set all proxy:") tooltip = "Set the all proxy that will be used if the proxy for a URL isn't specified." - proxy_widget, self.all_proxy_text = self.gen_entry_widget(self.split_model, self.all_proxy, self, tooltip, False) + proxy_widget, self.all_proxy_text = self.gen_entry_widget(self.all_proxy, self, tooltip, False) self.all_proxy_text.set_editable(self.enable_proxy) self.all_proxy_text.set_sensitive(self.enable_proxy) sub_vbox.pack_start(label, expand=False, fill=False) @@ -547,7 +547,7 @@ class AdvancedSettingDialog (CrumbsDialog): label = self.gen_label_widget("Set http proxy:") tooltip = "Set the http proxy that will be used in do_fetch() source code" - proxy_widget, self.http_proxy_text = self.gen_entry_widget(self.split_model, self.http_proxy, self, tooltip, False) + proxy_widget, self.http_proxy_text = self.gen_entry_widget(self.http_proxy, self, tooltip, False) self.http_proxy_text.set_editable(self.enable_proxy) self.http_proxy_text.set_sensitive(self.enable_proxy) sub_vbox.pack_start(label, expand=False, fill=False) @@ -555,7 +555,7 @@ class AdvancedSettingDialog (CrumbsDialog): label = self.gen_label_widget("Set https proxy:") tooltip = "Set the https proxy that will be used in do_fetch() source code" - proxy_widget, self.https_proxy_text = self.gen_entry_widget(self.split_model, self.https_proxy, self, tooltip, False) + proxy_widget, self.https_proxy_text = self.gen_entry_widget(self.https_proxy, self, tooltip, False) self.https_proxy_text.set_editable(self.enable_proxy) self.https_proxy_text.set_sensitive(self.enable_proxy) sub_vbox.pack_start(label, expand=False, fill=False) @@ -563,7 +563,7 @@ class AdvancedSettingDialog (CrumbsDialog): label = self.gen_label_widget("Set ftp proxy:") tooltip = "Set the ftp proxy that will be used in do_fetch() source code" - proxy_widget, self.ftp_proxy_text = self.gen_entry_widget(self.split_model, self.ftp_proxy, self, tooltip, False) + proxy_widget, self.ftp_proxy_text = self.gen_entry_widget(self.ftp_proxy, self, tooltip, False) self.ftp_proxy_text.set_editable(self.enable_proxy) self.ftp_proxy_text.set_sensitive(self.enable_proxy) sub_vbox.pack_start(label, expand=False, fill=False) diff --git a/bitbake/lib/bb/ui/crumbs/hobeventhandler.py b/bitbake/lib/bb/ui/crumbs/hobeventhandler.py index fe7b5d5..f56b6f9 100644 --- a/bitbake/lib/bb/ui/crumbs/hobeventhandler.py +++ b/bitbake/lib/bb/ui/crumbs/hobeventhandler.py @@ -266,10 +266,13 @@ class HobHandler(gobject.GObject): def parse_config(self): self.server.runCommand(["parseConfigurationFiles", "", ""]) - def refresh_layers(self, bblayers): + def parse_layers(self, bblayers): self.server.runCommand(["initCooker"]) self.server.runCommand(["setVariable", "BBLAYERS", " ".join(bblayers)]) self.parse_config() + + def refresh_layers(self, bblayers): + self.parse_layers(bblayers) self.commands_async.append(self.CFG_FILES_DISTRO) self.commands_async.append(self.CFG_FILES_MACH) self.commands_async.append(self.CFG_FILES_SDKMACH) diff --git a/bitbake/lib/bb/ui/crumbs/template.py b/bitbake/lib/bb/ui/crumbs/template.py index a03063c..2e9d2d1 100644 --- a/bitbake/lib/bb/ui/crumbs/template.py +++ b/bitbake/lib/bb/ui/crumbs/template.py @@ -129,37 +129,60 @@ class TemplateMgr(gobject.GObject): __gBBLayersVars__ = ["BBLAYERS", "LCONF_VERSION"] __gRecipeVars__ = ["DEPENDS", "IMAGE_INSTALL"] - def __init__(self): + def __init__(self, save_template_only = False): gobject.GObject.__init__(self) self.template_hob = None self.bblayers_conf = None self.local_conf = None self.image_bb = None + self.save_template_only = save_template_only + + @classmethod + def convert_to_template_pathfilename(cls, filename, path): + return "%s/%s%s%s" % (path, "template-", filename, ".hob") + + @classmethod + def convert_to_bblayers_pathfilename(cls, filename, path): + return "%s/%s%s%s" % (path, "bblayers-", filename, ".conf") + + @classmethod + def convert_to_local_pathfilename(cls, filename, path): + return "%s/%s%s%s" % (path, "local-", filename, ".conf") + + @classmethod + def convert_to_image_pathfilename(cls, filename, path): + return "%s/%s%s%s" % (path, "hob-image-", filename, ".bb") def open(self, filename, path): - self.template_hob = HobTemplateFile("%s/%s%s%s" % (path, "template-", filename, ".hob")) - self.bblayers_conf = ConfigFile("%s/%s%s%s" % (path, "bblayers-", filename, ".conf")) - self.local_conf = ConfigFile("%s/%s%s%s" % (path, "local-", filename, ".conf")) - self.image_bb = RecipeFile("%s/%s%s%s" % (path, "hob-image-", filename, ".bb")) + self.template_hob = HobTemplateFile(TemplateMgr.convert_to_template_pathfilename(filename, path)) + if not self.save_template_only: + self.bblayers_conf = ConfigFile(TemplateMgr.convert_to_bblayers_pathfilename(filename, path)) + self.local_conf = ConfigFile(TemplateMgr.convert_to_local_pathfilename(filename, path)) + self.image_bb = RecipeFile(TemplateMgr.convert_to_image_pathfilename(filename, path)) def setVar(self, var, val): - if var in TemplateMgr.__gLocalVars__: - self.local_conf.setVar(var, val) - if var in TemplateMgr.__gBBLayersVars__: - self.bblayers_conf.setVar(var, val) - if var in TemplateMgr.__gRecipeVars__: - self.image_bb.setVar(var, val) + if not self.save_template_only: + if var in TemplateMgr.__gLocalVars__: + self.local_conf.setVar(var, val) + if var in TemplateMgr.__gBBLayersVars__: + self.bblayers_conf.setVar(var, val) + if var in TemplateMgr.__gRecipeVars__: + self.image_bb.setVar(var, val) self.template_hob.setVar(var, val) def save(self): - self.local_conf.save() - self.bblayers_conf.save() - self.image_bb.save() + if not self.save_template_only: + self.local_conf.save() + self.bblayers_conf.save() + self.image_bb.save() self.template_hob.save() - def load(self, path): - self.template_hob = HobTemplateFile(path) + def exists(self, pathfilename): + return os.path.isfile(pathfilename) + + def load(self, pathfilename): + self.template_hob = HobTemplateFile(pathfilename) self.dictionary = self.template_hob.load() def getVar(self, var):