[Buildbot-devel] Useful filtering sample

Dobes Vandermeer dobesv at gmail.com
Mon Oct 31 20:14:42 UTC 2005


I thought it might help people to have an example on how to filter
files by name.  I suppose ideally this would be built into Scheduler -
e.g. by passing a 'fileNameFilters' keyword parameter that then calls
this and sets fileIsImportant.  I'm using perforce syntax so that I
can cut'n'paste from the perforce clientspec, and its a fairly easy
and useful format compared to other wildcards for this purpose.

def mkcheckfunc(p4paths):
    """ Pass in a list of p4-style wildcards.  Use * to select a
wildcard within a folder,
        or ... to select a wildcard that spans all subfolders.  Prefix
a string with a - to
        exclude matching files.  Also you can use any regular
expression syntax except .,
        which is escaped.  The result is a callable that can be passed
as the fileIsImportant
        keyword to Scheduler().
	"""
    import re
    def mkregexStr(p4paths):
        return '|'.join([re.compile(r'\.(?!\*)').sub('\\.',
p4path.replace('*', r'[^/\\]*').replace('...','.*')) for p4path in
p4paths])
    def checkChange(change, regex):
        for f in change.files:
            if regex.match(f): return True
    regexStr = mkregexStr([p for p in p4paths if not p.startswith('-')])
    excludes = [p[1:] for p in p4paths if p.startswith('-')]
    if excludes:
		regexStr = '(?!'+mkregexStr(excludes)+')(?:'+regexStr+')'
    regex = re.compile(regexStr, re.IGNORECASE)
    #print 'regex', regexStr
    return lambda change, regex=regex: checkChange(change, regex)

winBuildFiles = mkcheckfunc([
   '//depot/project/very_useful_stuff/...',
   '//depot/project/mostly_useful/...',
   '-//depot/project/mostly_useful/*.useless',
   '-//depot/project/mostly_useful/....ignoreme',
   '//depot/project/images/....(bmp|ico)'
   '//depot/project/tools/bin/....(exe|dll)'
])

c['schedulers'].append(Scheduler('winbuild', None, 10, ['slave1',
'slave2'], fileIsImportant=winBuildFiles))




More information about the devel mailing list