这里主要是为了在代码提交时进行一些代码规范校验。现在很多时候都会采用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+'\n')
5
6 svnRepos = sys.argv[1]#提交文件列表
7 #svnMessageFile = sys.argv[3]
8 #sys.stderr.write(sys.argv[0]+'\n'+sys.argv[1]+'\n'+sys.argv[2]+'\n'+sys.argv[3]+'\n'+sys.argv[4]+'\n')参数依次为脚本路径、文件列表文件、depth、提交的message文件、提交文件的路径
9 errMsgTable = []
10
11 with open(svnRepos) as submitFiles:
12 for submitFile in submitFiles:
13 submitFile = submitFile.replace('\n', '')#去掉文件列表缓存文件中的换行
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
打印修改内容