Salome HOME
Add an option to the log command in order to access the products compilation logs
[tools/sat.git] / commands / config.py
index ef7b2a5fa1b8a6b9420389f54381c969c6c95e53..cb5863f35064746a10ffa60b93ec6ecabdf6d694 100644 (file)
@@ -32,19 +32,21 @@ gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n'))
 # Define all possible option for config command :  sat config <options>
 parser = src.options.Options()
 parser.add_option('v', 'value', 'string', 'value',
-    _("print the value of CONFIG_VARIABLE."))
+    _("Optional: print the value of CONFIG_VARIABLE."))
 parser.add_option('e', 'edit', 'boolean', 'edit',
-    _("edit the product configuration file."))
+    _("Optional: edit the product configuration file."))
 parser.add_option('i', 'info', 'string', 'info',
-    _("get information on a product."))
+    _("Optional: get information on a product."))
 parser.add_option('l', 'list', 'boolean', 'list',
-    _("list all available applications."))
+    _("Optional: list all available applications."))
+parser.add_option('', 'show_patchs', 'boolean', 'show_patchs',
+    _("Optional: synthetic view of all patches used in the application"))
 parser.add_option('c', 'copy', 'boolean', 'copy',
-    _("""copy a config file to the personal config files directory.
+    _("""Optional: copy a config file to the personal config files directory.
 \tWARNING the included files are not copied.
 \tIf a name is given the new config file takes the given name."""))
 parser.add_option('n', 'no_label', 'boolean', 'no_label',
-    _("do not print labels, Works only with --value and --list."))
+    _("Internal use: do not print labels, Works only with --value and --list."))
 parser.add_option('s', 'schema', 'boolean', 'schema',
     _("Internal use."))
 
@@ -98,6 +100,7 @@ class ConfigManager:
         var['salometoolsway'] = os.path.dirname(
                                     os.path.dirname(os.path.abspath(__file__)))
         var['srcDir'] = os.path.join(var['salometoolsway'], 'src')
+        var['internal_dir'] = os.path.join(var['srcDir'], 'internal_config')
         var['sep']= os.path.sep
         
         # datadir has a default location
@@ -247,7 +250,8 @@ class ConfigManager:
         src.pyconf.streamOpener = ConfigOpener([cfg.VARS.datadir])
         try:
             site_cfg = src.pyconf.Config(open(os.path.join(cfg.VARS.datadir, 
-                                                           'site.pyconf')))
+                                                           'site.pyconf')),
+                                         PWD = ('SITE', cfg.VARS.datadir) )
         except src.pyconf.ConfigError as e:
             raise src.SatException(_("Error in configuration file: "
                                      "site.pyconf\n  %(error)s") % \
@@ -261,7 +265,6 @@ class ConfigManager:
                   + cfg.VARS.sep 
                   + "site.pyconf and edit the file")
             raise src.SatException( e );
-        
         merger.merge(cfg, site_cfg)
 
         # apply overwrite from command line if needed
@@ -282,12 +285,14 @@ class ConfigManager:
             if not os.path.exists(project_pyconf_path):
                 msg = _("WARNING: The project file %s cannot be found. "
                         "It will be ignored\n" % project_pyconf_path)
-                sys.stdout.write(src.printcolors.printcWarning(msg))
+                sys.stdout.write(msg)
                 continue
             project_name = os.path.basename(
                                     project_pyconf_path)[:-len(".pyconf")]
             try:
-                project_cfg = src.pyconf.Config(open(project_pyconf_path))
+                project_pyconf_dir = os.path.dirname(project_pyconf_path)
+                project_cfg = src.pyconf.Config(open(project_pyconf_path),
+                                                PWD=("", project_pyconf_dir))
             except Exception as e:
                 raise src.SatException(_("Error in configuration file: "
                                  "%(file_path)s\n  %(error)s") % \
@@ -354,7 +359,8 @@ class ConfigManager:
                     try:
                         prod_cfg = src.pyconf.Config(open(
                                                     os.path.join(products_dir,
-                                                                 fName)))
+                                                                 fName)),
+                                                     PWD=("", products_dir))
                     except src.pyconf.ConfigError as e:
                         raise src.SatException(_(
                             "Error in configuration file: %(prod)s\n  %(error)s") % \
@@ -381,29 +387,61 @@ class ConfigManager:
             # search APPLICATION file in all directories in configPath
             cp = cfg.PATHS.APPLICATIONPATH
             src.pyconf.streamOpener = ConfigOpener(cp)
+            do_merge = True
             try:
                 application_cfg = src.pyconf.Config(application + '.pyconf')
             except IOError as e:
                 raise src.SatException(_("%s, use 'config --list' to get the"
                                          " list of available applications.") %e)
             except src.pyconf.ConfigError as e:
-                raise src.SatException(_("Error in configuration file:"
-                                " %(application)s.pyconf\n  %(error)s") % \
-                    { 'application': application, 'error': str(e) } )
-
-            merger.merge(cfg, application_cfg)
-
-            # apply overwrite from command line if needed
-            for rule in self.get_command_line_overrides(options,
-                                                         ["APPLICATION"]):
-                # this cannot be factorized because of the exec
-                exec('cfg.' + rule)
-                
-            # default launcher name ('salome')
-            if ('profile' in cfg.APPLICATION and 
-                'launcher_name' not in cfg.APPLICATION.profile):
-                cfg.APPLICATION.profile.launcher_name = 'salome'
+                if (not ('-e' in parser.parse_args()[1]) 
+                                         or ('--edit' in parser.parse_args()[1]) 
+                                         and command == 'config'):
+                    raise src.SatException(_("Error in configuration file: "
+                                             "%(application)s.pyconf\n "
+                                             " %(error)s") % \
+                        { 'application': application, 'error': str(e) } )
+                else:
+                    sys.stdout.write(src.printcolors.printcWarning(
+                                        "There is an error in the file"
+                                        " %s.pyconf.\n" % cfg.VARS.application))
+                    do_merge = False
+            except Exception as e:
+                if (not ('-e' in parser.parse_args()[1]) 
+                                        or ('--edit' in parser.parse_args()[1]) 
+                                        and command == 'config'):
+                    sys.stdout.write(src.printcolors.printcWarning("%s\n" % str(e)))
+                    raise src.SatException(_("Error in configuration file:"
+                                             " %(application)s.pyconf\n") % \
+                        { 'application': application} )
+                else:
+                    sys.stdout.write(src.printcolors.printcWarning(
+                                "There is an error in the file"
+                                " %s.pyconf. Opening the file with the"
+                                " default viewer\n" % cfg.VARS.application))
+                    sys.stdout.write("The error:"
+                                 " %s\n" % src.printcolors.printcWarning(
+                                                                      str(e)))
+                    do_merge = False
+
+            if do_merge:
+                merger.merge(cfg, application_cfg)
+            
+                # apply overwrite from command line if needed
+                for rule in self.get_command_line_overrides(options,
+                                                             ["APPLICATION"]):
+                    # this cannot be factorized because of the exec
+                    exec('cfg.' + rule)
+                    
+                # default launcher name ('salome')
+                if ('profile' in cfg.APPLICATION and 
+                    'launcher_name' not in cfg.APPLICATION.profile):
+                    cfg.APPLICATION.profile.launcher_name = 'salome'
         
+            else:
+                cfg['open_application'] = 'yes'
+                
+            
         # =====================================================================
         # load USER config
         self.set_user_config_file(cfg)
@@ -490,7 +528,7 @@ class ConfigManager:
                                             user_cfg,
                                             src.pyconf.DOLLAR,
                                             'workdir  + $VARS.sep + "LOGS"'),
-                                 "The log reposotory\n")
+                                 "The log repository\n")
         
         # 
         src.ensure_path_exists(config.VARS.personalDir)
@@ -603,39 +641,44 @@ def show_product_info(config, name, logger):
         return
     
     # information on compilation
-    logger.write("\n", 2)
-    logger.write(src.printcolors.printcLabel("compile:") + "\n", 2)
-    src.printcolors.print_value(logger, 
-                                "compilation method", 
-                                pinfo.build_source, 
-                                2)
-    
-    if pinfo.build_source == "script" and "compil_script" in pinfo:
+    if src.product.product_compiles(pinfo):
+        logger.write("\n", 2)
+        logger.write(src.printcolors.printcLabel("compile:") + "\n", 2)
         src.printcolors.print_value(logger, 
-                                    "Compilation script", 
-                                    pinfo.compil_script
+                                    "compilation method", 
+                                    pinfo.build_source
                                     2)
+        
+        if pinfo.build_source == "script" and "compil_script" in pinfo:
+            src.printcolors.print_value(logger, 
+                                        "Compilation script", 
+                                        pinfo.compil_script, 
+                                        2)
+        
+        if 'nb_proc' in pinfo:
+            src.printcolors.print_value(logger, "make -j", pinfo.nb_proc, 2)
     
-    if 'nb_proc' in pinfo:
-        src.printcolors.print_value(logger, "make -j", pinfo.nb_proc, 2)
-
-    src.printcolors.print_value(logger, 
-                                "source dir", 
-                                check_path(pinfo.source_dir), 
-                                2)
-    if 'install_dir' in pinfo:
-        src.printcolors.print_value(logger, 
-                                    "build dir", 
-                                    check_path(pinfo.build_dir), 
-                                    2)
         src.printcolors.print_value(logger, 
-                                    "install dir", 
-                                    check_path(pinfo.install_dir), 
+                                    "source dir", 
+                                    check_path(pinfo.source_dir), 
                                     2)
+        if 'install_dir' in pinfo:
+            src.printcolors.print_value(logger, 
+                                        "build dir", 
+                                        check_path(pinfo.build_dir), 
+                                        2)
+            src.printcolors.print_value(logger, 
+                                        "install dir", 
+                                        check_path(pinfo.install_dir), 
+                                        2)
+        else:
+            logger.write("  " + 
+                         src.printcolors.printcWarning(_("no install dir")) + 
+                         "\n", 2)
     else:
-        logger.write("  " + 
-                     src.printcolors.printcWarning(_("no install dir")) + 
-                     "\n", 2)
+        logger.write("\n", 2)
+        msg = _("This product does not compile")
+        logger.write("%s\n" % msg, 2)
 
     # information on environment
     logger.write("\n", 2)
@@ -652,7 +695,27 @@ def show_product_info(config, name, logger):
     zz.set_python_libdirs()
     zz.set_a_product(name, logger)
         
+def show_patchs(config, logger):
+    '''Prints all the used patchs in the application.
     
+    :param config Config: the global configuration.
+    :param logger Logger: The logger instance to use for the display
+    '''
+    len_max = max([len(p) for p in config.APPLICATION.products]) + 2
+    for product in config.APPLICATION.products:
+        product_info = src.product.get_product_config(config, product)
+        if src.product.product_has_patches(product_info):
+            logger.write("%s: " % product, 1)
+            logger.write(src.printcolors.printcInfo(
+                                            " " * (len_max - len(product) -2) +
+                                            "%s\n" % product_info.patches[0]),
+                         1)
+            if len(product_info.patches) > 1:
+                for patch in product_info.patches[1:]:
+                    logger.write(src.printcolors.printcInfo(len_max*" " +
+                                                            "%s\n" % patch), 1)
+            logger.write("\n", 1)
+
 def print_value(config, path, show_label, logger, level=0, show_full_path=False):
     '''Prints a value from the configuration. Prints recursively the values 
        under the initial path.
@@ -754,7 +817,8 @@ def description():
     :rtype: str
     '''
     return _("The config command allows manipulation "
-             "and operation on config files.")
+             "and operation on config files.\n\nexample:\nsat config "
+             "SALOME-master --info ParaView")
     
 
 def run(args, runner, logger):
@@ -781,9 +845,11 @@ def run(args, runner, logger):
     # case : edit user pyconf file or application file
     elif options.edit:
         editor = runner.cfg.USER.editor
-        if 'APPLICATION' not in runner.cfg: # edit user pyconf
+        if ('APPLICATION' not in runner.cfg and
+                       'open_application' not in runner.cfg): # edit user pyconf
             usercfg = os.path.join(runner.cfg.VARS.personalDir, 
                                    'salomeTools.pyconf')
+            logger.write(_("Openning %s\n" % usercfg), 3)
             src.system.show_in_editor(editor, usercfg, logger)
         else:
             # search for file <application>.pyconf and open it
@@ -791,6 +857,7 @@ def run(args, runner, logger):
                 pyconf_path = os.path.join(path, 
                                     runner.cfg.VARS.application + ".pyconf")
                 if os.path.exists(pyconf_path):
+                    logger.write(_("Openning %s\n" % pyconf_path), 3)
                     src.system.show_in_editor(editor, pyconf_path, logger)
                     break
     
@@ -879,5 +946,13 @@ def run(args, runner, logger):
                             logger.write("%s\n" % appliname)
                             
             logger.write("\n")
-    
+    # case : give a synthetic view of all patches used in the application
+    elif options.show_patchs:
+        src.check_config_has_application(runner.cfg)
+        # Print some informations
+        logger.write(_('Show the patchs of application %s\n') % 
+                    src.printcolors.printcLabel(runner.cfg.VARS.application), 3)
+        logger.write("\n", 2, False)
+        show_patchs(runner.cfg, logger)
+        
     
\ No newline at end of file