Salome HOME
Correct the message when incompatible options are called
[tools/sat.git] / commands / job.py
index cbaf3ea6cd539d31d0153bc0387f98f9f301eb09..f27f7e733363ba4b6dde398d9517f092f75fa878 100644 (file)
 import os
 
 import src
-import jobs
+import salomeTools
 
 # Define all possible option for the make command :  sat make <options>
 parser = src.options.Options()
 parser.add_option('j', 'jobs_config', 'string', 'jobs_cfg', 
-                  _('The name of the config file that contains'
+                  _('Mandatory: The name of the config file that contains'
                   ' the jobs configuration'))
-parser.add_option('', 'job', 'string', 'job',
-    _('The job name from which to execute commands.'), "")
+parser.add_option('', 'name', 'string', 'job',
+    _('Mandatory: The job name from which to execute commands.'), "")
 
 def description():
     '''method that is called when salomeTools is called with --help option.
@@ -36,7 +36,8 @@ def description():
     :rtype: str
     '''
     return _("Executes the commands of the job defined"
-             " in the jobs configuration file")
+             " in the jobs configuration file\n\nexample:\nsat job "
+             "--jobs_config my_jobs --name my_job")
   
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with job parameter.
@@ -44,43 +45,45 @@ def run(args, runner, logger):
     
     # Parse the options
     (options, args) = parser.parse_args(args)
-      
-    jobs_cfg_files_dir = runner.cfg.SITE.jobs.config_path
+         
+    l_cfg_dir = runner.cfg.PATHS.JOBPATH
     
-    # Make sure the path to the jobs config files directory exists 
-    if not os.path.exists(jobs_cfg_files_dir):      
-        logger.write(_("Creating directory %s\n") % 
-                     src.printcolors.printcLabel(jobs_cfg_files_dir), 1)
-        os.mkdir(jobs_cfg_files_dir)
-
     # Make sure the jobs_config option has been called
     if not options.jobs_cfg:
         message = _("The option --jobs_config is required\n")      
-        raise src.SatException( message )
+        logger.write(src.printcolors.printcError(message))
+        return 1
     
-    # Make sure the job option has been called
+    # Make sure the name option has been called
     if not options.job:
-        message = _("The option --job is required\n")      
-        raise src.SatException( message )
+        message = _("The option --name is required\n")      
+        logger.write(src.printcolors.printcError(message))
+        return 1
     
-    # Make sure the invoked file exists
-    file_jobs_cfg = os.path.join(jobs_cfg_files_dir, options.jobs_cfg)
-    if not file_jobs_cfg.endswith('.pyconf'):
-        file_jobs_cfg += '.pyconf'
+    # Find the file in the directories
+    found = False
+    for cfg_dir in l_cfg_dir:
+        file_jobs_cfg = os.path.join(cfg_dir, options.jobs_cfg)
+        if not file_jobs_cfg.endswith('.pyconf'):
+            file_jobs_cfg += '.pyconf'
         
-    if not os.path.exists(file_jobs_cfg):
-        message = _("The file %s does not exist.\n") % file_jobs_cfg
-        logger.write(src.printcolors.printcError(message), 1)
-        message = _("The possible files are :\n")
-        logger.write( src.printcolors.printcInfo(message), 1)
-        for f in sorted(os.listdir(jobs_cfg_files_dir)):
-            if not f.endswith('.pyconf'):
-                continue
-            jobscfgname = f[:-7]
-            logger.write("%s\n" % jobscfgname)
-        raise src.SatException( _("No corresponding file") )
+        if not os.path.exists(file_jobs_cfg):
+            continue
+        else:
+            found = True
+            break
     
-    jobs.print_info(logger, runner.cfg.VARS.dist, file_jobs_cfg)
+    if not found:
+        msg = _("The file configuration %(name_file)s was not found."
+                "\nUse the --list option to get the possible files.")
+        src.printcolors.printcError(msg)
+        return 1
+    
+    info = [
+    (_("Platform"), runner.cfg.VARS.dist),
+    (_("File containing the jobs configuration"), file_jobs_cfg)
+    ]
+    src.print_info(logger, info)
     
     # Read the config that is in the file
     config_jobs = src.read_config_from_a_file(file_jobs_cfg)
@@ -106,33 +109,58 @@ def run(args, runner, logger):
     res = 0
     nb_pass = 0
     for command in commands:
+        specific_option = False
         # Determine if it is a sat command or a shell command
         cmd_exe = command.split(" ")[0] # first part
         if cmd_exe == "sat":
-            sat_command_name = command.split(" ")[1]
-            end_cmd = command.replace(cmd_exe + " " + sat_command_name, "")
+            # use the salomeTools parser to get the options of the command
+            sat_parser = salomeTools.parser
+            input_parser = src.remove_item_from_list(command.split(' ')[1:], "")
+            (options, argus) = sat_parser.parse_args(input_parser)
+            # Verify if there is a changed option
+            for attr in dir(options):
+                if attr.startswith("__"):
+                    continue
+                if options.__getattr__(attr) != None:
+                    specific_option = True
+            sat_command_name = argus[0]
+            end_cmd = " ".join(argus[1:])
         else:
             sat_command_name = "shell"
             end_cmd = "--command " + command
         
-        # Get dynamically the command function to call 
+        # Do not change the options if no option was called in the command
+        if not(specific_option):
+            options = None
+
+        # Get dynamically the command function to call
         sat_command = runner.__getattr__(sat_command_name)
+
         logger.write("Executing " + 
                      src.printcolors.printcLabel(command) + " ", 3)
         logger.write("." * (len_max_command - len(command)) + " ", 3)
         logger.flush()
+        
+        error = ""
+        stack = ""
         # Execute the command
         code = sat_command(end_cmd,
-                                     batch = True,
-                                     verbose = 0,
-                                     logger_add_link = logger)
+                           options = options,
+                           batch = True,
+                           verbose = 0,
+                           logger_add_link = logger)
+            
         # Print the status of the command
         if code == 0:
             nb_pass += 1
             logger.write('%s\n' % src.printcolors.printc(src.OK_STATUS), 3)
         else:
-            res = 1
-            logger.write('%s\n' % src.printcolors.printc(src.KO_STATUS), 3)
+            if sat_command_name != "test":
+                res = 1
+            logger.write('%s %s\n' % (src.printcolors.printc(src.KO_STATUS),
+                                      error), 3)
+            if len(stack) > 0:
+                logger.write('stack: %s\n' % stack, 3)
     
     # Print the final state
     if res == 0:
@@ -140,16 +168,9 @@ def run(args, runner, logger):
     else:
         final_status = "KO"
    
-    logger.write(_("\nCommands: %(status)s (%(valid_result)d/%(nb_products)d)\n\n") % \
+    logger.write(_("\nCommands: %(status)s (%(valid_result)d/%(nb_products)d)\n") % \
         { 'status': src.printcolors.printc(final_status), 
           'valid_result': nb_pass,
           'nb_products': len(commands) }, 3)
     
-    # Print the status and the list of log files
-    logger.write(_("The status and the list of log files "
-                   "used in the command is the following :\n"))
-    logger.write("%i\n" % res, 1)
-    for file_path in logger.l_logFiles:
-        logger.write("%s\n" % file_path, 1)
-    
     return res
\ No newline at end of file