Salome HOME
add the check command
authorSerge Rehbinder <serge.rehbinder@cea.fr>
Fri, 5 Aug 2016 14:25:08 +0000 (16:25 +0200)
committerSerge Rehbinder <serge.rehbinder@cea.fr>
Fri, 5 Aug 2016 14:25:08 +0000 (16:25 +0200)
commands/check.py [new file with mode: 0644]

diff --git a/commands/check.py b/commands/check.py
new file mode 100644 (file)
index 0000000..ecc83a0
--- /dev/null
@@ -0,0 +1,202 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+#  Copyright (C) 2010-2012  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+
+import src
+
+# Define all possible option for the check command :  sat check <options>
+parser = src.options.Options()
+parser.add_option('p', 'products', 'list2', 'products',
+    _('products to configure. This option can be'
+    ' passed several time to configure several products.'))
+
+def get_products_list(options, cfg, logger):
+    '''method that gives the product list with their informations from 
+       configuration regarding the passed options.
+    
+    :param options Options: The Options instance that stores the commands 
+                            arguments
+    :param cfg Config: The global configuration
+    :param logger Logger: The logger instance to use for the display and 
+                          logging
+    :return: The list of (product name, product_informations).
+    :rtype: List
+    '''
+    # Get the products to be prepared, regarding the options
+    if options.products is None:
+        # No options, get all products sources
+        products = cfg.APPLICATION.products
+    else:
+        # if option --products, check that all products of the command line
+        # are present in the application.
+        products = options.products
+        for p in products:
+            if p not in cfg.APPLICATION.products:
+                raise src.SatException(_("Product %(product)s "
+                            "not defined in application %(application)s") %
+                        { 'product': p, 'application': cfg.VARS.application} )
+    
+    # Construct the list of tuple containing 
+    # the products name and their definition
+    products_infos = src.product.get_products_infos(products, cfg)
+    
+    products_infos = [pi for pi in products_infos if not(
+                                     src.product.product_is_native(pi[1]) or 
+                                     src.product.product_is_fixed(pi[1]))]
+    
+    return products_infos
+
+def log_step(logger, header, step):
+    logger.write("\r%s%s" % (header, " " * 20), 3)
+    logger.write("\r%s%s" % (header, step), 3)
+    logger.write("\n==== %s \n" % src.printcolors.printcInfo(step), 4)
+    logger.flush()
+
+def log_res_step(logger, res):
+    if res == 0:
+        logger.write("%s \n" % src.printcolors.printcSuccess("OK"), 4)
+        logger.flush()
+    else:
+        logger.write("%s \n" % src.printcolors.printcError("KO"), 4)
+        logger.flush()
+
+def check_all_products(config, products_infos, logger):
+    '''Execute the proper configuration commands 
+       in each product build directory.
+
+    :param config Config: The global configuration
+    :param products_info list: List of 
+                                 (str, Config) => (product_name, product_info)
+    :param logger Logger: The logger instance to use for the display and logging
+    :return: the number of failing commands.
+    :rtype: int
+    '''
+    res = 0
+    for p_name_info in products_infos:
+        res_prod = check_product(p_name_info, config, logger)
+        if res_prod != 0:
+            res += 1 
+    return res
+
+def check_product(p_name_info, config, logger):
+    '''Execute the proper configuration command(s) 
+       in the product build directory.
+    
+    :param p_name_info tuple: (str, Config) => (product_name, product_info)
+    :param config Config: The global configuration
+    :param logger Logger: The logger instance to use for the display 
+                          and logging
+    :return: 1 if it fails, else 0.
+    :rtype: int
+    '''
+    
+    p_name, p_info = p_name_info
+    
+    # Logging
+    logger.write("\n", 4, False)
+    logger.write("################ ", 4)
+    header = _("Check of %s") % src.printcolors.printcLabel(p_name)
+    header += " %s " % ("." * (20 - len(p_name)))
+    logger.write(header, 3)
+    logger.write("\n", 4, False)
+    logger.flush()
+    
+    # Instantiate the class that manages all the construction commands
+    # like cmake, check, make install, make test, environment management, etc...
+    builder = src.compilation.Builder(config, logger, p_info)
+    
+    # Prepare the environment
+    log_step(logger, header, "PREPARE ENV")
+    res_prepare = builder.prepare()
+    log_res_step(logger, res_prepare)
+    
+    # Execute buildconfigure, configure if the product is autotools
+    # Execute ccheck if the product is ccheck
+    len_end_line = 20
+
+    log_step(logger, header, "CHECK")
+    res = builder.check()
+    log_res_step(logger, res)
+    
+    # Log the result
+    if res > 0:
+        logger.write("\r%s%s" % (header, " " * len_end_line), 3)
+        logger.write("\r" + header + src.printcolors.printcError("KO"))
+        logger.write("==== %(KO)s in check of %(name)s \n" %
+            { "name" : p_name , "KO" : src.printcolors.printcInfo("ERROR")}, 4)
+        logger.flush()
+    else:
+        logger.write("\r%s%s" % (header, " " * len_end_line), 3)
+        logger.write("\r" + header + src.printcolors.printcSuccess("OK"))
+        logger.write("==== %s \n" % src.printcolors.printcInfo("OK"), 4)
+        logger.write("==== Check of %(name)s %(OK)s \n" %
+            { "name" : p_name , "OK" : src.printcolors.printcInfo("OK")}, 4)
+        logger.flush()
+    logger.write("\n", 3, False)
+
+    return res
+
+def description():
+    '''method that is called when salomeTools is called with --help option.
+    
+    :return: The text to display for the check command description.
+    :rtype: str
+    '''
+    return _("The check command executes the \"check\" command in"
+             " the build directory")
+  
+def run(args, runner, logger):
+    '''method that is called when salomeTools is called with check parameter.
+    '''
+    
+    # Parse the options
+    (options, args) = parser.parse_args(args)
+
+    # check that the command has been called with an application
+    src.check_config_has_application( runner.cfg )
+
+    # Get the list of products to treat
+    products_infos = get_products_list(options, runner.cfg, logger)
+    
+    # Print some informations
+    logger.write(_('Executing the check command in the build '
+                                'directories of the application %s\n') % 
+                src.printcolors.printcLabel(runner.cfg.VARS.application), 1)
+    
+    info = [(_("BUILD directory"),
+             os.path.join(runner.cfg.APPLICATION.workdir, 'BUILD'))]
+    src.print_info(logger, info)
+    
+    # Call the function that will loop over all the products and execute
+    # the right command(s)
+    res = check_all_products(runner.cfg, products_infos, logger)
+    
+    # Print the final state
+    nb_products = len(products_infos)
+    if res == 0:
+        final_status = "OK"
+    else:
+        final_status = "KO"
+   
+    logger.write(_("\nCheck: %(status)s (%(valid_result)d/%(nb_products)d)\n") % \
+        { 'status': src.printcolors.printc(final_status), 
+          'valid_result': nb_products - res,
+          'nb_products': nb_products }, 1)    
+    
+    return res 
\ No newline at end of file