【发布时间】:2010-09-05 14:09:58
【问题描述】:
人们在 Subversion 中使用哪些类型的钩子脚本?只是一般的想法,但代码也会很棒!
【问题讨论】:
标签: svn version-control scripting svn-hooks
人们在 Subversion 中使用哪些类型的钩子脚本?只是一般的想法,但代码也会很棒!
【问题讨论】:
标签: svn version-control scripting svn-hooks
我正在使用pre-revprop-change 钩子,它允许我在执行提交后实际返回并编辑 cmets 和此类信息。如果提交 cmets 中存在缺失/错误信息,这将非常有用。
我在这里发布了一个pre-revprop-change.bat Windows NT 或更高版本的批处理文件。你
当然可以通过更多的修改来增强它。您还可以导出一个
post-revprop-change.cmd 从中备份旧的 snv:log 某处或只是将其附加到新日志。
唯一棘手的部分是能够真正解析标准输入
批处理文件。这是通过FIND.EXE 命令在此处完成的。
另一件事是,我收到了其他用户关于使用/b 和exit 命令的问题的报告。如果错误情况表现不佳,您可能只需要在您的特定应用程序中删除该 /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 预提交挂钩脚本作为预防措施。它可以防止 svn updates fail for Windows users because of a file rename which only changed the case of the file name 难以解决的情况。相信我,它很有可能会为您省去麻烦。
【讨论】:
在我的工作场所,我们设置了一个提交后挂钩,它生成 RSS 提要,这些提要显示在各种仪表板中,并用于代码审查人员了解何时需要审查并让我们看到新员工承诺足够了。
【讨论】:
我们用它们做的几件事:
【讨论】:
对于那些正在为 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 进行了调整。
【讨论】:
我正在使用提交后挂钩 (I think it's this one) 为每个提交在 Basecamp 的论坛上发布消息。两大优势:
作为首席开发人员,我每天早上都会收到一份提交汇总(通过该 basecamp 论坛的 RSS 提要),并且可以很快看到我的团队在做什么。
李>我们的 Trac/SVN 安装在我们的防火墙后面,因此这让我在其他位置的上级可以了解我们正在做什么。他们可能不理解,但对于经理来说,很多活动看起来就像是很多活动;)
我猜这最终的结果类似于 @Aviv 正在做的事情。
我正在寻找在单独的服务器上构建最新提交以进行持续集成的解决方案,但我将不得不改变我们对数据库架构进行更改的方式,然后才能生效。
【讨论】:
这是不久前在颠覆用户邮件列表中讨论过的。 This 的帖子特别有一些有用的想法。
【讨论】:
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
【讨论】:
我认为最常见的一种是允许人们在提交后更改修订版 cmets。
您需要启用 'pre-revprop-change' 挂钩脚本以允许这样做。提供的示例,如果启用,则仅允许编辑评论属性并且只能是原始提交者。非常适合纠正错别字。
【讨论】:
通知错误/问题管理系统存储库更改的挂钩。 IE。提交消息中包含 issue:546 或类似标签,已解析并提供给错误管理系统。
【讨论】:
我们使用钩子脚本检查以下内容:
我们仍然想实现以下内容:
【讨论】:
我们使用提交挂钩脚本来触发我们的发布机器人。在我们不同的产品中将新的发布信息写入名为 changes.txt 的文件将触发标签和相关工件的创建。
【讨论】:
我有一个使用 Ruby Tinder 库的设置,我发送到篝火室,如果有人想要脚本,我可以发布或将代码发送给你。
我见过的其他常见问题是错误跟踪系统和电子邮件通知的帖子。
【讨论】:
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
【讨论】:
我在提交时忘记输入评论。没有时间弄清楚为什么我的 pre-revprop-change 挂钩不起作用。所以下面的 svnadmin 命令可以帮助我输入提交信息:
svnadmin setlog <filesystem path to my repository> --bypass-hooks -r 117 junk,
其中“垃圾”是包含我想成为评论的文本的文件。 svn setlog help 有更多使用信息...
【讨论】: