SVN之Hook

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脚本,若执行失败,则禁止上传表

流程:

  1. 编辑hook脚本,此处放在流程 pre-commit处
    • 脚本流程是执行转lua脚本,执行完毕后,收集错误信息,若存在错误,则异常退出(上传表失败),在commit dialog显示错误信息,若无错误,则正常退出(上传表成功)。
  2. 调整转lua脚本
    • 收集错误信息,输出到指定文件中
    • 执行失败时,抛出错误代码,方便hook脚本收集
  3. 配置hook脚本
    • 此处配置的时候,处理脚本,还要指定参数-脚本文件路径
    • 右键任意文件夹, TortoiseSVN - setting - Hook Scripts - Add - 填写脚本全路径 SVN根目录(方便使用相对目录定位各个目录)
    • 通过 1>&2,输出到 commit dialog 窗口
  4. 使用

问题:

  • 需要策划自行配置,自缚双手
  • 目前是全量进行所有表的转换,虽然有缓存,但依旧要等待很久,最优解是只转换要上传的表;但要解析提交者、提交内容,需要用到 svnlook,该命令需要在 server side hook 中使用(需要服务器权限)。
  • 由于是借助TortiseSVN,通过命令行提交可以绕过该hook
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@echo off

REM Get input param

REM svn root path like D:\work\SG\s, it will include folder svn, folder design
set TSVN_ROOT_PATH=%1

set TSVN_PATH=%2
set TSVN_DEPTH=%3
set TSVN_MESSAGEFILE=%4
set TSVN_CWD=%5

REM lua脚本错误日志文件
set TSVN_TEMP_FILE=%TSVN_ROOT_PATH%\svn\svn_hook\temp_output.txt
REM lua脚本所在目录
set TSVN_DESIGN_PATH=%TSVN_ROOT_PATH%\design\
REM lua脚本
set TSVN_CHECK_LUA_SCRIPT=csvToClient1.0_forsvnhook.py

cd /d %TSVN_DESIGN_PATH%
python %TSVN_CHECK_LUA_SCRIPT% > %TSVN_TEMP_FILE%

if %errorlevel% gtr 0 goto err
echo %errorlevel%! 1>&2
echo Success! 1>&2
exit 0

:err
echo Please check your csv. Commit aborted! 1>&2
echo %errorlevel%! 1>&2
echo error message: 1>&2
for /f "delims=" %%x in (%TSVN_TEMP_FILE%) do (echo %%x 1>&2)
exit 1

具体配置流程: