首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > CVS SVN >

Windows上WSH/JS实现SVN服务器钩子脚本阻止提交空日志信息和垃圾文件

2012-12-19 
Windows下WSH/JS实现SVN服务器钩子脚本阻止提交空日志信息和垃圾文件如何强制用户在提交SVN时填写日志信息

Windows下WSH/JS实现SVN服务器钩子脚本阻止提交空日志信息和垃圾文件

如何强制用户在提交SVN时填写日志信息?

如果用户使用的都是TortoiseSVN客户端,可以给文件夹加上“tsvn:logminsize”属性。当用户使用TSVN提交此文件夹内的改动时,若日志信息长度不够,提交确定按钮会保持灰色不可用。不过此法对于非TSVN客户端便无效了。


作为更严格的限制,可以在Subversion服务器端强制必须填写日志信息,这时需用到pre-commit钩子脚本。

代码如下:

文件:pre-commit.bat

var WshShell = new ActiveXObject("WScript.Shell");var args = WScript.Arguments;var error = 0;// 用于将命令模版中的参数替换为WSH脚本参数,并包上用于兼容含空格路径的双引号function replaceArgs($0, $1) {return '"'+ args($1) + '"';}// 检测日志信息function checkLog() {var cmd = 'svnlook log %0 -t %1';cmd = cmd.replace(/%(\d)/g, replaceArgs);var log = WshShell.Exec(cmd).StdOut.ReadAll();log = log.replace(/^\s+|\s+$/g, '');if (log.length < 1) {WScript.StdErr.WriteLine('【由于版本库管理员的设定,您必须输入非空的日志信息,用以描述本次提交的内容。】');return 1;}return 0;}// 检测垃圾文件function fileFilter() {var cmd = 'svnlook changed %0 -t %1';cmd = cmd.replace(/%(\d)/g, replaceArgs);var oExec = WshShell.Exec(cmd);var stdout = oExec.StdOut;// svnlook changed 命令的输出格式可参考SVN手册。每行表示一个文件变动,行首字母A表示版本差异中新增的文件。// 此正则表达式可匹配新增文件中的“Thumbs.db”“desktop.ini”及部分Office临时文件var r = /^A.\s\s((?:[^\/]+\/)*(?:Thumbs\.db|desktop\.ini|~\$.*\.(?:docx?|xlsx?|pptx?)))$/i;var illegals = [];var m;while (!stdout.AtEndOfStream) {var line = stdout.ReadLine();if (m = line.match(r)) {illegals[illegals.length] = m[1];}}if (illegals.length) {WScript.StdErr.WriteLine('【下列文件被判定为垃圾文件而禁止提交,请排除后重新提交。】');WScript.StdErr.WriteLine('【如判定有误或有其它问题,请联系版本库管理员。】');WScript.StdErr.WriteLine(illegals.join('\n'));return 1;}return 0;}error += checkLog();error += fileFilter();WScript.Quit(error);


WSH的强大已足以应付这些问题。

而pre-commit钩子脚本的不足之处就是,需要等全部改动传输至服务器之后才会被调用。

当改动内容很多时,数据传输了半天,突然来了个提交被阻止岂不是很郁闷。

可以考虑将服务器端钩子脚本作为最终关卡,平时还是尽量优先以客户端的配置来进行操作过滤。


以上测试环境:Windows XP/2003,WSH 5.7,TortoiseSVN-1.7.10(Subversion 1.7.7)

热点排行