fix: stop using "magic" numbers in string operations for the copyannofile2log feature fix
authortimothy.murphy@nokia.com
Thu, 25 Mar 2010 13:43:28 +0000
branchfix
changeset 408 a819f9223567
parent 407 bda21097164c
child 409 1b444ea0baec
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.
sbsv2/raptor/RELEASE-NOTES.txt
sbsv2/raptor/python/raptor_make.py
sbsv2/raptor/test/smoke_suite/annofile2log.py
--- 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%.*"
+		"^ *.?"
                 ]