sbsv2/raptor/python/plugins/filter_copyfile.py
changeset 18 de5b887c98f7
equal deleted inserted replaced
14:eb060913c963 18:de5b887c98f7
       
     1 #
       
     2 # Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of the License "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description: 
       
    15 # Filter class for copying files in serial in python. This
       
    16 # is important in cluster builds where file copying is 
       
    17 # very inefficient.  
       
    18 # The one-to-many <finalcopy> tag is searched for and copy
       
    19 # instructions are built up in a hash table.
       
    20 # <finalcopy source='sourcefilename'>destfilename1 destfilename2 . . . .destfilenameN</copy>
       
    21 # destinations must be full filenames not directories.
       
    22 #
       
    23 # This filter monitors build progress
       
    24 # via the <progress> tags and flushes copies as build 
       
    25 # stages end (e.g. after resource so resources are ready for the next stage)
       
    26 # 
       
    27 
       
    28 import os
       
    29 import sys
       
    30 import tempfile
       
    31 import filter_interface
       
    32 import shutil
       
    33 import generic_path
       
    34 import stat
       
    35 from raptor_utilities import copyfile
       
    36 
       
    37 class FilterCopyFile(filter_interface.Filter):
       
    38 	
       
    39 	def open(self, params):
       
    40 		"initialise"
       
    41 		
       
    42 		self.ok = True
       
    43 
       
    44 		self.files = {}
       
    45 		
       
    46 		return self.ok
       
    47 	
       
    48 	
       
    49 	def write(self, text):
       
    50 		"process some log text"
       
    51 		
       
    52 		for line in text.splitlines():
       
    53 			if line.startswith("<finalcopy"):
       
    54 				source_start = line.find("source='")
       
    55 				source = line[source_start+8:line.find("'", source_start+8)]
       
    56 				destinations = line[line.find(">",source_start)+1:line.find("</finalcopy>")].split(" ")
       
    57 
       
    58 				if source in self.files:
       
    59 					self.files[source].update(destinations)
       
    60 				else:
       
    61 					self.files[source] = set(destinations)
       
    62 			elif line.startswith("<progress:end object_type='makefile' task='build'"):
       
    63 				self.flushcopies() # perform copies at end of each invocation of the make engine
       
    64 						   # to ensure dependencies are in place for the next one.
       
    65 				
       
    66 		return self.ok
       
    67 	
       
    68 	
       
    69 	def summary(self):
       
    70 		"finish off"
       
    71 		self.flushcopies()
       
    72 		return self.ok
       
    73 
       
    74 	def flushcopies(self):
       
    75 		for source in self.files.keys():
       
    76 			for dest in self.files[source]:
       
    77 				try:
       
    78 					copyfile(source, dest)
       
    79 				except IOError, e:
       
    80 					print "<error>%s</error>" % str(e)
       
    81 		self.files = {}
       
    82 		
       
    83 
       
    84 
       
    85 	def close(self):
       
    86 		"nop"
       
    87 		
       
    88 
       
    89 		return self.ok
       
    90 
       
    91 # the end				
       
    92