# 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/6/7... kill ... or not ? TODO wait and see REX
+ port = os.getenv('SAT_PORT_LOG', '8765')
+ for proc in psutil.process_iter():
+ # help(proc)
+ cmdline = " ".join(proc.cmdline())
+ if "python3 -m http.server %s" % port in cmdline:
+ print("kill previous process '%s'" % cmdline)
+ proc.kill() # TODO may be not owner ? -> change 8766/7/8... as SAT_PORT_LOG
+
+ cmd = """
+set -x
+cd %(path)s
+python3 -m http.server %(port)s &> /dev/null &
+%(editor)s http://localhost:%(port)s/%(namefile)s
+""" % {"path": path, "editor": editor, "namefile": namefile, 'port': port}
+
+ # 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, _ = p.communicate() # _ = 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
def git_extract(from_what, tag, git_options, where, logger, environment=None):
'''Extracts sources from a git repository.
-
+87
:param from_what str: The remote git repository.
:param tag str: The tag.
:param git_options str: git options
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)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method="html" /> <!-- encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>-->
+<xsl:output method="html" />
+<!-- encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>-->
<xsl:template match="/">
<head>
- <title>SAlomeTools log</title>
- <style type="text/css">
- table { width : 100%;
- margin:1px;
- padding:1px;
- border-collapse:collapse;
- empty-cells : show;
- }
- td { vertical-align : center; padding: 15px; }
- 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;}
- hr.note { color: #BFBFBF; }
- .note { text-align : right; font-style: italic; font-size: small; }
- div.release { -moz-column-count: 2;
- overflow: auto;
- max-height: 250px;
- }
- .OK2 { color:#00AA00; }
- .KO2 { color:#FF0000; }
- </style>
- <script language="JavaScript"><![CDATA[
- function Toggle(id) {
- var element = document.getElementById(id);
+ <title>SAlomeTools log</title>
+ <style type="text/css">
+ table { width : 100%;
+ margin:1px;
+ padding:1px;
+ border-collapse:collapse;
+ empty-cells : show;
+ }
+ 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: 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; overflow: auto; max-height: 250px; }
+ .OK2 { color:#00AA00; }
+ .KO2 { color:#FF0000; }
+ </style>
+ <script language="JavaScript"><![CDATA[
+ function Toggle(id) {
+ var element = document.getElementById(id);
- if ( element.style.display == "none" )
- element.style.display = "block";
- else
- element.style.display = "none";
- }
- ]]>
- </script>
+ if ( element.style.display == "none" )
+ element.style.display = "block";
+ else
+ element.style.display = "none";
+ }
+]]>
+ </script>
</head>
- <body class="def" bgcolor="aliceblue">
- <h1><img src="LOGO-SAT.png"/></h1>
- <table border="1">
- <tr>
- <xsl:for-each select="SATcommand/Site/@*">
- <td bgcolor="LightBlue">
- <b><xsl:value-of select="name(.)"/></b>
- </td>
- </xsl:for-each>
- </tr>
- <tr>
- <xsl:for-each select="SATcommand/Site/@*">
- <td bgcolor="Beige"><xsl:value-of select="."/></td>
- </xsl:for-each>
- </tr>
- </table>
-
- <h1>command's internal traces
- <a href="#">
- <xsl:attribute name="onclick">javascript:Toggle('log')</xsl:attribute>
- <xsl:attribute name="title">Click to expand or collapse the command log</xsl:attribute>
- expand / collapse
- </a>
- </h1>
-
- <div style="display:none"><xsl:attribute name="id">log</xsl:attribute>
- <PRE><xsl:value-of select="SATcommand/Log"/></PRE>
- </div>
-
- <h1>Links</h1>
- <table border="1">
- <xsl:for-each select="SATcommand/Links/link">
- <tr>
- <td bgcolor="Beige">
- <xsl:if test="@passed='0'">
- <a>
- <xsl:attribute name="title">Click for more information</xsl:attribute>
- <xsl:attribute name="class">OK2</xsl:attribute>
- <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>
- <xsl:value-of select="@command"/>
- </a>
- </xsl:if>
- <xsl:if test="@passed!='0'">
- <a>
- <xsl:attribute name="title">Click for more information</xsl:attribute>
- <xsl:attribute name="class">KO2</xsl:attribute>
- <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>
- <xsl:value-of select="@command"/>
- </a>
- </xsl:if>
- </td>
- <td bgcolor="LightBlue">
- <xsl:value-of select="@launchedCommand"/>
- </td>
- </tr>
- </xsl:for-each>
-
- </table>
-
- <h1>output
- <a target="_blank">
- <xsl:attribute name="title">Click to open in an editor</xsl:attribute>
- <xsl:attribute name="href"><xsl:value-of select="SATcommand/OutLog"/></xsl:attribute>
- <xsl:attribute name="download"><xsl:value-of select="SATcommand/OutLog"/></xsl:attribute>
- log
- </a>
- </h1>
- <xsl:variable name="txtLog">
- <xsl:value-of select="SATcommand/OutLog"/>
- </xsl:variable>
- <iframe src="{$txtLog}" frameborder="0" class="center" width="98%" height="600" scrolling="yes"></iframe>
- <!--<iframe src="{$txtLog}" frameborder="0" class="center" width="98%" height="600" scrolling="yes"></iframe>-->
- </body>
+
+<body class="def" bgcolor="aliceblue">
+ <h1><img src="LOGO-SAT.png"/></h1>
+ <table border="1">
+ <tr>
+ <xsl:for-each select="SATcommand/Site/@*">
+ <td bgcolor="LightBlue">
+ <b><xsl:value-of select="name(.)"/></b>
+ </td>
+ </xsl:for-each>
+ </tr>
+ <tr>
+ <xsl:for-each select="SATcommand/Site/@*">
+ <td bgcolor="Beige"><xsl:value-of select="."/></td>
+ </xsl:for-each>
+ </tr>
+ </table>
+
+ <h1>command's internal traces
+ <a href="#">
+ <xsl:attribute name="onclick">javascript:Toggle('log')</xsl:attribute>
+ <xsl:attribute name="title">Click to expand or collapse the command log</xsl:attribute>
+ expand / collapse
+ </a>
+ </h1>
+
+ <div style="display:none"><xsl:attribute name="id">log</xsl:attribute>
+ <PRE><xsl:value-of select="SATcommand/Log"/></PRE>
+ </div>
+
+ <h1>Links</h1>
+ <table border="1">
+ <xsl:for-each select="SATcommand/Links/link">
+ <tr>
+ <td bgcolor="Beige">
+ <xsl:if test="@passed='0'">
+ <a>
+ <xsl:attribute name="title">Click for more information</xsl:attribute>
+ <xsl:attribute name="class">OK2</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>
+ <xsl:value-of select="@command"/>
+ </a>
+ </xsl:if>
+ <xsl:if test="@passed!='0'">
+ <a>
+ <xsl:attribute name="title">Click for more information</xsl:attribute>
+ <xsl:attribute name="class">KO2</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>
+ <xsl:value-of select="@command"/>
+ </a>
+ </xsl:if>
+ </td>
+ <td bgcolor="LightBlue">
+ <xsl:value-of select="@launchedCommand"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+
+ </table>
+
+ <h1>output
+ <a target="_blank">
+ <xsl:attribute name="title">Click to open in an editor</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="SATcommand/OutLog"/></xsl:attribute>
+ <xsl:attribute name="download"><xsl:value-of select="SATcommand/OutLog"/></xsl:attribute>
+ log
+ </a>
+ </h1>
+ <xsl:variable name="txtLog">
+ <xsl:value-of select="SATcommand/OutLog"/>
+ </xsl:variable>
+ <iframe src="{$txtLog}" frameborder="0" class="center" width="98%" height="600" scrolling="yes"></iframe>
+ <!--<iframe src="{$txtLog}" frameborder="0" class="center" width="98%" height="600" scrolling="yes"></iframe>-->
+</body>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
-
+
<head>
- <title>SAlomeTools log</title>
- <style type="text/css">
- table {
- margin:1px;
- padding:1px;
- border-collapse:collapse;
- empty-cells : show;
- }
- td { vertical-align : center;}
- h1 { text-align : center; font-style: italic; }
- .legend { font-weight : bold;
- text-align : center;
- }
- .def { font-family: 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;
- overflow: auto;
- max-height: 250px;
- }
- </style>
+ <title>SAlomeTools log</title>
+ <style type="text/css">
+ table {
+ margin: 1px;
+ padding: 1px;
+ border-collapse:collapse;
+ empty-cells : show;
+ }
+ 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: 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; overflow: auto; max-height: 250px; }
+ </style>
</head>
- <body class="def" bgcolor="aliceblue">
- <h1><img src="LOGO-SAT.png"/></h1>
- <xsl:choose>
- <xsl:when test="not(LOGlist/@application='None')">
- <h1>Logs of application <xsl:value-of select="LOGlist/@application"/></h1>
- </xsl:when>
- <xsl:otherwise>
- <h1>
- General Logs
- </h1>
- </xsl:otherwise>
- </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>
- </tr>
- <xsl:for-each select="LOGlist/LogCommand">
- <xsl:sort select="." order="descending" />
- <tr bgcolor="aliceblue" width="2">
- <td>
- <a title="log">
- <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>
- <xsl:value-of select="@cmd"/>
- </a>
- </td>
- <td><xsl:value-of select="@date"/></td>
- <td><xsl:value-of select="@hour"/></td>
- <td><xsl:value-of select="@application"/></td>
- <td><xsl:value-of select="@full_command"/></td>
- </tr>
- </xsl:for-each>
- </table>
- </body>
+
+<body class="def" bgcolor="aliceblue">
+ <h1><img src="LOGO-SAT.png"/></h1>
+ <xsl:choose>
+ <xsl:when test="not(LOGlist/@application='None')">
+ <h1>Logs of application <xsl:value-of select="LOGlist/@application"/></h1>
+ </xsl:when>
+ <xsl:otherwise>
+ <h1>
+ General Logs
+ </h1>
+ </xsl:otherwise>
+ </xsl:choose>
+ <table border="1">
+ <tr>
+ <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" />
+ <tr bgcolor="aliceblue" width="2">
+ <td>
+ <a title="log">
+ <xsl:attribute name="href"><xsl:value-of select="."/></xsl:attribute>
+ <xsl:value-of select="@cmd"/>
+ </a>
+ </td>
+ <td><xsl:value-of select="@date"/></td>
+ <td><xsl:value-of select="@hour"/></td>
+ <td><xsl:value-of select="@application"/></td>
+ <td><xsl:value-of select="@full_command"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+</body>
</xsl:template>
</xsl:stylesheet>
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; }