#!/usr/bin/env python import sys import os import re import commands from os.path import join, getsize from optparse import OptionParser def getFilesRevs(listPaths): """ Get a list of tuples (file, revNumber) for the list of paths passed as parameter """ listPaths = map( (lambda s: s[-1]!='/' and str(s) +'/' or s) , listPaths) filePattern = re.compile(r"^(.*\.(css|js))$", re.IGNORECASE) revPattern = re.compile(r"\d+", re.IGNORECASE) listFilesRevs = [] for path in listPaths: for root, dirs, files in os.walk(path): files = filter(filePattern.search, files) for name in files: revStr = commands.getoutput('svn info ' + root + name +' | grep "Last Changed Rev" -i') revStr = revPattern.findall(revStr) if len(revStr): # Please notice this is getting the path from specified in the parameters to # a path that the webserver will understand. # In my case "../js/" is the real path and "/js/" the path for the webserver # Tweak this to fit your paths for the static files listFilesRevs.append( (root[root[:-1].find('/'):] + name , revStr[0]) ) if '.svn' in dirs: dirs.remove('.svn') # don't visit SVN directories return listFilesRevs def printPHP(listFilesRevs, pipeName): """ Generates PHP code for the list of tuples (file, revNumber) and outputs it in pipeName paramter """ print >> pipeName, "> pipeName, "" print >> pipeName, "//$productionSite - if set and true, append versions to static files in template 'top.tpl'" print >> pipeName, "$productionSite = true;" print >> pipeName, "" print >> pipeName, "//array with filenames (as used in template 'top.tpl') and file SVN last revision" print >> pipeName, "$staticFilesVersions = array(" for fileRev in listFilesRevs: print >> pipeName, " '" + fileRev[0] + "' => '" + fileRev[1] + "'", if fileRev != listFilesRevs[-1]: print >> pipeName, "," else: print >> pipeName, "" print >> pipeName, ");" print >> pipeName, "?>" def getParameters(): usage = "usage: %program [options]" parser = OptionParser(usage=usage) parser.add_option("-d", "--directory", action="append", metavar="DIR", help="add DIR directory to scan for static files (*.js and *.css)") parser.add_option("-o", "--output", type="string", default="stdout", metavar="FILE", help="specify file to write the output; default standard output") (options,args)=parser.parse_args() if options.directory is None: print "You should specify at least one directory to scan for static files. See --help" sys.exit() if options.output == "stdout": options.output = sys.stdout else: options.output = open(options.output, "w") return options ############################################################################ if __name__ == "__main__": options=getParameters() printPHP(getFilesRevs(options.directory), options.output)