import shutil
import src
+import prepare
-# Define all possible option for log command : sat log <options>
+# Define all possible option for patch command : sat patch <options>
parser = src.options.Options()
-parser.add_option('m', 'module', 'list2', 'modules',
- _('modules to get the sources. This option can be'
- ' passed several time to get the sources of several modules.'))
-parser.add_option('', 'no_sample', 'boolean', 'no_sample',
- _("do not prepare sample modules."))
-
-def prepare_for_dev(config, module_info, source_dir, logger, pad):
-
- retcode = 'N\A'
- # if module sources dir does not exists in dev,
- # get it in checkout mode
- if not os.path.exists(module_info.source_dir):
- retcode = get_module_sources(config, module_info, True, source_dir, logger, pad, checkout=True)
- logger.write("\n", 3, False)
- logger.write(" " * (pad+2), 3, False) # +2 because module name is followed by ': '
-
- logger.write('dev: %s ... ' % src.printcolors.printcInfo(module_info.source_dir), 3, False)
+parser.add_option('p', 'product', 'list2', 'products',
+ _('products from which to get the sources. This option can be'
+ ' passed several time to get the sources of several products.'))
+
+def get_source_for_dev(config, product_info, source_dir, logger, pad):
+ '''The method called if the product is in development mode
+
+ :param config Config: The global configuration
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :param source_dir Path: The Path instance corresponding to the
+ directory where to put the sources
+ :param logger Logger: The logger instance to use for the display and logging
+ :param pad int: The gap to apply for the terminal display
+ :return: True if it succeed, else False
+ :rtype: boolean
+ '''
+
+ # Call the function corresponding to get the sources with True checkout
+ retcode = get_product_sources(config,
+ product_info,
+ True,
+ source_dir,
+ logger,
+ pad,
+ checkout=True)
+ logger.write("\n", 3, False)
+ # +2 because product name is followed by ': '
+ logger.write(" " * (pad+2), 3, False)
+
+ logger.write('dev: %s ... ' %
+ src.printcolors.printcInfo(product_info.source_dir), 3, False)
logger.flush()
return retcode
-def prepare_from_git(module_info, source_dir, logger, pad, is_dev=False):
- '''Prepares a module from git
+def get_source_from_git(product_info, source_dir, logger, pad, is_dev=False):
+ '''The method called if the product is to be get in git mode
+
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :param source_dir Path: The Path instance corresponding to the
+ directory where to put the sources
+ :param logger Logger: The logger instance to use for the display and logging
+ :param pad int: The gap to apply for the terminal display
+ :param is_dev boolean: True if the product is in development mode
+ :return: True if it succeed, else False
+ :rtype: boolean
'''
+ # The str to display
coflag = 'git'
- if is_dev and 'repo_dev' in module_info.git_info:
+ # Get the repository address. (from repo_dev key if the product is
+ # in dev mode.
+ if is_dev and 'repo_dev' in product_info.git_info:
coflag = src.printcolors.printcHighlight(coflag.upper())
- repo_git = module_info.git_info.repo_dev
+ repo_git = product_info.git_info.repo_dev
else:
- repo_git = module_info.git_info.repo
+ repo_git = product_info.git_info.repo
-
- logger.write('%s:%s' % (coflag, src.printcolors.printcInfo(repo_git)), 3, False)
+ # Display informations
+ logger.write('%s:%s' % (coflag, src.printcolors.printcInfo(repo_git)), 3,
+ False)
logger.write(' ' * (pad + 50 - len(repo_git)), 3, False)
- logger.write(' tag:%s' % src.printcolors.printcInfo(module_info.git_info.tag), 3, False)
- logger.write(' %s. ' % ('.' * (10 - len(module_info.git_info.tag))), 3, False)
+ logger.write(' tag:%s' % src.printcolors.printcInfo(
+ product_info.git_info.tag),
+ 3,
+ False)
+ logger.write(' %s. ' % ('.' * (10 - len(product_info.git_info.tag))), 3,
+ False)
logger.flush()
logger.write('\n', 5, False)
+ # Call the system function that do the extraction in git mode
retcode = src.system.git_extract(repo_git,
- module_info.git_info.tag,
+ product_info.git_info.tag,
source_dir, logger)
return retcode
-def prepare_from_archive(module_info, source_dir, logger):
+def get_source_from_archive(product_info, source_dir, logger):
+ '''The method called if the product is to be get in archive mode
+
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :param source_dir Path: The Path instance corresponding to the
+ directory where to put the sources
+ :param logger Logger: The logger instance to use for the display and logging
+ :return: True if it succeed, else False
+ :rtype: boolean
+ '''
# check archive exists
- if not os.path.exists(module_info.archive_info.archive_name):
- raise src.SatException(_("Archive not found: '%s'") % module_info.archive_info.archive_name)
-
- logger.write('arc:%s ... ' % src.printcolors.printcInfo(module_info.archive_info.archive_name), 3, False)
+ if not os.path.exists(product_info.archive_info.archive_name):
+ raise src.SatException(_("Archive not found: '%s'") %
+ product_info.archive_info.archive_name)
+
+ logger.write('arc:%s ... ' %
+ src.printcolors.printcInfo(product_info.archive_info.archive_name),
+ 3,
+ False)
logger.flush()
- retcode, NameExtractedDirectory = src.system.archive_extract(module_info.archive_info.archive_name,
- source_dir.dir(), logger)
+ # Call the system function that do the extraction in archive mode
+ retcode, NameExtractedDirectory = src.system.archive_extract(
+ product_info.archive_info.archive_name,
+ source_dir.dir(), logger)
- # Rename the source directory if it does not match with module_info.source_dir
- if NameExtractedDirectory.replace('/', '') != os.path.basename(module_info.source_dir):
- shutil.move(os.path.join(os.path.dirname(module_info.source_dir), NameExtractedDirectory), module_info.source_dir)
+ # Rename the source directory if
+ # it does not match with product_info.source_dir
+ if (NameExtractedDirectory.replace('/', '') !=
+ os.path.basename(product_info.source_dir)):
+ shutil.move(os.path.join(os.path.dirname(product_info.source_dir),
+ NameExtractedDirectory),
+ product_info.source_dir)
return retcode
-def get_module_sources(config, module_info, is_dev, source_dir, logger, pad, checkout=False):
- '''Get the module sources.
+def get_source_from_cvs(user, product_info, source_dir, checkout, logger, pad):
+ '''The method called if the product is to be get in cvs mode
+ :param user str: The user to use in for the cvs command
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :param source_dir Path: The Path instance corresponding to the
+ directory where to put the sources
+ :param checkout boolean: If True, get the source in checkout mode
+ :param logger Logger: The logger instance to use for the display and logging
+ :param pad int: The gap to apply for the terminal display
+ :return: True if it succeed, else False
+ :rtype: boolean
'''
- if not checkout and is_dev:
- return prepare_for_dev(config, module_info, source_dir, logger, pad)
+ # Get the protocol to use in the command
+ if "protocol" in product_info.cvs_info:
+ protocol = product_info.cvs_info.protocol
+ else:
+ protocol = "pserver"
+
+ # Construct the line to display
+ if "protocol" in product_info.cvs_info:
+ cvs_line = "%s:%s@%s:%s" % \
+ (protocol, user, product_info.cvs_info.server,
+ product_info.cvs_info.product_base)
+ else:
+ cvs_line = "%s / %s" % (product_info.cvs_info.server,
+ product_info.cvs_info.product_base)
+
+ coflag = 'cvs'
+ if checkout: coflag = src.printcolors.printcHighlight(coflag.upper())
+
+ logger.write('%s:%s' % (coflag, src.printcolors.printcInfo(cvs_line)),
+ 3,
+ False)
+ logger.write(' ' * (pad + 50 - len(cvs_line)), 3, False)
+ logger.write(' src:%s' %
+ src.printcolors.printcInfo(product_info.cvs_info.source),
+ 3,
+ False)
+ logger.write(' ' * (pad + 1 - len(product_info.cvs_info.source)), 3, False)
+ logger.write(' tag:%s' %
+ src.printcolors.printcInfo(product_info.cvs_info.tag),
+ 3,
+ False)
+ # at least one '.' is visible
+ logger.write(' %s. ' % ('.' * (10 - len(product_info.cvs_info.tag))),
+ 3,
+ False)
+ logger.flush()
+ logger.write('\n', 5, False)
- if module_info.get_method == "git":
- return prepare_from_git(module_info, source_dir, logger, pad, is_dev)
+ # Call the system function that do the extraction in cvs mode
+ retcode = src.system.cvs_extract(protocol, user,
+ product_info.cvs_info.server,
+ product_info.cvs_info.product_base,
+ product_info.cvs_info.tag,
+ product_info.cvs_info.source,
+ source_dir, logger, checkout)
+ return retcode
- if module_info.get_method == "archive":
- return prepare_from_archive(module_info, source_dir, logger)
+def get_source_from_svn(user, product_info, source_dir, checkout, logger):
+ '''The method called if the product is to be get in svn mode
+
+ :param user str: The user to use in for the svn command
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :param source_dir Path: The Path instance corresponding to the
+ directory where to put the sources
+ :param checkout boolean: If True, get the source in checkout mode
+ :param logger Logger: The logger instance to use for the display and logging
+ :return: True if it succeed, else False
+ :rtype: boolean
'''
- if module_info.get_method == "cvs":
- cvs_user = common.get_cfg_param(module_info.cvs_info, "cvs_user", config.USER.cvs_user)
- return prepare_from_cvs(cvs_user, module_info, source_dir, checkout, logger, pad)
+ coflag = 'svn'
+ if checkout: coflag = src.printcolors.printcHighlight(coflag.upper())
+
+ logger.write('%s:%s ... ' % (coflag,
+ src.printcolors.printcInfo(
+ product_info.svn_info.repo)),
+ 3,
+ False)
+ logger.flush()
+ logger.write('\n', 5, False)
+ # Call the system function that do the extraction in svn mode
+ retcode = src.system.svn_extract(user,
+ product_info.svn_info.repo,
+ product_info.svn_info.tag,
+ source_dir,
+ logger,
+ checkout)
+ return retcode
- if module_info.get_method == "svn":
- svn_user = common.get_cfg_param(module_info.svn_info, "svn_user", config.USER.svn_user)
- return prepare_from_svn(svn_user, module_info, source_dir, checkout, logger)
-
- if module_info.get_method == "dir":
- return prepare_from_dir(module_info, source_dir, logger)
+def get_product_sources(config,
+ product_info,
+ is_dev,
+ source_dir,
+ logger,
+ pad,
+ checkout=False):
+ '''Get the product sources.
+
+ :param config Config: The global configuration
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :param is_dev boolean: True if the product is in development mode
+ :param source_dir Path: The Path instance corresponding to the
+ directory where to put the sources
+ :param logger Logger: The logger instance to use for the display and logging
+ :param pad int: The gap to apply for the terminal display
+ :param checkout boolean: If True, get the source in checkout mode
+ :return: True if it succeed, else False
+ :rtype: boolean
'''
+ if not checkout and is_dev:
+ return get_source_for_dev(config,
+ product_info,
+ source_dir,
+ logger,
+ pad)
+
+ if product_info.get_source == "git":
+ return get_source_from_git(product_info, source_dir, logger, pad,
+ is_dev)
+
+ if product_info.get_source == "archive":
+ return get_source_from_archive(product_info, source_dir, logger)
- if len(module_info.get_method) == 0:
+ if product_info.get_source == "cvs":
+ cvs_user = config.USER.cvs_user
+ return get_source_from_cvs(cvs_user,
+ product_info,
+ source_dir,
+ checkout,
+ logger,
+ pad)
+
+ if product_info.get_source == "svn":
+ svn_user = config.USER.svn_user
+ return get_source_from_svn(svn_user, product_info, source_dir,
+ checkout,
+ logger)
+
+ if product_info.get_source == "native":
# skip
- logger.write('%s ...' % _("ignored"), 3, False)
- return True
-
- #
- logger.write(_("Unknown get_mehtod %(get)s for module %(module)s") % \
- { 'get': module_info.get_method, 'module': module_info.name }, 3, False)
+ logger.write('%s ' % src.printcolors.printc(src.OK_STATUS),
+ 3,
+ False)
+ msg = _('INFORMATION : Not doing anything because the product'
+ ' is of type "native".\n')
+ logger.write(msg, 3)
+ return True
+
+ if product_info.get_source == "fixed":
+ # skip
+ logger.write('%s ' % src.printcolors.printc(src.OK_STATUS),
+ 3,
+ False)
+ msg = _('INFORMATION : Not doing anything because the product'
+ ' is of type "fixed".\n')
+ logger.write(msg, 3)
+ return True
+
+ # if the get_source is not in [git, archive, cvs, svn, fixed, native]
+ logger.write(_("Unknown get source method \"%(get)s\" for product %(product)s") % \
+ { 'get': product_info.get_source, 'product': product_info.name }, 3, False)
logger.write(" ... ", 3, False)
logger.flush()
return False
-def get_all_module_sources(config, modules, logger):
- '''Get all the module sources.
+def get_all_product_sources(config, products, logger):
+ '''Get all the product sources.
+ :param config Config: The global configuration
+ :param products List: The list of tuples (product name, product informations)
+ :param logger Logger: The logger instance to be used for the logging
+ :return: the tuple (number of success, dictionary product_name/success_fail)
+ :rtype: (int,dict)
'''
+ # Initialize the variables that will count the fails and success
results = dict()
good_result = 0
- max_module_name_len = 1
- if len(modules) > 0:
- max_module_name_len = max(map(lambda l: len(l), modules[0])) + 4
- for module in modules:
- module_name = module[0]
- module_info = module[1]
- source_dir = src.Path(module_info.source_dir)
+ # Get the maximum name length in order to format the terminal display
+ max_product_name_len = 1
+ if len(products) > 0:
+ max_product_name_len = max(map(lambda l: len(l), products[0])) + 4
+
+ # The loop on all the products from which to get the sources
+ for product_name, product_info in products:
+ # get product name, product informations and the directory where to put
+ # the sources
+ if (not (src.product.product_is_fixed(product_info) or
+ src.product.product_is_native(product_info))):
+ source_dir = src.Path(product_info.source_dir)
+ else:
+ source_dir = src.Path('')
- logger.write('%s: ' % src.printcolors.printcLabel(module_name), 3)
- logger.write(' ' * (max_module_name_len - len(module_name)), 3, False)
+ # display and log
+ logger.write('%s: ' % src.printcolors.printcLabel(product_name), 3)
+ logger.write(' ' * (max_product_name_len - len(product_name)), 3, False)
logger.write("\n", 4, False)
- is_dev = "dev_modules" in config.APPLICATION and module_name in config.APPLICATION.dev_modules
- if source_dir.exists() and not is_dev:
- logger.write(" " + _('remove %s') % source_dir, 4)
- logger.write("\n ", 4, False)
- source_dir.rm()
-
- retcode = get_module_sources(config, module_info, is_dev, source_dir, logger, max_module_name_len, checkout=False)
+ # Remove the existing source directory if
+ # the product is not in development mode
+ is_dev = src.product.product_is_dev(product_info)
+ if source_dir.exists():
+ logger.write('%s ' % src.printcolors.printc(src.OK_STATUS),
+ 3,
+ False)
+ msg = _("INFORMATION : Not doing anything because the source"
+ " directory already exists.\n")
+ logger.write(msg, 3)
+ good_result = good_result + 1
+ # Do not get the sources and go to next product
+ continue
+
+ # Call to the function that get the sources for one product
+ retcode = get_product_sources(config,
+ product_info,
+ is_dev,
+ source_dir,
+ logger,
+ max_product_name_len,
+ checkout=False)
'''
- if 'no_rpath' in module_info.keys():
- if module_info.no_rpath:
- hack_no_rpath(config, module_info, logger)
+ if 'no_rpath' in product_info.keys():
+ if product_info.no_rpath:
+ hack_no_rpath(config, product_info, logger)
'''
+
+ # Check that the sources are correctly get using the files to be tested
+ # in product information
+ if retcode:
+ check_OK, wrong_path = check_sources(product_info, logger)
+ if not check_OK:
+ # Print the missing file path
+ msg = _("The required file %s does not exists. " % wrong_path)
+ logger.write(src.printcolors.printcError("\nERROR: ") + msg, 3)
+ retcode = False
# show results
- results[module_name] = retcode
- if retcode == 'N\A':
- res =src.printcolors.printc(src.OK_STATUS) + src.printcolors.printcWarning(_(' source directory already exists'))
- good_result = good_result + 1
- elif retcode:
+ results[product_name] = retcode
+ if retcode:
+ # The case where it succeed
+
+
res = src.OK_STATUS
good_result = good_result + 1
else:
+ # The case where it failed
res = src.KO_STATUS
-
- logger.write('%s\n' % src.printcolors.printc(res), 3, False)
+
+ # print the result
+ if not(src.product.product_is_fixed(product_info) or
+ src.product.product_is_native(product_info)):
+ logger.write('%s\n' % src.printcolors.printc(res), 3, False)
return good_result, results
+def check_sources(product_info, logger):
+ '''Check that the sources are correctly get, using the files to be tested
+ in product information
+
+ :param product_info Config: The configuration specific to
+ the product to be prepared
+ :return: True if the files exists (or no files to test is provided).
+ :rtype: boolean
+ '''
+ # Get the files to test if there is any
+ if ("present_files" in product_info and
+ "source" in product_info.present_files):
+ l_files_to_be_tested = product_info.present_files.source
+ for file_path in l_files_to_be_tested:
+ # The path to test is the source directory
+ # of the product joined the file path provided
+ path_to_test = os.path.join(product_info.source_dir, file_path)
+ logger.write(_("\nTesting existence of file: \n"), 5)
+ logger.write(path_to_test, 5)
+ if not os.path.exists(path_to_test):
+ return False, path_to_test
+ logger.write(src.printcolors.printcSuccess(" OK\n"), 5)
+ return True, ""
+
+def description():
+ '''method that is called when salomeTools is called with --help option.
+
+ :return: The text to display for the source command description.
+ :rtype: str
+ '''
+ return _("The source command gets the sources of the application products "
+ "from cvs, git, an archive or a directory..")
+
def run(args, runner, logger):
'''method that is called when salomeTools is called with source parameter.
'''
# check that the command has been called with an application
src.check_config_has_application( runner.cfg )
- logger.write(_('Preparing sources of product %s\n') %
- src.printcolors.printcLabel(runner.cfg.VARS.application), 1)
- src.printcolors.print_value(logger, 'out_dir',
- runner.cfg.APPLICATION.out_dir, 2)
+ # Print some informations
+ logger.write(_('Getting sources of the application %s\n') %
+ src.printcolors.printcLabel(runner.cfg.VARS.application), 1)
+ src.printcolors.print_value(logger, 'workdir',
+ runner.cfg.APPLICATION.workdir, 2)
logger.write("\n", 2, False)
-
- if options.modules is None:
- modules = runner.cfg.APPLICATION.modules
- else:
- modules = options.modules
- for m in modules:
- if m not in runner.cfg.APPLICATION.modules:
- raise src.SatException(_("Module %(module)s not defined in product %(product)s") %
- { 'module': m, 'product': runner.cfg.VARS.product} )
+
+ # Get the products list with products informations regarding the options
+ products_infos = prepare.get_products_list(options, runner.cfg, logger)
- modules_infos = src.module.get_modules_infos(modules, runner.cfg)
-
-
- if options.no_sample:
- modules_infos = filter(lambda l: not src.module.module_is_sample(l[1]),
- modules_infos)
-
- good_result, results = get_all_module_sources(runner.cfg, modules_infos, logger)
+ # Call to the function that gets all the sources
+ good_result, results = get_all_product_sources(runner.cfg,
+ products_infos,
+ logger)
+ # Display the results (how much passed, how much failed, etc...)
status = src.OK_STATUS
details = []
logger.write("\n", 2, False)
- if good_result == len(modules):
+ if good_result == len(products_infos):
res_count = "%d / %d" % (good_result, good_result)
else:
status = src.KO_STATUS
- res_count = "%d / %d" % (good_result, len(modules))
+ res_count = "%d / %d" % (good_result, len(products_infos))
- for module in results:
- if results[module] == 0 or results[module] is None:
- details.append(module)
+ for product in results:
+ if results[product] == 0 or results[product] is None:
+ details.append(product)
- result = len(modules) - good_result
+ result = len(products_infos) - good_result
# write results
- logger.write(_("Preparing of product's sources:"), 1)
+ logger.write(_("Getting sources of the application:"), 1)
logger.write(" " + src.printcolors.printc(status), 1, False)
logger.write(" (%s)\n" % res_count, 1, False)
if len(details) > 0:
- logger.write(_("Following sources haven't been prepared:\n"), 2)
+ logger.write(_("Following sources haven't been get:\n"), 2)
logger.write(" ".join(details), 2)
logger.write("\n", 2, False)