事实证明,如果没有强有力的约束,那么哪怕制定的规范已经尽可能地少了,所有的人都认为有规范是好事,最终结果都只能是大失所望,热血已凉。
1. 概述
本文尝试收集常用的SVN pre-commit Hook,将规范的执行尽量由人治转向机器监督 —— 公平,冷血,高效。实现只配置一次,你就可以相信你加的每条规范肯定被不打任何折扣,百分之百覆盖率地执行下去了。
目前已经实现了:
- Java代码的CheckStyle规范检查。
- SVN提交日志长度检查。
- JS提交文件中不允许包含debugger和console的检查。
- IDE配置文件不允许提交的检查。
2. pre-commit Hook内容
set python="C:\Python27\python.exe"
set svnchecker="F:\_svnChecker\svnchecker-0.3"
set svnlook="D:\VisualSVN Server\bin\svnlook.exe"
rem 以下这行必须要! (主要用于下方JS文件中关键字的过滤)
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
setlocal
set REPOS=%1
set TXN=%2
rem checkstyle, 更具体的参见下方链接
rem checkstyle hooks
%python% %svnchecker%\Main.py PreCommit %REPOS% %TXN% || exit 1
rem 确保填写注释
rem 字符串:"....." 为5个点, 也可理解为字符数目。
rem Make sure that the log message containssome text.
%svnlook% log -t "%TXN%" "%REPOS%" | findstr "....." > null
if %errorlevel% gtr 0 goto err
rem 文件类型
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\.classpath$"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\.project$"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\.mymetadata$"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\.settings"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\.idea"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\.myeclipse"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\\target"
if %errorlevel% EQU 0 (goto SuffixError)
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\\WebContent"
if %errorlevel% EQU 0 (goto SuffixError)
rem 这个主要是为了避免 WEB-INF目录下的 classes文件夹 被提交
%svnlook% changed -t "%TXN%" "%REPOS%" | findstr "\\classes"
if %errorlevel% EQU 0 (goto SuffixError)
rem 重要! 如果单独提取这一段, 注意一起复制上方的 setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 配置
rem 提取ADD/MODIFY的JS文件路径清单, 将文件路径清单输出到临时文件中,方便之后的分析
%SVNLOOK% changed -t %TXN% %REPOS% | findstr /V "^D " | findstr ".js$" >diffdir.log
rem 遍历本次SVN提交的每个JS文件里的内容
for /f "delims=" %%i in (diffdir.log) do (
set "patha=%%i"
set pathb=!patha:~4!
%SVNLOOK% cat -t %TXN% %REPOS% "!pathb!" > diffcat.log
for /f "delims='~'" %%j in (diffcat.log) do (
set target=%%j
rem 坑死爹了, 必须使用 " , 不能使用 '
echo !target! | findstr "debugger console"
if !errorlevel! EQU 0 (goto jsFail)
)
rem findstr "debugger" diffcat.log
rem if !errorlevel! EQU 0 (goto jsFail)
)
exit 0
:SuffixError
echo 含有禁止存在于受控库的文件类型,如:.classpath, .project, .settings, .mymetadata, .settings/, .idea/, .myeclipse/, target/, WebContent/等。受控库良好的性能需要大家共同维护,谢谢! 1>&2
exit 1
:err
echo 注释字符串长度不能小于5,不允许提交 1>&2
echo "%REPOS%" -t "%TXN%" 1>&2
echo %errorlevel%
exit 2
:jsFail
echo 含有禁止存在de关键字debugger, 请删除再提交。受控库良好的性能需要大家共同维护,谢谢! 1>&2
exit 2