# open the hat xml in the user editor
if not options.no_browser:
logger.write(_("\nOpening the hat log file %s\n" % xmlHatFilePath), 3)
- src.system.show_in_editor(runner.cfg.USER.browser, xmlHatFilePath, logger)
+ src.system.show_in_webbrowser(runner.cfg.USER.browser, xmlHatFilePath, logger)
else:
logger.write("\nHat log File is %s\n" % xmlHatFilePath, 3)
return 0
git_options= ''
if "git_options" in product_info.git_info:
git_options = product_info.git_info.git_options
- sub_dir = None
+ 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")
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:
+ 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,
+ 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
if product_info.get_source == "git":
return get_source_from_git(config, product_info, source_dir, logger, pad,
- is_dev,env_appli)
+ is_dev, env_appli)
if product_info.get_source == "archive":
return get_source_from_archive(config, 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":
# for native products we check the corresponding system packages are installed
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)
'''
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
if _versionPython < 3:
# python2 previous historic mode
import src.ElementTreePython2 as etree
- DBG.write("ElementTree Python2", etree.__file__, DBG.isDeveloper())
+ DBG.write("ElementTree Python2 %s" % etree.VERSION, etree.__file__, DBG.isDeveloper())
tostring = etree.tostring
else:
# python3 mode
# import xml.etree.ElementTree as etree # native version
import src.ElementTreePython3 as etree # VERSION 1.3.0 plus _serialize 'pretty_xml'
- DBG.write("ElementTree Python3 VERSION 1.3.0", etree.__file__, DBG.isDeveloper())
+ DBG.write("ElementTree Python3 %s" % etree.VERSION, etree.__file__, DBG.isDeveloper())
def tostring(node, encoding='utf-8'):
"""
_debug = [False] #support push/pop for temporary activate debug outputs
-# wambeke is christian at home
-_developers = ["xchristian", "xwambeke"]
-
def isDeveloper():
- """if you are a developer, sometimes you want verbose traces etc."""
- res = src.architecture.get_user() in _developers
- return res
+ """
+ if you are a developer, sometimes you want verbose traces unconditionally
+ export SAT_DEVELOPER_MODE=1 before launch sat command to do that
+ """
+ res = os.getenv("SAT_DEVELOPER_MODE", "0")
+ if res in "YES yes 1 Y y".split():
+ return True
+ else:
+ return False
def indent(text, amount=2, ch=' '):
"""indent multi lines message"""
"""
Format a stack trace and the exception information.
as traceback.format_exception(), without color
- with traceback only if (_debug) or (DBG._user in DBG._developers)
+ with traceback only if (_debug) or (DBG.isDeveloper())
"""
etype, value, tb = sys.exc_info()
res = msg
'''
import os
-import subprocess
+import subprocess as SP
import time
import tarfile
+import psutil
+import time
+
import debug as DBG
import utilsSat as UTS
# launch cmd using subprocess.Popen
cmd = editor % filePath
logger.write('Launched command:\n' + cmd + '\n', 5)
- p = subprocess.Popen(cmd, shell=True)
+ p = SP.Popen(cmd, shell=True)
p.communicate()
except:
logger.write(printcolors.printcError(_("Unable to edit file %s\n")
% filePath), 1)
+def show_in_webbrowser(editor, filePath, logger):
+ '''open filePath using web browser firefox, chromium etc...
+ if file is xml, previous http sever is done before to fix new security problems
+
+ :param editor str: The web browser to use.
+ :param filePath str: The path to the file to open.
+ '''
+ # default editor is firefox
+ if editor is None or len(editor) == 0:
+ editor = 'firefox'
+
+ path, namefile = os.path.split(filePath)
+ basefile, ext = os.path.splitext(namefile)
+
+ # previouly http.server 8765 kill ... or not ? TODO wait and see REX
+ for proc in psutil.process_iter():
+ # help(proc)
+ cmdline = " ".join(proc.cmdline())
+ if "python3 -m http.server 8765" in cmdline:
+ print("kill previous process '%s'" % cmdline)
+ proc.kill() # TODO may be not owner ? -> change 8765+n
+
+ # The argument -u will make it so that stdout and stderr are not buffered
+ # and will be written in real time.
+ cmd = """
+set -x
+cd %(path)s
+python3 -m http.server 8765 &> /dev/null &
+%(editor)s http://localhost:8765/%(namefile)s
+""" % {"path": path, "editor": editor, "namefile": namefile}
+
+ # print("show_in_webbrowser:\n%s" % cmd)
+
+ try:
+ # launch cmd using subprocess.Popen
+ logger.write('Launched command:\n%s\n' % cmd, 5)
+ p = SP.Popen(cmd, shell=True, stdout=SP.PIPE, stderr=SP.STDOUT)
+ res_out, res_err = p.communicate() # res_err = None as stderr=SP.STDOUT
+ # print("Launched command stdout:\n%s" % res_out)
+ except Exception as e:
+ logger.write(printcolors.printcError(_("Unable to display file %s\n%s\n")
+ % (filePath, e)), 1)
+
+
def git_describe(repo_path):
'''Use git describe --tags command to return tag description of the git repository"
:param repo_path str: The git repository to describe
'''
git_cmd="cd %s;git describe --tags" % repo_path
- p = subprocess.Popen(git_cmd, shell=True,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ p = SP.Popen(git_cmd, shell=True, stdin=SP.PIPE, stdout=SP.PIPE, stderr=SP.PIPE)
p.wait()
if p.returncode != 0:
return False
set -x
git clone %(git_options)s %(remote)s %(where)s
res=$?
-if [ $res -eq 0 ]; then touch -d "$(git --git-dir=%(where_git)s log -1 --format=date_format)" %(where)s;fi
+if [ $res -eq 0 ]; then
+ touch -d "$(git --git-dir=%(where_git)s log -1 --format=date_format)" %(where)s
+fi
exit $res
"""
cmd = cmd % {'git_options': git_options, 'remote': from_what, 'tag': tag, 'where': str(where), 'where_git': where_git}
git clone %(git_options)s %(remote)s %(where)s && \
git --git-dir=%(where_git)s --work-tree=%(where)s checkout %(tag)s
res=$?
-git --git-dir=%(where_git)s status|grep HEAD
-if [ $res -eq 0 -a $? -ne 0 ]; then touch -d "$(git --git-dir=%(where_git)s log -1 --format=date_format)" %(where)s;fi
+git --git-dir=%(where_git)s status | grep HEAD
+if [ $res -eq 0 -a $? -ne 0 ]; then
+ touch -d "$(git --git-dir=%(where_git)s log -1 --format=date_format)" %(where)s
+fi
exit $res
"""
cmd = cmd % {'git_options': git_options,
'where_git': where_git}
- cmd=cmd.replace('date_format','"%ai"')
+ cmd=cmd.replace('date_format', '"%ai"')
logger.logTxtFile.write("\n" + cmd + "\n")
logger.logTxtFile.flush()
logger.logTxtFile.write("\n" + command + "\n")
logger.logTxtFile.flush()
- res = subprocess.call(command,
- cwd=str(where.dir()),
- env=environment.environ.environ,
- shell=True,
- stdout=logger.logTxtFile,
- stderr=subprocess.STDOUT)
+ res = SP.call(command, cwd=str(where.dir()),
+ env=environment.environ.environ,
+ shell=True,
+ stdout=logger.logTxtFile,
+ stderr=SP.STDOUT)
return (res == 0)
def svn_extract(user,
logger.write(command + "\n", 5)
logger.logTxtFile.write("\n" + command + "\n")
logger.logTxtFile.flush()
- res = subprocess.call(command,
- cwd=str(where.dir()),
- env=environment.environ.environ,
- shell=True,
- stdout=logger.logTxtFile,
- stderr=subprocess.STDOUT)
+ res = SP.call(command, cwd=str(where.dir()),
+ env=environment.environ.environ,
+ shell=True,
+ stdout=logger.logTxtFile,
+ stderr=SP.STDOUT)
return (res == 0)
def get_pkg_check_cmd(dist_name):
cmd_which_apt=["which", "apt"]
with open(os.devnull, 'w') as devnull:
# 1) we search for apt (debian based systems)
- completed=subprocess.call(cmd_which_apt,stdout=devnull, stderr=subprocess.STDOUT)
+ completed=SP.call(cmd_which_apt,stdout=devnull, stderr=SP.STDOUT)
if completed==0 and linux=="DB":
cmd_is_package_installed=["apt", "list", "--installed"]
else:
# 2) if apt not found search for rpm (redhat)
- completed=subprocess.call(cmd_which_rpm,stdout=devnull, stderr=subprocess.STDOUT) # only 3.8! ,capture_output=True)
+ completed=SP.call(cmd_which_rpm,stdout=devnull, stderr=SP.STDOUT) # only 3.8! ,capture_output=True)
if completed==0 and linux=="RH":
cmd_is_package_installed=["rpm", "-q"]
else:
# also apt do not return status, we need to use grep
# and apt output is too messy for being used
cmd_is_package_installed[-1]+="*" # we don't specify in pyconf the exact name because of version numbers
- p=subprocess.Popen(cmd_is_package_installed,
- stdout=subprocess.PIPE,
- stderr=FNULL)
+ p=SP.Popen(cmd_is_package_installed, stdout=SP.PIPE, stderr=FNULL)
try:
- output = subprocess.check_output(['grep', pkg], stdin=p.stdout)
+ output = SP.check_output(['grep', pkg], stdin=p.stdout)
msg_status=src.printcolors.printcSuccess("OK")
except:
msg_status=src.printcolors.printcError("KO")
msg_status+=" (package is not installed!)\n"
else:
- p=subprocess.Popen(cmd_is_package_installed,
- stdout=subprocess.PIPE,
- stderr=FNULL)
+ p=SP.Popen(cmd_is_package_installed, stdout=SP.PIPE, stderr=FNULL)
output, err = p.communicate()
rc = p.returncode
if rc==0:
with open(log_file_path, 'w') as f:
f.write("<?xml version='1.0' encoding='utf-8'?>\n")
if stylesheet:
- f.write("<?xml-stylesheet type='text/xsl' href='%s'?>\n" % stylesheet)
+ # example as href='./hat.xsl'
+ # as local file xml with local file xsl
+ # with 'python3 -m http.server 8765 &' and
+ # 'chromium-browser http://localhost:8765/hat.xml' or
+ # 'firefox http://localhost:8765/hat.xml'
+ f.write("<?xml-stylesheet type='text/xsl' href='./%s'?>\n" % stylesheet)
pass
res= etree.tostring(self.xmlroot, encoding='utf-8')
f.write(res)
border-collapse:collapse;
empty-cells : show;
}
- td { vertical-align : center; padding: 15px; }
+ td { vertical-align : center; padding: 10px; }
h1 { text-align : center; font-style: italic; font-size: 20px; }
.legend { font-weight : bold;
text-align : center;
}
- .def { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+ .def { font-family: monospace;}
hr.note { color: #BFBFBF; }
.note { text-align : right; font-style: italic; font-size: small; }
div.release { -moz-column-count: 2;
<title>SAlomeTools log</title>
<style type="text/css">
table {
- margin:1px;
- padding:1px;
+ margin: 1px;
+ padding: 1px;
border-collapse:collapse;
empty-cells : show;
}
- td { vertical-align : center;}
+ td { vertical-align : center; text-align : left; font-size: 15px; padding: 5px;}
+ th { vertical-align : center; text-align : left; font-weight : bold; font-size: 18px; padding: 10px;}
h1 { text-align : center; font-style: italic; }
.legend { font-weight : bold;
text-align : center;
}
- .def { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+ .def { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
hr.note { color: #BFBFBF; }
.note { text-align : right; font-style: italic; font-size: small; }
div.release { -moz-column-count: 2;
</xsl:choose>
<table border="1">
<tr>
- <td width="100px" bgcolor="Beige">Command</td><td width="100px" bgcolor="Beige">date</td><td width="100px" bgcolor="Beige">time</td><td bgcolor="Beige">application</td><td bgcolor="Beige">full command</td>
+ <th bgcolor="Beige">Command</th>
+ <th bgcolor="Beige">date</th>
+ <th bgcolor="Beige">time</th>
+ <th bgcolor="Beige">application</th>
+ <th bgcolor="Beige">full command</th>
</tr>
<xsl:for-each select="LOGlist/LogCommand">
<xsl:sort select="." order="descending" />
h4 { text-align : left; font-size: small; font-weight: bold; display: inline; }
h_err { text-align : left; font-size: small; font-weight: normal; display: inline; color: red; }
.legend { text-align : center; }
- .def { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+ .def { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
</style>
h4 { text-align : left; font-size: small; font-weight: bold; display: inline; }
h_err { text-align : left; font-size: small; font-weight: normal; display: inline; color: red; }
.legend { text-align : center; }
- .def { font-family: Arial, Verdana, "Times New Roman", Times, serif; background-color:#FFFFCC;}
+ .def { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif; background-color:#FFFFCC;}
</style>
<head>
<title>Tests of <xsl:value-of select="//product/@name" /></title>
<style type="text/css">
- .def { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+ .def { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
.OK { background-color:#00FF00; }
.KO { background-color:#FF0000; }
.KF { background-color:#FFA500; }
<head>
<title>Tests of <xsl:value-of select="//product/@name" /></title>
<style type="text/css">
- .def { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+ .def { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
.OK { background-color:#00FF00; }
.KO { background-color:#FF0000; }
.KF { background-color:#FFA500; }