Salome HOME
Get an absolute path for env files in packages.
[tools/sat.git] / commands / prepare.py
index 7e18a2faf6441affb67ed21630d95b84d5ab2515..bdacf4fe486d0396c8b2fc5a702f3cff62b23e71 100644 (file)
 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
 import re
+import os
 
 import src
 
 # Define all possible option for prepare command :  sat prepare <options>
 parser = src.options.Options()
 parser.add_option('p', 'products', 'list2', 'products',
-    _('products to prepare. This option can be'
+    _('Optional: products to prepare. This option can be'
     ' passed several time to prepare several products.'))
 parser.add_option('f', 'force', 'boolean', 'force', 
-    _("force to prepare the products in development mode."))
-parser.add_option('f', 'force_patch', 'boolean', 'force_patch', 
-    _("force to apply patch to the products in development mode."))
+    _("Optional: force to prepare the products in development mode."))
+parser.add_option('', 'force_patch', 'boolean', 'force_patch', 
+    _("Optional: force to apply patch to the products in development mode."))
 
 def get_products_list(options, cfg, logger):
     '''method that gives the product list with their informations from 
@@ -62,7 +63,7 @@ def get_products_list(options, cfg, logger):
     return products_infos
 
 def remove_products(arguments, l_products_info, logger):
-    '''method that removes the products in l_products_info from arguments list.
+    '''function that removes the products in l_products_info from arguments list.
     
     :param arguments str: The arguments from which to remove products
     :param l_products_info list: List of 
@@ -80,6 +81,37 @@ def remove_products(arguments, l_products_info, logger):
         logger.write(product_name + end_text, 1)
     return args
 
+def find_products_already_getted(l_products):
+    '''function that returns the list of products that have an existing source 
+       directory.
+    
+    :param l_products List: The list of products to check
+    :return: The list of product configurations that have an existing source 
+             directory.
+    :rtype: List
+    '''
+    l_res = []
+    for p_name_p_cfg in l_products:
+        __, prod_cfg = p_name_p_cfg
+        if os.path.exists(prod_cfg.source_dir):
+            l_res.append(p_name_p_cfg)
+    return l_res
+
+def find_products_with_patchs(l_products):
+    '''function that returns the list of products that have one or more patches.
+    
+    :param l_products List: The list of products to check
+    :return: The list of product configurations that have one or more patches.
+    :rtype: List
+    '''
+    l_res = []
+    for p_name_p_cfg in l_products:
+        __, prod_cfg = p_name_p_cfg
+        l_patchs = src.get_cfg_param(prod_cfg, "patches", [])
+        if len(l_patchs)>0:
+            l_res.append(p_name_p_cfg)
+    return l_res
+
 def description():
     '''method that is called when salomeTools is called with --help option.
     
@@ -87,7 +119,8 @@ def description():
     :rtype: str
     '''
     return _("The prepare command gets the sources of "
-             "the application products and apply the patches if there is any.")
+             "the application products and apply the patches if there is any."
+             "\n\nexample:\nsat prepare SALOME-master --products KERNEL,GUI")
   
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with prepare parameter.
@@ -114,26 +147,30 @@ def run(args, runner, logger):
     ldev_products = [p for p in products_infos if src.product.product_is_dev(p[1])]
     args_product_opt_clean = args_product_opt
     if not options.force and len(ldev_products) > 0:
-        msg = _("Do not get the source of the following products "
-                "in development mode\nUse the --force option to"
-                " overwrite it.\n")
-        logger.write(src.printcolors.printcWarning(msg), 1)
-        args_product_opt_clean = remove_products(args_product_opt_clean,
-                                                 ldev_products,
-                                                 logger)
-        logger.write("\n", 1)
+        l_products_not_getted = find_products_already_getted(ldev_products)
+        if len(l_products_not_getted) > 0:
+            msg = _("Do not get the source of the following products "
+                    "in development mode\nUse the --force option to"
+                    " overwrite it.\n")
+            logger.write(src.printcolors.printcWarning(msg), 1)
+            args_product_opt_clean = remove_products(args_product_opt_clean,
+                                                     l_products_not_getted,
+                                                     logger)
+            logger.write("\n", 1)
 
     
     args_product_opt_patch = args_product_opt
     if not options.force_patch and len(ldev_products) > 0:
-        msg = _("do not patch the following products "
-                "in development mode\nUse the --force_patch option to"
-                " overwrite it.\n")
-        logger.write(src.printcolors.printcWarning(msg), 1)
-        args_product_opt_patch = remove_products(args_product_opt_patch,
-                                                 ldev_products,
-                                                 logger)
-        logger.write("\n", 1)
+        l_products_with_patchs = find_products_with_patchs(ldev_products)
+        if len(l_products_with_patchs) > 0:
+            msg = _("do not patch the following products "
+                    "in development mode\nUse the --force_patch option to"
+                    " overwrite it.\n")
+            logger.write(src.printcolors.printcWarning(msg), 1)
+            args_product_opt_patch = remove_products(args_product_opt_patch,
+                                                     l_products_with_patchs,
+                                                     logger)
+            logger.write("\n", 1)
 
     # Construct the final commands arguments
     args_clean = args_appli + args_product_opt_clean + " --sources"
@@ -157,12 +194,30 @@ def run(args, runner, logger):
     if do_clean:
         msg = _("Clean the source directories ...")
         logger.write(msg, 3)
-        res_clean = runner.clean(args_clean, batch=True, verbose = 0)
+        logger.flush()
+        res_clean = runner.clean(args_clean, batch=True, verbose = 0,
+                                    logger_add_link = logger)
         if res_clean == 0:
-            logger.write('%s\n\n' % src.printcolors.printc(src.OK_STATUS), 3)
+            logger.write('%s\n' % src.printcolors.printc(src.OK_STATUS), 3)
+        else:
+            logger.write('%s\n' % src.printcolors.printc(src.KO_STATUS), 3)
     if do_source:
-        res_source = runner.source(args_source)
+        msg = _("Get the sources of the products ...")
+        logger.write(msg, 5)
+        res_source = runner.source(args_source,
+                                    logger_add_link = logger)
+        if res_source == 0:
+            logger.write('%s\n' % src.printcolors.printc(src.OK_STATUS), 5)
+        else:
+            logger.write('%s\n' % src.printcolors.printc(src.KO_STATUS), 5)
     if do_patch:
-        res_patch = runner.patch(args_patch)
+        msg = _("Patch the product sources (if any) ...")
+        logger.write(msg, 5)
+        res_patch = runner.patch(args_patch,
+                                    logger_add_link = logger)
+        if res_patch == 0:
+            logger.write('%s\n' % src.printcolors.printc(src.OK_STATUS), 5)
+        else:
+            logger.write('%s\n' % src.printcolors.printc(src.KO_STATUS), 5)
     
     return res_clean + res_source + res_patch
\ No newline at end of file