这里主要是为了在代码提交时进行一些代码规范校验。现在很多时候都会采用eslint等工具进行辅助开发的代码规范,这里不再细说;而一般的svnhook又是服务端的脚本,即svn仓库管理来进行设置的,对于没有这些权限的人来说不太友好。其具体原理和实现与接下来要说的客户端脚本基本一致,主要使用的是svnlook工具,有兴趣的可以搜索一下,你会发现,搜索结果百分之120都是服务端的钩子脚本。所以我把客户端的脚本进行一下分享。
1.关联钩子
在svn目录右键,选择svn->设置,在HookScripts进行配置。比如我这里配置的就是pre-commithook,选择好要进行校验的目录,然后要执行的脚本,比如我这里写的是python "xxx/hook/pre-commit.py",就是在提交代码前执行这个python脚本。当然,一般都是使用bat脚本,但是我对bat不熟,所以直接使用python了,不过也可以在bat中调用python:
2.执行脚本
1 rem set PYTHON="C:/Users/lijiawei/AppData/Local/Programs/Python/Python38/python.exe" 2 set REPOS=%1 3 set TXN=%2 4 set MESSAGEFILE=%3 5 set CWD=%4 6 set PY_CHECK="E:/NGTOSV2_1/wuhan_version/hook/synchk.py" 7 8 python %PY_CHECK% %REPOS% %TXN% %MESSAGEFILE% %CWD% 9 10 if errorlevel 1 exit 1 11 exit 0
可以看到我们接收到4个参数,依次是path文件列表、 depth、 messagefile提交的message文件、 cwd当前文件路径
3.python脚本
1 import sys 2 3 def err(msg): 4 sys.stderr.write(msg+' ') 5 6 svnRepos = sys.argv[1]#提交文件列表 7 #svnMessageFile = sys.argv[3] 8 #sys.stderr.write(sys.argv[0]+' '+sys.argv[1]+' '+sys.argv[2]+' '+sys.argv[3]+' '+sys.argv[4]+' ')参数依次为脚本路径、文件列表文件、depth、提交的message文件、提交文件的路径 9 errMsgTable = [] 10 11 with open(svnRepos) as submitFiles: 12 for submitFile in submitFiles: 13 submitFile = submitFile.replace(' ', '')#去掉文件列表缓存文件中的换行 14 fp = open(submitFile, 'r', encoding='utf-8') 15 frontLine = '' 16 lNum = 0 17 for line in fp.readlines():#逐行读取 18 lNum += 1 19 line = line.strip().replace(' ','') 20 if (',]' in line) or (',}' in line): 21 errMsgTable.append([submitFile, lNum, 'Illegal Comma']) 22 if len(frontLine) > 0 and len(line) > 0: 23 if (frontLine[-1] == ',') and (line[0] == ']' or line[0] == '}'): 24 errMsgTable.append([submitFile, lNum, 'Illegal Comma']) 25 if len(line) > 0: 26 frontLine = line 27 fp.close() 28 29 # errMsgTable.append(['', '', 'test']) 30 if errMsgTable: 31 err('===================== error begin ========================================') 32 for msgArr in errMsgTable: 33 err('File:%s line:%s msg :%s' % (msgArr[0], msgArr[1], msgArr[2])) 34 err('===================== error end ==========================================') 35 sys.exit(1) 36 else: 37 sys.exit(0)
python中主要校验了非法的逗号,对于不规范的代码进行提示,如果没有不规范的,则返回0,代码提交成功。
4.svnlook
1.svnlook changed
打印修改路径
2.svnlook cat
打印修改内容