sbsv2/raptor/python/plugins/filter_clean.py
changeset 0 044383f39525
child 3 e1eecf4d390d
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/python/plugins/filter_clean.py	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,170 @@
+#
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+# Filter class for doing CLEAN, CLEANEXPORT and REALLYCLEAN efficiently.
+#
+
+import os
+import sys
+import tempfile
+import filter_interface
+
+class FilterClean(filter_interface.Filter):
+	
+	def open(self, params):
+		"initialise"
+		
+		targets = [x.lower() for x in params.targets]
+		
+		self.removeExports = ("cleanexport" in targets or "reallyclean" in targets)
+		self.removeTargets = ("clean" in targets or "reallyclean" in targets)
+		
+		self.ok = True
+		
+		# create a temporary file to record all the exports and directories
+		# in. We can only remove those after "make" has finished running all
+		# the CLEAN targets.
+		try:
+			self.tmp = tempfile.TemporaryFile()
+		except:
+			sys.stderr.write("sbs: could not create temporary file for FilterClean\n")
+			self.ok = False
+		
+		return self.ok
+	
+	
+	def write(self, text):
+		"process some log text"
+		
+		for line in text.splitlines():
+		
+			if self.removeTargets:
+				if line.startswith("<file>"):
+					self.doFile(line)
+				elif line.startswith("<dir>"):
+					self.doDirectory(line)
+						
+			if self.removeExports:
+				if line.startswith("<export "):
+					self.doExport(line)
+				elif line.startswith("<member>"):
+					self.doMember(line)
+				elif line.startswith("<zipmarker>"):
+					self.doZipMarker(line)
+				
+		return self.ok
+	
+	
+	def summary(self):
+		"finish off"
+		
+		# remove files, remembering directories
+		dirs = set()
+		
+		try:
+			self.tmp.flush()	# write what is left in the buffer
+			self.tmp.seek(0)	# rewind to the beginning
+			
+			for line in self.tmp.readlines():
+				path = line.strip()
+				
+				if os.path.isfile(path):
+					self.removeFile(path)
+					
+				elif os.path.isdir(path):
+					dirs.add(path)
+					
+			self.tmp.close()	# this also deletes the temporary file
+		except:
+			sys.stderr.write("sbs: could not access temporary file for FilterClean\n")
+			self.ok = False
+		
+		# finally remove (empty) directories
+		for dir in dirs:
+			try:
+				os.removedirs(dir)	# may fail if the directory has files in
+			except:
+				pass				# silently ignore all errors
+				
+		return self.ok
+
+
+	def close(self):
+		"nop"
+		
+		return self.ok
+	
+	
+	def removeFile(self, path):
+		try:
+			os.unlink(path)
+		except Exception, e:
+			sys.stderr.write("sbs: could not remove " + path + "\n")
+			sys.stderr.write(str(e) + "\n")
+		
+				
+	def saveItem(self, path):
+		"put path into a temporary file."
+		try:
+			self.tmp.write(path + "\n")
+		except:
+			sys.stderr.write("sbs: could not write temporary file in FilterClean\n")
+			self.ok = False
+	
+			
+	def doFile(self, line):
+		"remove filenames in <file> tags immediately (not .d or .dep)."
+		filename = line[6:-7]                # line is "<file>filename</file>
+		filename = filename.strip("\"\'")    # some names are quoted
+		
+		# dependency files must be deleted at the end,
+		# everything else can be deleted straight away.
+		if filename.endswith(".d") or filename.endswith(".dep"):
+			self.saveItem(filename)
+		else:
+			if os.path.isfile(filename):
+				self.removeFile(filename)
+
+
+	def doDirectory(self, line):
+		"save directories in <dir> tags for the end."
+		# assuming <dir>X</dir>
+		dirname = line[5:-6]
+		self.saveItem(dirname.strip("\"\'"))
+		
+		
+	def doExport(self, line):
+		"save exported files in <export> tags for the end."
+		# assuming <export destination='X' source='Y' />
+		filename = line[21:line.find("'", 21)]
+		self.saveItem(filename)
+		
+		
+	def doMember(self, line):
+		"save zip exports in <member> tags for the end."
+		# assuming <member>X</member>
+		filename = line[8:-9]
+		self.saveItem(filename)
+		
+		
+	def doZipMarker(self, line):
+		"Remove file in <zipmarker> tags"
+		# assuming <zipmarker>X</zipmarker>
+		filename = line[11:-12]
+		if os.path.isfile(filename):
+			self.removeFile(filename)
+
+
+# the end				
+