VBScript 中的 SVN pre-commit 钩子






4.38/5 (4投票s)
一个 SVN 的 pre-commit 钩子,用于根据 JIRA 验证提交。
引言
Subversion 的钩子脚本提供了一种强大而灵活的方式来将操作与仓库事件关联起来。 例如,pre-commit 钩子允许您在实际提交事务之前检查并可能中止它。 本文描述了如何用 VBScript® 编写这样的钩子,并测试提交者是否提供了提交消息以及消息是否包含有效的 issue ID。 用于集成的 issue 跟踪系统是 JIRA®。
创建钩子脚本
当您安装 Subversion 时,它还会安装示例钩子脚本。 这些示例脚本位于 REPOS_PATH\hooks 目录中。 例如,pre-commit 模板位于 PATH_TO_REPOS/hooks/pre-commit.tmpl 中。 这些模板包含有关钩子脚本的作用以及它可以期望的参数的说明。
提示: 钩子文件必须是可执行文件。 Windows 使用文件扩展名来确定程序是否为可执行文件,因此您需要提供一个其基本名称是钩子名称且其扩展名是 Windows 识别的用于可执行程序的特殊扩展名之一的程序,例如 .exe 或 .com 用于程序,.bat 用于批处理文件。 |
Pre-commit 钩子
pre-commit 钩子让您有机会在事务成为修订版之前捕获它。 通常,此钩子用于防止由于内容或位置而被禁止的提交(例如,您的组织可能要求对某个分支的所有提交都包含来自错误跟踪器的票证号,或者传入的日志消息不能为空)。 Subversion 将此钩子传递两个参数
- 存储库根目录的路径
- 事务标识符
pre-commit 可以通过将信息性消息打印到标准错误并返回一个非零值来使事务失败。 返回代码为零允许事务成功完成。
钩子脚本
钩子脚本强制执行以下规则
- 非空提交消息。
- 提交消息必须以 Issue ID 开头,后跟一个空格和连字符。
- 指定的 Issue ID 必须是 Issue System (JIRA) 中的有效 issue。
- 该 Issue 必须已分配给提交者。
JIRA 集成
与 JIRA 的集成是通过 Web Service 使用 SOAP 消息完成的。 当然,这要求在 JIRA 服务器上启用 XMLRPC 插件。 该脚本使用 MSXML.HTTP
对象来调用 JIRA Web Service。 提交日志消息和提交者是使用 Subversion 软件附带的 svnlook.exe 程序找到的。 Web Service 调用由名为 WebService
的类完成,该类实际上是改编自 CDYNE Wiki 上发布的代码。 (此站点上的代码足以发出 POST 请求,但无法调用启用了 SOAP 的 Web Service。) 该代码调用 JIRA Web Service 中的以下方法
login
- 必须调用此方法以确保我们获得身份验证令牌。 此方法返回的令牌在后续调用中是必需的。 此方法接受以下两个参数,并在成功登录后返回身份验证令牌in0
- 用户名in1
- 纯文本用户密码getIssue
- 此方法用于检索给定其 ID 的 issue 详细信息。 此方法接受以下两个参数,如果请求用户具有查看权限并且存在具有所提供 ID 的 issue,则返回 issue 详细信息in0
- 身份验证令牌in1
- issue IDlogout
- 此方法用于注销用户。 此方法仅接受一个参数,即身份验证令牌。
实际错误通过在 StdErr
上写入错误文本传回给用户。 这允许提交者查看其提交被拒绝的原因。
pre-commit.bat
如前所述,Subversion 服务器只能调用可执行脚本。 由于 pre-commit 钩子是用 VBScript 编写的,因此我们需要一个驱动脚本。 这是驱动脚本
@ECHO OFF
SETLOCAL
SET PATH=C:\Windows;C:\Windows\system32;D:\SCC\SVN146\bin;
cscript.exe //NoLogo H:\SVNRepo\docman\hooks\pre-commit.wsf %1 %2
IF ERRORLEVEL 1 GOTO fail
:success
EXIT 0
:fail
EXIT 1
历史
- 4/11/2008 - 第一个版本发布在 我的博客 上。