SVN+HOOK -- 配置管理钩子
2012-06-17 17:05
239 查看
#!/usr/bin/env python
# -*- coding: utf-8 -*- import sys , os #lockFlag = False ''' @summary: 错误码定义 ''' class errorCode: Successed =0000 #成功 InteralFailed = 0001 #内部错误 LogLengthError = 0002 #日志长度错误 DirectoryChangeError = 0003 #目录管理错误 fileTypeError = 0004 #文件类型错误 fileTooLarge = 0005 #文件大小错误 SvnLock = 9999 #SVN配置库已加锁 ''' @summary: 提交时更改类型 ''' class svnChange: addDirectory = 0001 addFile = 0002 removeDirectory = 0003 removeFile = 0004 modiFile = 0005 normal = 0006 class constValue: commitLogLength = 10 maxFileLength = 1024*1024*100 lockFlag = False superUser = ('cshuang','manageruser') fliterFile = ('ZIP','EXE','TAR','RAR','GZ','RPM') managerIp = '192.168.4.50' class userInfo: def __init__(self,name,aliasName): self.name=name self.Alias = aliasName @staticmethod def initAllUser(): usrList = list() return usrList class svnCommitHook: ''' classdocs ''' svnLookPath=r'/usr/local/subversion/bin/svnlook ' svnAdminPath=r'' def __init__(self): ''' Constructor ''' self.DeposityLocation = None self.RTNS = None self.logerMinLength = 10 self.fileList = list() ''' @summary: 检查提交时日志信息,日志长度必须大于 MIN-LOG-LENGTH ''' def checkLogsLength (self): cmd = svnCommitHook.svnLookPath + ' log -t "%s" "%s"'% (self.RTNS, self.DeposityLocation) logmessage = ''#!/usr/bin/env python for line in os.popen(cmd,'r').readlines(): logmessage = logmessage + line.replace('\n','') if(len(logmessage) > 10): return errorCode.Successed else: return errorCode.LogLengthError return errorCode.Successed def isSpecialFile(self,filename): if filename == None: return False splitStrList = filename.split('.') if len(splitStrList) < 2: return False if splitStrList[-1] in constValue.fliterFile: return True return False def checkChange(self): cmd1 = svnCommitHook.svnLookPath + ' author -t "%s" "%s"'% (self.RTNS, self.DeposityLocation) p1 = os.popen(cmd1,'r') author = p1.read() author = author.lstrip() author = author.rstrip() if author in constValue.superUser: return errorCode.Successed cmd2 = svnCommitHook.svnLookPath + ' changed -t "%s" "%s"'% (self.RTNS, self.DeposityLocation) p2 = os.popen(cmd2,'r') changeList = list() for one in p2.readlines(): changeT,filename = self.getChangeType(one) if changeT == svnChange.addDirectory or changeT == svnChange.removeDirectory: return errorCode.DirectoryChangeError if changeT == svnChange.addFile: strFilename = filename.upper() if self.isSpecialFile(strFilename): return errorCode.fileTypeError #continue if changeT == svnChange.addFile or changeT == svnChange.modiFile: cmd1 = svnCommitHook.svnLookPath + ' cat -t %s %s %s' % (self.RTNS, self.DeposityLocation,filename) pChange = os.popen(cmd1,'r') result = len(pChange.read()) if result > constValue.maxFileLength: return errorCode.fileTooLarge return errorCode.Successed def packetBlanck(self,src,str = ' '): rtn = None if src == None: return rtn rtn = src.lstrip() rtn = rtn.rstrip() ilen = 0 ilenEx = len(rtn) while ilen != ilenEx: ilen = ilenEx rtn = rtn.replace(str*2 ,str) ilenEx = len(rtn) return rtn ''' @summary: 获取当前svn提交类型 ''' def getChangeType(self,oneChange): oneChange = self.packetBlanck(oneChange, ' ') splitStr = oneChange.split(' ') if len(splitStr) <> 2: return svnChange.normal,None #添加 if splitStr[0] == 'A': if splitStr[1][-1] == '/' or splitStr[1][-1] == '\\': return svnChange.addDirectory,splitStr[1] else : self.fileList.append(splitStr[1]) return svnChange.addFile,splitStr[1] #修改可以不判断 if splitStr[0] == 'U': self.fileList.append(splitStr[1]) return svnChange.modiFile,splitStr[1] #删除 if splitStr[0] == 'D': if splitStr[1][-1] == '/' or splitStr[1][-1] == '\\': return svnChange.removeDirectory,splitStr[1] else : return svnChange.removeFile,splitStr[1] ''' @summary: 获取提交文件的信息 ''' def checkFileInfo(self): return errorCode.Successed ''' @summary:锁定svn ''' def lockSvn(self): #global lockFlag if constValue.lockFlag: return errorCode.SvnLock return errorCode.Successed def main(): svnHook = svnCommitHook() svnHook.DeposityLocation = sys.argv[1] svnHook.RTNS = sys.argv[2] if svnHook.checkLogsLength() <> errorCode.Successed: sys.stderr.write("强制写日志提示:签入文档或代码必须提供相关说明,并且至少10个字符以上,请补充后重试") exit(1) result = svnHook.checkChange() if result <> errorCode.Successed: if result == errorCode.DirectoryChangeError: sys.stderr.write("目录变更错误:代码库添加、删除、修改目录必须向产品经理申请,申请后,由配置管理员统一添加,并对目录进行权限重新配置。谢谢!") elif result == errorCode.fileTypeError: sys.stderr.write("签入错误:你签入的文件不符合规定,不能签入可执行文件和任何压缩文件!") elif result == errorCode.fileTooLarge: sys.stderr.write("签入错误:您签入的文件超过了最大尺寸限制---100兆!") exit(1) if svnHook.lockSvn() <> errorCode.Successed: sys.stderr.write("SVN锁定提示:代码库已加锁,暂无法签入任何文档代码,请联系管理员。谢谢!") exit(1) '''fileTooLarge @summary: 该函数调用必须在checkChange调用之后 ''' #if svnHook.checkFileInfo() <> errorCode.Successed: #sys.stderr.write("SVN锁定提示:代码库已加锁,暂无法签入任何文档代码,请联系管理员。谢谢!") # exit(1) exit(0) if __name__ == '__main__': main()
相关文章推荐
- [Android Studio 权威教程]AS 中配置强大的版本管理系统(Git、SVN、等)
- 在本地使用SVN进行源代码管理,配置自己的SVN Repository
- ubuntu下安装和配置SVN, 并设置钩子
- 在RedHat AS下安装配置SVN管理工具
- CentOS6.5下使用SVN实现多项目管理配置方案
- Android Studio配置SVN 以及使用代码管理
- svn详细介绍,独立安装配置,hooks的配置管理以及大型门户网站代码上线流程
- svn相关配置及学习, linux搭建ZenTaoPMS,readmine项目管理软件
- Unity在SVN版本管理里的配置
- Xcode5 配置SVN管理
- 在本地使用SVN进行源代码管理,配置自己的SVN Repository
- SVN服务器端安装、配置与管理
- 调整 Subclipse 配置以使 Eclipse 显示 SVN 管理的代码的最后修改作者
- 配置管理工具SVN的使用
- CentOS下使用SVN实现多项目管理配置方案
- 用SVN进行版本控制和项目管理的安装配置和使用方法
- 软件的版本管理 VisualSVN Server的配置和使用方法 图文
- Linux下SVN配置hook经验总结
- LINUX环境下SVN安装与配置(利用钩子同步开发环境与测试环境)
- Rancid+Subversion (SVN)管理Cisco配置