fix: stop using "magic" numbers in string operations for the copyannofile2log feature
fix: When using the copylogfromannofile workaround, extract the build ID and build duration and add to the log as these are useful for analysis. The log should now be identical to the stdout file.
fix: Remove extra blank lines from output in copylogfromannofile mode.
--- a/sbsv2/raptor/RELEASE-NOTES.txt Thu Mar 25 11:54:36 2010 +0000
+++ b/sbsv2/raptor/RELEASE-NOTES.txt Thu Mar 25 13:43:28 2010 +0000
@@ -1,9 +1,18 @@
Release Notes for Symbian Build System v2
+
+
next version
+- Fix: in copylogfromannofile mode, ensure that the build id and duration are included in the log. These are not critical but are useful.
+- Fix: remove unnecessary empty lines in log output in copylogfromannofile mode.
+
+
+version 2.12.5
+
+Defect Fixes:
- Fix: Workaround for emake engine log corruption when clockskew errors occur (annofile2log).
Allow Raptor to obtain log from emake annotation file where it is uncorrupted. A new
- Make engine option "copyannofile2log" enables/disables this mode for emake. If this option is disabled
+ Make engine option "copylogfromannofile" enables/disables this mode for emake. If this option is disabled
or if no annotation file is specified for the build then Raptor reads logs directly as normal.
- SF Bug 2125 - [Raptor] - tracecompiler what output incorrect if mmp basename contains '.' e.g. fred.prd.mmp
- SF Bug 2191 - [Raptor] - When forcesuccess is enabled, exit status for a failed recipe is "retry" but should be "failed"
--- a/sbsv2/raptor/python/raptor_make.py Thu Mar 25 11:54:36 2010 +0000
+++ b/sbsv2/raptor/python/raptor_make.py Thu Mar 25 13:43:28 2010 +0000
@@ -37,7 +37,19 @@
class BadMakeEngineException(Exception):
pass
+def string_following(prefix, str):
+ """If str starts with prefix then return the rest of str, otherwise None"""
+ if str.startswith(prefix):
+ return str[len(prefix):]
+ else:
+ return None
+
def XMLEscapeLog(stream):
+ """ A generator that reads a raptor log from a stream and performs an XML escape
+ on all text between tags, which is usually make output that could contain
+ illegal characters that upset XML-based log parsers.
+ This function yields "xml-safe" output line by line.
+ """
inRecipe = False
for line in stream:
@@ -54,22 +66,50 @@
yield escape(line)
def AnnoFileParseOutput(annofile):
+ """ A generator that extracts log output from an emake annotation file,
+ perform an XML-unescape on it and "yields" it line by line. """
af = open(annofile, "r")
inOutput = False
inParseJob = False
+
+ buildid = ""
for line in af:
line = line.rstrip("\n\r")
+
if not inOutput:
- if line.startswith("<output>"):
+ o = string_following("<output>", line)
+ if not o:
+ o = string_following('<output src="prog">', line)
+
+ if o:
inOutput = True
- yield unescape(line[8:])+'\n'
- # This is make output so don't unescape it.
- elif line.startswith('<output src="prog">'):
- line = line[19:]
- inOutput = True
- yield unescape(line)+'\n'
+ yield unescape(o)+'\n'
+ continue
+
+
+ o = string_following('<build id="',line)
+ if o:
+ buildid = o[:o.find('"')]
+ yield "Starting build: "+buildid+"\n"
+ continue
+
+ o = string_following('<metric name="duration">', line)
+ if o:
+ secs = int(o[:o.find('<')])
+ if secs != 0:
+ duration = "%d:%d" % (secs/60, secs % 60)
+ else:
+ duration = "0:0"
+ continue
+
+
+ o = string_following('<metric name="clusterAvailability">', line)
+ if o:
+ availability = o[:o.find('<')]
+ continue
+
else:
end_output = line.find("</output>")
@@ -77,8 +117,10 @@
line = line[:end_output]
inOutput = False
- yield unescape(line)+'\n'
+ if line != "":
+ yield unescape(line)+'\n'
+ yield "Finished build: %s Duration: %s (m:s) Cluster availability: %s%%\n" %(buildid,duration,availability)
af.close()
@@ -140,8 +182,8 @@
if self.copyLogFromAnnoFile:
for o in self.raptor.makeOptions:
- if o.startswith("--emake-annofile="):
- self.annoFileName = o[17:]
+ self.annoFileName = string_following("--emake-annofile=", o)
+ if self.annoFileName:
self.raptor.Info("annofile: " + o)
if not self.annoFileName:
--- a/sbsv2/raptor/test/smoke_suite/annofile2log.py Thu Mar 25 11:54:36 2010 +0000
+++ b/sbsv2/raptor/test/smoke_suite/annofile2log.py Thu Mar 25 13:43:28 2010 +0000
@@ -24,16 +24,12 @@
t.usebash = True
t.errors = 0
- t.returncode = 1
+ t.returncode = 0
t.exceptions = 0
t.command = "cd smoke_suite/test_resources/annofile2log && ( diff -wB <(python testanno2log.py <(bzip2 -dc scrubbed_ncp_dfs_resource.anno.bz2)) <(bzip2 -dc scrubbed_ncp_dfs_resource.stdout.bz2))"
t.mustmatch_multiline = [
- ".*1a2.*" +
- "Starting build: 488235.{1,3}" +
- "14009c12884.{1,4}" +
- "---.{1,4}" +
- "Finished build: 488235 Duration: 1:15 \(m:s\) Cluster availability: 100%.*"
+ "^ *.?"
]