SVN之Hook
SVN
此处主要以 TortoiseSVN为例
Hook
类型
client side hook - 客户端侧hook
server side hook - 服务器侧hook
Client Side Hook
类型:
- Start-commit, 在提交对话框展示前调用。
- Manual Pre-commit, 在提交对话框会显示 Run Hook 按钮,用来手动选择是否执行hook
- Check-commit, 在提交对话框关闭前调用(点击 提交对话框的 OK 按钮,关闭对话框前)
- Pre-commit, 在提交行为开始前调用(点击 提交对话框 OK 按钮,但提交行为开始前)
- Post-commit, 提交行为结束后调用(无论成功与否)
- Start-update, 在更新弹窗展示前调用
- Pre-update, 在更新行为开始前调用
- Post-update, 在更新行为结束后调用
- Pre-connect, 在关联存储库之前调用
如果想为指定的工作路径添加钩子,只需要指定顶级路径,如果在子文件夹进行操作,SVN会自动向上搜索匹配的路径。
接下来必须指定执行命令行,先写可执行的hook脚本路径。脚本可以是批处理文件、可执行文件或其他合法关联windows文件的文件。
命令行包含几个由TortoiseSVN填充的参数,传递的参数取决于调用的钩子,每个钩子都有自己的参数。
类型对应的参数:
- Start-commit, [ PATH MESSAGEFILE CWD ]
- Manual Pre-commit, [ PATH MESSAGEFILE CWD ]
- Check-commit, [ PATH MESSAGEFILE CWD ]
- Pre-commit, [ PATH DEPTH MESSAGEFILE CWD ]
- Post-commit, [ PATH DEPTH MESSAGEFILE REVISION ERROR CWD ]
- Start-update, [ PATH CWD ]
- Pre-update, [ PATH DEPTH REVISION CWD ]
- Post-update, [ PATH DEPTH REVISION ERROR CWD RESULTPATH ]
- Pre-connect, 没有参数传递给该脚本,可以通过将自定义参数附加到脚本路径中来传递自定义参数
各个参数含义:
- PATH
- 执行操作的路径;如果是远程操作,则是受影响项目的url
- MESSAGEFILE
- 包含提交信息日志文件的路径,文件内为UTF-8编码的文本,执行start-commit钩子后,会读回日志消息,让钩子有机会修改它。
- CWD
- 运行脚本的工作目录
- DEPTH
- 提交/更新行为的深度
- 枚举值
- -2, svn_depth_unknown
- -1, svn_depth_exclude
- 0, svn_depth_empty
- 1, svn_depth_files
- 2, svn_depth_immediates
- 3, svn_depth_infinity
- REVISION
- 提交/更新完成后的存储库修订版本
- ERROR
- 包含错误消息文件的路径,没有错误时,文件将为空
- RESULTPATH
- 临时文件的路径,包含操作及某种方式操作的所有路径,每个路径都在单独的一行
实战
问题:
项目开发过程中,策划上传表后,格式填写错误,比如[]不匹配等,会导致转lua失败,从而进不去游戏;一人的疏忽错误影响整个主线程阻塞。
方案:
在策划上传表之前,先执行转换lua脚本,若执行失败,则禁止上传表
流程:
- 编辑hook脚本,此处放在流程 pre-commit处
- 脚本流程是执行转lua脚本,执行完毕后,收集错误信息,若存在错误,则异常退出(上传表失败),在commit dialog显示错误信息,若无错误,则正常退出(上传表成功)。
- 调整转lua脚本
- 收集错误信息,输出到指定文件中
- 执行失败时,抛出错误代码,方便hook脚本收集
- 配置hook脚本
- 此处配置的时候,处理脚本,还要指定参数-脚本文件路径
- 右键任意文件夹, TortoiseSVN - setting - Hook Scripts - Add - 填写脚本全路径 SVN根目录(方便使用相对目录定位各个目录)
- 通过 1>&2,输出到 commit dialog 窗口
- 使用
问题:
- 需要策划自行配置,自缚双手
- 目前是全量进行所有表的转换,虽然有缓存,但依旧要等待很久,最优解是只转换要上传的表;但要解析提交者、提交内容,需要用到 svnlook,该命令需要在 server side hook 中使用(需要服务器权限)。
- 由于是借助TortiseSVN,通过命令行提交可以绕过该hook
1 | @echo off |
具体配置流程: