#
# BusyB, an automated build utility.
#
# Copyright (C) 1997-2003
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#
import os
import fnmatch
import time
import FileVisitor
from Trigger import Trigger
from Int import Int
from Dir import Dir
from busybee.TriggerState import TriggerState
from busybee import SymbolManager
class WhenFilesChange(Trigger):
def __init__(self):
Trigger.__init__(self)
print 'new When files change'
self.n = Int(-1)
self.dirs=[]
self.includes=[]
self.excludes=[]
self.markerFile='marker'
self.grace=Int(5)
self.dir = os.path.abspath(".")
self.fileChanged=0
self.triggeringFile=''
def setDir(self, d):
dir = d.getAbsPath()
self.dirs.append(d)
def setGrace(self, g):
self.grace = g
#
# Add a pattern to be excluded from consideration.
#
def addExclude(self, ex):
self.excludes.append(ex)
#
# Add a pattern to be included.
#
def addInclude(self, pat):
self.includes.append(pat)
#
# Return true if the trigger should fire.
# In the case of this trigger, check for changed files.
#
def shouldFire(self):
print 'should Fire?'
self.fileChanged=0
self.triggeringFile=''
logDir=SymbolManager.getInstance().getSymbol( "LogDir" )
markerFile = os.path.join( os.path.abspath(logDir), self.markerFile)
print 'markerFile: ', markerFile
visitor = FileVisitor.NewerFileVisitor( markerFile,
self.dirFunc, self.fileFunc )
for d in self.dirs:
if visitor.visit( d.getAbsPath()):
break
print 'return ', self.fileChanged
return TriggerState( self.fileChanged, self.triggeringFile )
#
# Set the name of the file that we use to keep track of
# the last time the trigger fired.
#
def setMarkerFile(self, m):
self.markerFile = m
#
# Treat dirs just like files.
#
def dirFunc( self, path ):
self.fileFunc(path)
#
# Callback for files which are older than the marker.
#
def fileFunc( self, path ):
path = os.path.normpath(path)
print 'looking at ', path
if self.isMarker(path):
return None
if ( self.isExcluded(path) ):
return None
print 'build triggered by ', path
self.triggeringFile=path
self.getLogger().writeln( "Build triggered by change to: " + path )
self.getLogger().writeln( "Waiting for grace period of: " + str(self.grace) )
self.updateMarkerFile()
time.sleep(self.grace.getN())
self.fileChanged=1
return 1
#
# Touch the marker file
#
def updateMarkerFile(self):
f=open(self.markerFile, "w")
f.close()
#
# Return true if this is the marker file.
#
def isMarker(self, path):
if ( self.markerFile == path ):
return 1
return None
#
# Return true if this path should be excluded
# Essentially, a path is excluded if it matches
# something in the excluded list and desn't match
# anything in the included list.
#
def isExcluded(self, path):
if self.matchesList( path, self.includes ):
if self.matchesList( path, self.excludes ):
print 'path: excluded:', path
return 1
else:
return 0
return 1
#
# Return true if this path matches a pattern in the list
#
def matchesList(self, path, patList):
for pat in patList:
if fnmatch.fnmatch(path, pat.getText()):
return 1
return 0
def __str__(self):
return "file changed Trigger\n"
|