SVN hooks(钩子)- 简单入门
by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。
在做版本的时候,需要SVN做一些自动化的事情,比如提交前自动更新;提交一些文件后关联着提交另一些。所以需要写一点自动化脚本。
什么是SVN钩子
官方说法:
钩子是通过版本库事件触发,例如新版本的创建或一个未版本化属性的修改。一些钩子(叫做“pre hooks”)在事件发生前运行,可以用来报告发生了什么以及防止它发生。还有一些钩子(“post hooks”)在版本库事件之后发生,只是用来报告。每个钩子能够获得事件的足够信息,例如提出的(或完成的)版本库修改细节,还有触发事件的用户名。
分类
- 服务器钩子:
经常提到的svn hooks是一组“外挂”脚本程序,是svn提供的一组由svn事件触发的特别有用的程序。这些程序在服务器端执行,可以提供svn之外的一些附加功能。钩子可以调用批处理文件、可执行文件或者一些类似于perl、python等的脚本。
- 客户端钩子:
如果使用tortoise svn(海龟svn,常用的svn客户端),它也提供钩子机制,这些和svn hooks有本质区别,它是在本地(客户端)执行的。
如何使用客户端钩子
鼠标右键—>TortoiseSVN—>设置
执行顺序
上图的hook type有六种,前三个是提交,后三个是更新。
执行顺序从上到下。即:
start Commit Hook -> Pre commit hook -> post commit hook
Start commit hook -> Pre update hook -> Post commit hook
编写hooks可以使用多种语言和脚本,我对js比较熟悉,所以选择JScript,即简单又功能强大。
如何运行JScript脚本
点击add.. ,working copy path命令的执行路径,command line to execute 待执行的脚本。
温馨提示:对于JScript脚本,调用命令中必须使用wscript,否则脚本无法运行,如图示。
如何写脚本
Js语言不多说,那说说window中执行js脚本的一些问题。
WScript对象是在window中特有的对象,全称“Windows Scripting Host”,是一种批次语言/自动执行工具——它所对应的程序“wscript.exe”是一个脚本语言解释器。
- WScript.echo
相当于alert,调试用。
- WScript.shell
执行命令,如:svn update filepath、svn commit filepath
var oShell = new ActiveXObject('WScript.Shell');
oShell.Run("cmd.exe /k svn mkdir D:\\mgp_proj\\trunk\\test2", 1, true);
cmd /c dir 是执行完dir命令后关闭命令窗口。
cmd /k dir 是执行完dir命令后不关闭命令窗口。
这样一来就能查看运行结果了,方便调试。
读文件
var fso = new ActiveXObject('Scripting.FileSystemObject');
var readme = cwd + '//readme.txt';
if (fso.FileExists(readme)) {
// 使用当前系统默认的编码方式(ANSI)读取文本文件
var ts = fso.OpenTextFile(readme, 1, false);
var text = ts.ReadAll();
ts.Close();
})
温馨提示:fso.FileExists(readme) 文件存在返回-1 ,不存在返回0
写文件
var stream = new ActiveXObject('Adodb.Stream');
stream.Mode = 3; // read/write
stream.Open();
stream.Type = 2; // text
stream.Charset = 'utf-8';
stream.WriteText('hello world');
stream.SaveToFile('readme.txt', 2); // overwrite
stream.Close();
svn的临时文件
在我们提交文件时,svn会在系统的临时目录生成一些关于提交文件的属性的文件,以post-commit-hook为例子:
- 参数1临时路径名
- 参数2 文件数
- 参数3临时路径名
- 参数4 版本号码
- 参数5 临时路径名
- 参数6 当前提交路径
这样一来可以拿到提交的文件列表,方便做相应的处理,不同命令对应的参数不同,自己写代码去调试吧。这样来取得参数:
var args = WScript.Arguments; // 钩子脚本被调用时,由TSVN传入的参数
一些参考
- 关于window下cmd执行SVN命令
http://blog.csdn.net/gwzz1228/article/details/7840666
http://stackoverflow.com/questions/8505228/javascript-svn-wrapper
http://blog.sina.com.cn/s/blog_4f925fc30102ehph.html
http://blog.itpub.net/14466241/viewspace-713138/
http://www.wikihow.com/Get-Started-With-Command-Line-Subversion-on-Windows
- 在命令行运行JScript脚本时,遇到如下的错误提示:
“输入错误: 没有文件扩展“.js”的脚本引擎。”
只需要把[HKEY_CLASSES_ROOT\.js] 项下的那个默认值改成 ”JSFile” 就可以正常运行JS 文件了。
做这个调了很久,毕竟感觉参考的文档少,所以写出来以供大家参考。
本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作
个人知乎,欢迎关注:https://www.zhihu.com/people/iamaddy
欢迎关注公众号【入门游戏开发】
近期评论