# HG changeset patch # User timothy.murphy@nokia.com # Date 1269524608 0 # Node ID a819f92235674d64bbf005505e913bf9872faa53 # Parent bda21097164cebe5928160e03b8dc81c1d41b475 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. diff -r bda21097164c -r a819f9223567 sbsv2/raptor/RELEASE-NOTES.txt --- 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" diff -r bda21097164c -r a819f9223567 sbsv2/raptor/python/raptor_make.py --- 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(""): + o = string_following("", line) + if not o: + o = string_following('', line) + + if o: inOutput = True - yield unescape(line[8:])+'\n' - # This is make output so don't unescape it. - elif line.startswith(''): - line = line[19:] - inOutput = True - yield unescape(line)+'\n' + yield unescape(o)+'\n' + continue + + + o = string_following('', 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('', line) + if o: + availability = o[:o.find('<')] + continue + else: end_output = line.find("") @@ -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: diff -r bda21097164c -r a819f9223567 sbsv2/raptor/test/smoke_suite/annofile2log.py --- 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%.*" + "^ *.?" ]