sbsv2/raptor/python/plugins/filter_clean.py
author timothy.murphy@nokia.com
Fri, 12 Feb 2010 14:57:02 +0200
branchfix
changeset 204 a19456c07783
parent 20 d1f6767eec1a
permissions -rw-r--r--
fix: failure of make engine test when a make engine alias contains a modifier. There can be more than one variant per alias via "." e.g. make.extrastuff where make and extrastuff are variants.

#
# 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, "file")
				elif line.startswith("<build>"):
					self.doFile(line, "build")
				elif line.startswith("<resource>"):
					self.doFile(line, "resource")
				elif line.startswith("<bitmap>"):
					self.doFile(line, "bitmap")
				elif line.startswith("<stringtable>"):
					self.doFile(line, "stringtable")
						
			if self.removeExports:
				if line.startswith("<export "):
					self.doExport(line)
				elif line.startswith("<member>"):
					self.doFile(line, "member")
				elif line.startswith("<zipmarker>"):
					self.doFile(line, "zipmarker")
				
		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)
				
				directory = os.path.dirname(path)
				if os.path.isdir(directory):
					dirs.add(directory)
					
			self.tmp.close()	# this also deletes the temporary file
		except Exception,e:
			sys.stderr.write("sbs: problem reading temporary file for FilterClean: %s\n" % str(e))
			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, tagname):
		"deal with <tagname>X</tagname>"
		
		first = len(tagname) + 2	# line is "<tagname>filename</tagname>
		last = -(first + 1)
		filename = line[first:last]                
		filename = filename.strip("\"\'")    # some names are quoted
		self.saveItem(filename)
				

	def doExport(self, line):
		"deal with <export destination='X' source='Y'/>"
		filename = line[21:line.find("'", 21)]
		self.saveItem(filename)


# the end