http://blog.csdn.net/caikanxp/article/details/8279921

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

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

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

代码如下:

文件:pre-commit.bat

[plain] view plaincopy

  1. svnlook log %1 -t %2 | CScript "%~dp0pre-commit.js"
  2. EXIT %ERRORLEVEL%

文件:pre-commit.js

[javascript] view plaincopy

  1. var log = WScript.StdIn.ReadAll();
  2. log = log.replace(/^\s+|\s+$/g, '');
  3. if (log.length < 1) {
  4. WScript.StdErr.WriteLine('【由于版本库管理员的设定,您必须输入非空的日志信息,用以描述本次提交的内容。】');
  5. WScript.Quit(1);
  6. }

脚本说明:

以上脚本文件都应该使用ANSI编码,将它们保存于版本库存放处的hooks文件夹中即可。

Subversion在提交事务完成之前,会执行钩子脚本“pre-commit”,并根据其返回结果来决定是否提交事务。

在Windows平台中,钩子脚本应该是一个Windows可执行程序,如“pre-commit.exe”或“pre-commit.bat”。

当然可以通过某些程序语言编译生成一个程序,但实施起来过于复杂,实属小题大做。

而批处理由于本身的不足,不借助其它工具来判断非空日志也不那么简单。

网上有些例子就是使用批处理结合第三方程序来处理的,但前提是需要额外安装第三方程序。

不过在Windows下其实有更“绿色”的做法:使用WSH(Windows脚本宿主)脚本——Windows时代更强大的“批处理”,可以支持JS,VBS等脚本语言。

虽然Windows中可以通过配置PATHEXT环境变量,将某些扩展名当做“可执行文件”的扩展名,直接敲入主文件名即可执行——比如需要执行WSH脚本“pre-commit.js”,在命令提示符下直接敲入“pre-commit”即可;但很遗憾,测试发现Subversion在需要触发pre-commit钩子脚本时,并不会直接触发“pre-commit.js”。

但我们仍然可以通过批处理脚本pre-commit.bat或pre-commit.cmd来间接调用WSH脚本。

批处理的参数:%0代表批处理脚本命令自身(的文件名),%1,%2,%3……依次代表批处理的参数。

批处理参数的扩展:“%~dp0”用来获取批处理脚本所在的文件夹绝对路径。可以在命令提示符中输入“CALL /?”了解相关语法详情。

传入pre-commit钩子脚本的参数:第1为版本库位置,第2为提交事务的id。

CScript脚本宿主支持标准输入输出及错误流,而WScript脚本宿主则不支持。Windows的默认脚本宿主为WScript,因此必须明确调用CScript。

(当默认宿主被改为CScript时,这种写法也是可行的“svnlook log %1 -t %2 | "%~dp0pre-commit.js"”)。

被调用的WSH脚本名需要重新围上双引号(%~批处理参数扩展会移除原始参数包围的双引号),以确保版本库路径中包含空格时不会出错。

钩子脚本执行流程:
批处理脚本执行svnlook命令输出日志信息,通过管道将日志流输出到WSH脚本;
WSH脚本读取流之后,判断日志内容是否为只含空白的字符串;
WSH脚本执行完成后,退出码会被写入ERRORLEVEL环境变量,最后批处理脚本也使用此错误码退出。
若钩子脚本的退出码非0,提交事务便会被阻止,同时脚本输出到标准错误流的消息将被传送给SVN客户端进行提示。

上面的做法使用了管道流。下面是另一种做法,直接将批处理收到的钩子脚本参数转给WSH脚本。

本例不仅阻止了仅含空白字符的日志消息,同时也阻止了一些常见垃圾文件的提交。

文件:pre-commit.bat

[plain] view plaincopy

  1. CScript "%~dp0pre-commit.js" %1 %2
  2. EXIT %ERRORLEVEL%

文件:pre-commit.js

[javascript] view plaincopy

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

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

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

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

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

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

转:Windows下WSH/JS实现SVN服务器钩子脚本阻止提交空日志信息和垃圾文件的更多相关文章

  1. Windows下免费、开源邮件服务器hMailServer

    Windows下免费.开源邮件服务器hMailServer 一.Windows下搭建免费.开源的邮件服务器hMailServer 二.邮件服务器hMailServer管理工具hMailServer A ...

  2. windows下vue.js开发环境搭建教程

    这篇文章主要为大家详细介绍了windows下vue.js开发环境搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中 ...

  3. 本地windows下搭建git的本地服务器

    本地windows下搭建git的本地服务器 准备工作: 本地安装java环境,配置环境变量(略) 下载gitblit文件,百度一大堆 开始第一步: 减压gitblit压缩包到某个目录下,比如我在:H: ...

  4. Windows下基于http的git服务器搭建-gitstack

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Windows下基于http的git服务器搭建-gitstack     本文地址:http: ...

  5. [日常] windows下使用vscode配合xebug调试php脚本

    windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,php7.3应该是有的,php7.3.4好像没有默认是不加载这个扩展 ...

  6. windows 7系统搭建本地SVN服务器的过程

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...

  7. 如何在windows上安装部署设置SVN服务器

    1   一.准备工作 1.SVN服务器:解压缩包,可以从官方网站下载最新版本. 2.SVN客户端:TortoiseSVN,即常说的小乌龟,是一个客户端程序,用来与服务器端通讯. 2 二.安装服务器和客 ...

  8. centos下搭建多项目svn服务器

    svn是多人协作开发中的利器,是一个开放源代码的版本控制系统. 相比与git,他的操作更加简单,windows下有优秀的图形界面,并且支持的文件类型比较多. 本文讲述如何在linux下搭建一个svn服 ...

  9. windows下用php实现svn代码更新

    windows下的服务器 没有登录权限,如何从svn更新代码 用php页面,实现更新代码 $cmd = '"C:\Program Files\TortoiseSVN\bin\Tortoise ...

随机推荐

  1. C# MD5加密(16进制)

    MD5加密(16进制) vs会提示引用 using System.Security.Cryptography; 代码如下: public static string MD5Encrypt32(stri ...

  2. RabbitMQ 核心概念

    目录 RabbitMQ 特点 AMQP 协议 RabbitMQ 消息传递机制 Message Exchange 1. 简介 2. 类型 3. 属性 RabbitMQ 特点 RabbitMQ 相较于其他 ...

  3. android toolbar 假标题居中

    <android.support.v7.widget.Toolbar android:id="@+id/toolbar_top" android:layout_height= ...

  4. SilverLight:布局(2)GridSplitter(网格分割)垂直分割、水平分割

    ylbtech-SilverLight-Layout: 布局(2)GridSplitter(网格分割)垂直分割.水平分割 A, Splitter(分割)对象之 GridSplitter(网格分割)1: ...

  5. 实践认识--ANN

    1. 常用激活函数  激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数. (1) 线性函数 ( Liner Function ) (2) 斜面函数 ( Ramp Functio ...

  6. C 标准库 - <math.h>

    C 标准库 - <math.h> 简介 math.h 头文件定义了各种数学函数和一个宏.在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double类型的结果. 库 ...

  7. 梦入IBM之java基础-网络编程

    如今我们来谈谈最后的内容:网络编程: 1):TCP中是线程与线程进行通讯!内部的执行机制是这种:先有一个线程去监听某个port.然后假设有Socket连接上来了以后,server会生成一个Socket ...

  8. S3C2440 IIS操作 uda134x录放音

    IIS(Inter-IC Sound)由飞利浦公司开发.是一种经常使用的音频设备接口,主要用于CD.MD.MP3等设备. s3c2440一共同拥有5个引脚用于IIS:IISDO.IISDI.IISSC ...

  9. Linux/ visual studio 编译使用Poco

    1. 下载源码包.在POCO的官方网站下载最新的POCO源码包.http://pocoproject.org/download/index.html2.解压源码包.下载的文件名是“poco-1.6.0 ...

  10. 找top 10信息

    本文章内容来源于<程序猿面试宝典>. 题目: 有1千万条短信,以文本文件的形式保存.一行一条,有反复.请用5分钟时间,找出反复出现最多的前10条. 解析: 某些面试者想用数据库的办法来实现 ...