import os
import shutil
+import re
+import subprocess
import src
import prepare
+import src.debug as DBG
# Define all possible option for patch command : sat patch <options>
parser = src.options.Options()
parser.add_option('p', 'products', 'list2', 'products',
- _('Optional: products from which to get the sources. This option can be'
- ' passed several time to get the sources of several products.'))
+ _('Optional: products from which to get the sources. This option accepts a comma separated list.'))
def get_source_for_dev(config, product_info, source_dir, logger, pad):
'''The method called if the product is in development mode
return retcode
-def get_source_from_git(product_info,
+def get_source_from_git(config,
+ product_info,
source_dir,
logger,
pad,
'''
# The str to display
coflag = 'git'
+ # Get the repository address.
+ # If the application has the repo_dev property
+ # Or if the product is in dev mode
+ # Then we use repo_dev if the key exists
+ coflag = src.printcolors.printcHighlight(coflag.upper())
+ repo_git = None
+ git_server = src.get_git_server(config,logger)
+ product_file = product_info.from_file.split('/').pop()
+ if 'git_info' in product_info and 'repositories' in product_info.git_info:
+ if git_server in product_info.git_info.repositories.keys(): # keys are git servers
+ repo_git = product_info.git_info.repositories[git_server]
+ elif 'properties' in product_info and 'is_opensource' in product_info.properties and product_info.properties.is_opensource == 'yes' :
+ for git_server in product_info.git_info.repositories.keys():
+ if git_server in config.VARS.opensource_git_servers:
+ repo_git = product_info.git_info.repositories[git_server]
+ break
+ elif 'properties' in product_info and not 'is_opensource' in product_info.properties:
+ for git_server in product_info.git_info.repositories.keys():
+ if git_server in config.VARS.opensource_git_servers:
+ repo_git = product_info.git_info.repositories[git_server]
+ logger.warning("Using opensource repository ({}) for product {}".format(git_server, product_info.name))
+ logger.flush()
+ break
+ else:
+ logger.error("Error in configuration file: define git repository for product: {} in file {}".format(product_info.name, product_file))
+ return False
- # 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 = product_info.git_info.repo_dev
+ elif 'repo_dev' in product_info.git_info:
+ repo_git = product_info.git_info.repo_dev
+ elif 'repo' in product_info.git_info:
+ repo_git = product_info.git_info.repo
else:
- repo_git = product_info.git_info.repo
-
+ logger.error("Error in configuration file: define git repository for product: {}".format(product_info.name))
+ return False
+
+ if repo_git is None:
+ logger.error("Error in configuration file: define git repository for product: {} in file {}.".format(product_info.name, product_file))
+ return False
+
# Display informations
logger.write('%s:%s' % (coflag, src.printcolors.printcInfo(repo_git)), 3,
False)
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,
- product_info.git_info.tag,
- source_dir, logger, environ)
+
+ git_options= ''
+ if "git_options" in product_info.git_info:
+ git_options = product_info.git_info.git_options
+
+ sub_dir = None
+ # what do we do with git tree structure and history
+ if is_dev and "sub_dir" in product_info.git_info:
+ logger.error("dev mode for product is incompatible with 'sub_dir' option")
+ return False
+
+ if not is_dev and "sub_dir" in product_info.git_info:
+ sub_dir = product_info.git_info.sub_dir
+
+ if sub_dir is None:
+ # Call the system function that do the extraction in git mode
+ retcode = src.system.git_extract(repo_git,
+ product_info.git_info.tag, git_options,
+ source_dir, logger, environ)
+ else:
+ # Call the system function that do the extraction of a sub_dir in git mode
+ logger.write("sub_dir:%s " % sub_dir, 3)
+ retcode = src.system.git_extract_sub_dir(repo_git,
+ product_info.git_info.tag,git_options,
+ source_dir, sub_dir, logger, environ)
+
+
return retcode
-def get_source_from_archive(product_info, source_dir, logger):
+def get_source_from_archive(config, product_info, source_dir, logger):
'''The method called if the product is to be get in archive 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
:return: True if it succeed, else False
:rtype: boolean
'''
+
+ # check if pip should be used : pip mode id activated if the application and product have pip property
+ if (src.appli_test_property(config,"pip", "yes") and
+ src.product.product_test_property(product_info,"pip", "yes")):
+ pip_msg = "PIP : do nothing, product will be downloaded later at compile time "
+ logger.write(pip_msg, 3)
+ return True
+
# check archive exists
if not os.path.exists(product_info.archive_info.archive_name):
- raise src.SatException(_("Archive not found: '%s'") %
- product_info.archive_info.archive_name)
+ # The archive is not found on local file system (ARCHIVEPATH)
+ # We try ftp!
+ logger.write("\n The archive is not found on local file system, we try ftp\n", 3)
+ ret=src.find_file_in_ftppath(product_info.archive_info.archive_name,
+ config.PATHS.ARCHIVEFTP, config.LOCAL.archive_dir, logger)
+ if ret:
+ # archive was found on ftp and stored in ret
+ product_info.archive_info.archive_name=ret
+ else:
+ raise src.SatException(_("Archive not found in ARCHIVEPATH, nor on ARCHIVEFTP: '%s'") %
+ product_info.archive_info.archive_name)
logger.write('arc:%s ... ' %
src.printcolors.printcInfo(product_info.archive_info.archive_name),
pad)
if product_info.get_source == "git":
- return get_source_from_git(product_info, source_dir, logger, pad,
- is_dev,env_appli)
+ return get_source_from_git(config, product_info, source_dir, logger, pad,
+ is_dev, env_appli)
if product_info.get_source == "archive":
- return get_source_from_archive(product_info, source_dir, logger)
+ return get_source_from_archive(config, product_info, source_dir, logger)
if product_info.get_source == "dir":
return get_source_from_dir(product_info, source_dir, logger)
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,
- env_appli)
+ return get_source_from_cvs(cvs_user, product_info, source_dir,
+ checkout, logger, pad, env_appli)
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,
- env_appli)
+ checkout, logger, env_appli)
if product_info.get_source == "native":
- # skip
- 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
+ # for native products we check the corresponding system packages are installed
+ logger.write("Native : Checking system packages are installed\n" , 3)
+ check_cmd=src.system.get_pkg_check_cmd(config.VARS.dist_name) # (either rmp or apt)
+ run_pkg,build_pkg=src.product.check_system_dep(config.VARS.dist, check_cmd, product_info)
+ result=True
+ for pkg in run_pkg:
+ logger.write(" - " + pkg + " : " + run_pkg[pkg] + '\n', 1)
+ if "KO" in run_pkg[pkg]:
+ result=False
+ for pkg in build_pkg:
+ logger.write(" - " + pkg + " : " + build_pkg[pkg] + '\n', 1)
+ if "KO" in build_pkg[pkg]:
+ result=False
+ if result==False:
+ logger.error("some system dependencies are missing, please install them with "+\
+ check_cmd[0])
+ return result
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)
+ msg = "FIXED : %s\n" % product_info.install_dir
+
+ if not os.path.isdir(product_info.install_dir):
+ logger.warning("The fixed path do not exixts!! Please check it : %s\n" % product_info.install_dir)
+ else:
+ logger.write(msg, 3)
return True
# if the get_source is not in [git, archive, cvs, svn, fixed, native]
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
+ # DBG.write("source.get_all_product_sources config id", id(config), True)
for product_name, product_info in products:
# get product name, product informations and the directory where to put
# the sources
# 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('%s ' % src.printcolors.printc(src.OK_STATUS), 3, False)
+ msg = _("INFO : Not doing anything because the source directory already exists:\n %s\n") % source_dir
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,
+ retcode = get_product_sources(config, product_info, is_dev,
+ source_dir, logger, max_product_name_len,
checkout=False)
'''
def run(args, runner, logger):
'''method that is called when salomeTools is called with source parameter.
'''
+ DBG.write("source.run()", args)
# Parse the options
(options, args) = parser.parse_args(args)
logger.write("\n", 2, False)
# Get the products list with products informations regarding the options
- products_infos = prepare.get_products_list(options, runner.cfg, logger)
+ products_infos = src.product.get_products_list(options, runner.cfg, logger)
# Call to the function that gets all the sources
- good_result, results = get_all_product_sources(runner.cfg,
- products_infos,
- logger)
+ 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