前面一篇我们讲到了StatSVN的简单使用,但是如果每次都要手工去做那些工作,实在麻烦得很。所以这里我们需要写一个脚本,让它定时执行那些操作,这样可以保持报表信息最新的。关于脚本的语言,我选择用了python,哦,又是python,请原谅我,因为最近在学习python,所以什么都想通过python来做。
讲一下主要思路:读取配置文件,取得所需的信息;查看版本库是否存在,不存在则checkout,存在则update;执行svn log生成日期文件;调用java -jar statsvn.jar生成版本库的报表。
开始实现:
1.配置文件两个respository.cfg.xml,statsvn.cfg.xml:
respository.cfg.xml样式
<?xml version="1.0"?><respositoryconfig><respository httpurl = "http://localhost:8080/svn/test" fileurl = "file:///F:/AMP/SVNRespository/test" > <checkoutdir dir = "F:/Test" /> <outputdir dir = "F:/TestReport" /></respository></respositoryconfig>
statsvn.cfg.xml样式
<?xml version="1.0"?><statsvnconfig><svnhome dir = "F:/AMP/Subversion/bin" /><statsvnjar dir = "F:/statsvn.jar" /></statsvnconfig>
2.pytho脚本:
from xml.dom.minidom import parse, parseStringimport os, sys
class respconfig: def __setattr__(self, attr, value): if attr == 'reposhttpurl': self.__dict__[attr] = value elif attr == 'reposfileurl': self.__dict__[attr] = value elif attr == 'checkoutdir': self.__dict__[attr] = value elif attr == 'outputdir': self.__dict__[attr] = value else: raise AttributeError, attr + ' not allowed' def __getattr__(self, attr): if attr == "reposhttpurl": return self.__dict__[attr] elif attr == "reposfileurl": return self.__dict__[attr] elif attr == 'checkoutdir': return self.__dict__[attr] elif attr == 'outputdir': return self.__dict__[attr] else: raise AttributeError, attr
class statsvnconfig: def __setattr__(self, attr, value): if attr == 'svnhome': self.__dict__[attr] = value elif attr == 'statsvnjar': self.__dict__[attr] = value else: raise AttributeError, attr + ' not allowed' def __getattr__(self, attr): if attr == "svnhome": return self.__dict__[attr] elif attr == 'statsvnjar': return self.__dict__[attr] else: raise AttributeError, attr def loadRespConfig(xmlfile): dom1 = parse(xmlfile) config_element = dom1.getElementsByTagName("respositoryconfig")[0] resps = config_element.getElementsByTagName("respository") respconfigs = [] for resp in resps: respcfg = respconfig() respcfg.reposhttpurl = resp.attributes["httpurl"].value respcfg.reposfileurl = resp.attributes["fileurl"].value respcfg.checkoutdir = resp.getElementsByTagName("checkoutdir")[0].attributes["dir"].value respcfg.outputdir = resp.getElementsByTagName("outputdir")[0].attributes["dir"].value respconfigs.append(respcfg) return respconfigs
def loadStatSvnConfig(xmlfile): dom1 = parse(xmlfile) config_element = dom1.getElementsByTagName("statsvnconfig")[0] statsvncfg = statsvnconfig() statsvncfg.svnhome = config_element.getElementsByTagName("svnhome")[0].attributes["dir"].value statsvncfg.statsvnjar = config_element.getElementsByTagName("statsvnjar")[0].attributes["dir"].value return statsvncfg
def createSvnLog(svnhome, reposhttpurl, checkouturl): cmd = '%s/svn log %s -v --xml > %s/logfile.log'% (svnhome, reposhttpurl, checkouturl) os.popen(cmd, 'r')
def updateRepos(svnhome, checkouturl): cmd = '%s/svn update %s'% (svnhome, checkouturl) os.popen(cmd, 'r')
def checkoutRepos(svnhome, reposfileurl, checkouturl): cmd = '%s/svn checkout %s %s'% (svnhome, reposfileurl, checkouturl) os.popen(cmd, 'r')
def createStatSvnReport(statsvnjar, outputdir, checkoutdir): cmd = 'java -jar %s -output-dir %s -threads 10 %s/logfile.log %s'% (statsvnjar, outputdir, checkoutdir, checkoutdir) os.popen(cmd, 'r')
def checkoutRequired(checkoutdir): if os.path.exists(checkoutdir): return False else: return True if __name__ == '__main__': respconfigs = loadRespConfig(os.getcwd() + "respository.cfg.xml") statsvncfg = loadStatSvnConfig(os.getcwd() + "statsvn.cfg.xml") i = 0 length = len(respconfigs) while 1: if i >= length: break if checkoutRequired(respconfigs[i].checkoutdir): checkoutRepos(statsvncfg.svnhome, respconfigs[i].reposfileurl, respconfigs[i].checkoutdir) else: updateRepos(statsvncfg.svnhome, respconfigs[i].checkoutdir) createSvnLog(statsvncfg.svnhome, respconfigs[i].reposhttpurl, respconfigs[i].checkoutdir) createStatSvnReport(statsvncfg.statsvnjar, respconfigs[i].outputdir, respconfigs[i].checkoutdir) i = i + 1 sys.exit()
剩下的就是通过py2exe把py脚本生成exe或者写个bat文件调用改py脚本,把exe或者bat文件放到windows计划任务中去就可以了。 |