人们为 Subversion 使用了哪些类型的钩子脚本?只是一般的想法,但代码也会很棒!
16 回答
我正在使用pre-revprop-change
允许我在执行提交后实际返回并编辑评论和此类信息的钩子。如果提交注释中缺少/错误信息,这将非常有用。
在这里,我发布了一个pre-revprop-change.bat
Windows NT 或更高版本的批处理文件。您当然可以通过更多修改来增强它。您还可以从中派生一个
post-revprop-change.cmd
来备份旧的snv:log
某处或只是将其附加到新日志中。
唯一棘手的部分是能够从批处理文件中实际解析标准输入。这是在这里使用FIND.EXE
命令完成的。
另一件事是,我收到了其他用户关于使用/b
withexit
命令的问题的报告。/b
如果错误情况表现不佳,您可能只需要在特定应用程序中删除它。
@ECHO OFF
set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY
goto :eof
:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT
:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
如果您有混合使用存储库的 unix 和 Windows 用户,我建议您使用case-insensitive.py预提交钩子脚本作为预防措施。它可以防止由于文件重命名仅更改了文件名的大小写而导致 Windows 用户svn 更新失败的难以解决的情况。相信我,它很有可能会为您省去麻烦。
在我的工作场所,我们设置了一个 post-commit 挂钩,它生成 RSS 提要,这些提要显示在各种仪表板中,并用于代码审查人员知道什么时候该审查,并让我们看到新员工是否有足够的承诺.
我们将它们用于以下几件事:
- 与错误跟踪器集成(在我们的案例中为 Trac - 一条显示“关闭 #514”的提交消息会自动将该错误标记为已关闭
- 与构建集成集成(在我们的例子中是 buildbot - 提交到被监视的分支会触发构建
- 用于验证提交的预提交钩子 - 我们使用svnchecker。它验证了我们的 Python 代码的PEP8 正确性
- 将签到邮件发送到邮件列表
- 运行缩进脚本
对于那些正在为snvsync操作寻找 pre-revprop-change.bat 的人:
https://gist.github.com/1679659
@ECHO OFF
set user=%3
if /I '%user%'=='syncuser' goto ERROR_REV
exit 0
:ERROR_REV echo "Only the syncuser user may change revision properties" >&2
exit 1
它只是来自这里:http ://chestofbooks.com/computers/revision-control/subversion-svn/Repository-Replication-Reposadmin-Maint-Replication.html并已适用于 Windows。
我正在使用 post-commit 钩子(我认为是这个)为每次提交在 Basecamp 上的论坛上发布消息。两大优势:
作为首席开发人员,我每天早上都会收到一份提交汇总(通过那个 basecamp 论坛的 RSS 提要),并且可以很快看到我的团队在做什么。
我们的 Trac/SVN 安装在我们的防火墙后面,因此这让我在其他地方的上级可以了解我们正在做什么。他们可能不理解,但对经理来说,很多活动看起来,嗯,很多活动;)
我想这的最终结果类似于@Aviv 正在做的事情。
我正在寻找在单独的服务器上构建最新提交以进行持续集成的解决方案,但我将不得不改变我们对数据库模式进行更改的方式,然后才能工作。
前段时间在 subversion 用户邮件列表上讨论过这个问题。这篇文章特别有一些有用的想法。
post-commit 挂钩,用于将存储库中发生更改的电子邮件通知发送到电子邮件列表。您需要将 sendmail.exe 和sendmail.ini放在与挂钩文件相同的文件夹中。
您还需要 post-commit.cmd 旁边的文件 post-commit.tos.txt 来列出邮件收件人。该文件应包含:
user1@example.com,user2@example.com,user3@example.com
这是钩子代码:
@ECHO OFF
setlocal
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Get subversion arguments
set repos=%~1
set rev=%2
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Set some variables
set tos=%repos%\hooks\%~n0.tos.txt
set reposname=%~nx1
set svnlookparam="%repos%" --revision %rev%
if not exist "%tos%" goto :END
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Prepare sendmail email file
set author=
for /f "tokens=* usebackq" %%g in (`svnlook author %svnlookparam%`) do (
set author=%%g
)
for /f "tokens=* usebackq delims=" %%g in ("%tos%") do (
set EmailNotificationTo=%%g
)
set SendMailFile=%~n0_%reposname%_%rev%.sm
echo To: %EmailNotificationTo% >> "%SendMailFile%"
echo From: %reposname%.svn.technologie@gsmprjct.com >> "%SendMailFile%"
echo Subject: [%reposname%] Revision %rev% - Subversion Commit Notification >> "%SendMailFile%"
echo --- log [%author%] --- >> "%SendMailFile%"
svnlook log %svnlookparam% >> "%SendMailFile%" 2>&1
echo --- changed --- >> "%SendMailFile%"
svnlook changed %svnlookparam% --copy-info >> "%SendMailFile%" 2>&1
echo .>> "%SendMailFile%"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Send email
type "%SendMailFile%" | "%~dp0sendmail.exe" -t
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Clean-up
if exist "%SendMailFile%" del "%SendMailFile%"
:END
endlocal
我们使用钩子脚本检查以下内容:
- 已提供提交日志消息
- 已为提交指定了审阅者
- 存储库中没有自动生成的代码或禁止的文件类型
- 创建分支/标签时发送电子邮件
我们仍然要实现以下内容:
- 当用户获得文件锁定时发送电子邮件
- 当您的锁被盗时发送电子邮件
- 更改修订属性时向所有人发送电子邮件
一个钩子,用于通知错误/问题管理系统对存储库的更改。IE。提交消息中包含 issue:546 或类似标签,已被解析并提供给错误管理系统。
我们使用提交钩子脚本来触发我们的发布机器人。在我们不同的产品中将新的发布信息写入名为 changes.txt 的文件将触发标签和相关工件的创建。
我有一个使用我发送到篝火室的 Ruby Tinder 库的设置,如果有人想要脚本,我可以发布或将代码发送给你。
我见过的其他常见问题是错误跟踪系统和电子邮件通知的帖子。
我认为最常见的一种是允许人们在提交后更改修订评论。
您需要启用 'pre-revprop-change' 挂钩脚本以允许这样做。提供的示例,如果启用,则仅允许编辑评论属性并且只能是原始提交者。非常适合纠正错别字。
我在提交时忘记输入评论。没有时间弄清楚为什么我的 pre-revprop-change 挂钩不起作用。所以下面的 svnadmin 命令对我有用,可以输入提交消息:
svnadmin setlog <filesystem path to my repository> --bypass-hooks -r 117 junk
,其中“垃圾”是包含我想成为评论的文本的文件。svn setlog help
有更多使用信息...
Windows 预提交挂钩以检查日志是否包含某些内容。
@ECHO OFF
setlocal
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Get subversion arguments
set repos=%~1
set txn=%2
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Set some variables
set svnlookparam="%repos%" -t %txn%
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
set bIsEmpty=true
for /f "tokens=* usebackq" %%g in (`svnlook log %svnlookparam%`) do (
set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY
echo Allowed. >&2
goto :END
:ERROR_EMPTY
echo Empty log messages are not allowed. >&2
goto ERROR_EXIT
:ERROR_EXIT
:: You may require to remove the /b below if your hook is called directly by subversion
exit /b 1
:END
endlocal