3 # Copyright (C) 2010-2012 CEA/DEN
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 # Define all possible option for the make command : sat make <options>
28 parser = src.options.Options()
29 parser.add_option('j', 'jobs_config', 'string', 'jobs_cfg',
30 _('Mandatory: The name of the config file that contains'
31 ' the jobs configuration'))
32 parser.add_option('', 'name', 'string', 'job',
33 _('Mandatory: The job name from which to execute commands.'), "")
36 '''method that is called when salomeTools is called with --help option.
38 :return: The text to display for the job command description.
41 return _("Executes the commands of the job defined"
42 " in the jobs configuration file\n\nexample:\nsat job "
43 "--jobs_config my_jobs --name my_job")
45 def run(args, runner, logger):
46 '''method that is called when salomeTools is called with job parameter.
50 (options, args) = parser.parse_args(args)
52 l_cfg_dir = runner.cfg.PATHS.JOBPATH
54 # Make sure the jobs_config option has been called
55 if not options.jobs_cfg:
56 message = _("The option --jobs_config is required\n")
57 logger.write(src.printcolors.printcError(message))
60 # Make sure the name option has been called
62 message = _("The option --name is required\n")
63 logger.write(src.printcolors.printcError(message))
66 # Find the file in the directories
68 for cfg_dir in l_cfg_dir:
69 file_jobs_cfg = os.path.join(cfg_dir, options.jobs_cfg)
70 if not file_jobs_cfg.endswith('.pyconf'):
71 file_jobs_cfg += '.pyconf'
73 if not os.path.exists(file_jobs_cfg):
80 msg = _("The file configuration %(name_file)s was not found."
81 "\nUse the --list option to get the possible files.")
82 src.printcolors.printcError(msg)
86 (_("Platform"), runner.cfg.VARS.dist),
87 (_("File containing the jobs configuration"), file_jobs_cfg)
89 src.print_info(logger, info)
91 # Read the config that is in the file
92 config_jobs = src.read_config_from_a_file(file_jobs_cfg)
94 # Find the job and its commands
96 for job in config_jobs.jobs:
97 if job.name == options.job:
98 commands = job.commands
102 msg = _("Impossible to find the job \"%(job_name)s\" in "
103 "%(jobs_config_file)s" % {"job_name" : options.job,
104 "jobs_config_file" : file_jobs_cfg})
105 logger.write(src.printcolors.printcError(msg) + "\n")
108 # Find the maximum length of the commands in order to format the display
109 len_max_command = max([len(cmd) for cmd in commands])
111 # Loop over the commands and execute it
114 for command in commands:
115 specific_option = False
116 # Determine if it is a sat command or a shell command
117 cmd_exe = command.split(" ")[0] # first part
119 # use the salomeTools parser to get the options of the command
120 sat_parser = salomeTools.parser
121 (options, argus) = sat_parser.parse_args(command.split(' ')[1:])
122 # Verify if there is a changed option
123 for attr in dir(options):
124 if attr.startswith("__"):
126 if options.__getattr__(attr) != None:
127 specific_option = True
128 sat_command_name = argus[0]
129 end_cmd = " ".join(argus[1:])
131 sat_command_name = "shell"
132 end_cmd = "--command " + command
134 # Do not change the options if no option was called in the command
135 if not(specific_option):
138 # Get dynamically the command function to call
139 sat_command = runner.__getattr__(sat_command_name)
140 logger.write("Executing " +
141 src.printcolors.printcLabel(command) + " ", 3)
142 logger.write("." * (len_max_command - len(command)) + " ", 3)
148 # Execute the command
149 code = sat_command(end_cmd,
153 logger_add_link = logger)
154 except Exception as e:
159 __, __, exc_traceback = sys.exc_info()
160 fp = tempfile.TemporaryFile()
161 traceback.print_tb(exc_traceback, file=fp)
164 logger.add_link(_("Dead Link"),
167 "ERROR: %s TRACEBACK: %s" % (error,
168 stack.replace('"',"'")))
170 # Print the status of the command
173 logger.write('%s\n' % src.printcolors.printc(src.OK_STATUS), 3)
176 logger.write('%s %s\n' % (src.printcolors.printc(src.KO_STATUS),
179 logger.write('stack: %s\n' % stack, 3)
181 # Print the final state
187 logger.write(_("\nCommands: %(status)s (%(valid_result)d/%(nb_products)d)\n") % \
188 { 'status': src.printcolors.printc(final_status),
189 'valid_result': nb_pass,
190 'nb_products': len(commands) }, 3)