Subversion钩子的常见类型

时间:2008-08-08 17:08:52

标签: svn version-control scripting svn-hooks

人们使用哪种钩子脚本进行Subversion?只是一般的想法,但代码也会很棒!

16 个答案:

答案 0 :(得分:63)

我正在使用pre-revprop-change钩子,它允许在执行提交后实际返回并编辑注释和此类信息。如果提交注释中缺少/错误信息,这非常有用。

在这里,我为Windows NT或更高版本发布pre-revprop-change.bat批处理文件...您 当然可以通过更多修改来增强它。你也可以派生一个 post-revprop-change.cmd从中备份旧版snv:log或仅将其附加到新日志...

唯一棘手的部分是能够实际解析stdin 批处理文件...这是使用FIND.EXE命令完成的。

另一个是我收到了其他用户关于使用/bexit命令的问题的报告。如果错误情况表现不佳,您可能只需要删除特定应用程序中的/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 

答案 1 :(得分:8)

如果你有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难以排序的情况。相信我,它很有可能为你省事。

答案 2 :(得分:4)

我们使用FogBugz进行错误跟踪,它提供了subversion提交脚本,允许您在签入注释中包含案例编号,然后将错误与修复它的检查相关联。它确实需要设置WebSVN实例,以便为您的存储库提供基于Web的查看器。

答案 3 :(得分:3)

我们使用它们的几件事情:

  • 与错误跟踪器(Trac in our case - 集成 - 一条提示消息,显示“关闭#514”会自动将该错误标记为已关闭
  • 与构建集成集成(buildbot in our case - 对已监视分支的提交会触发构建
  • 用于验证提交的预提交挂钩 - 我们使用svnchecker。它验证了PEP8 correctness
  • 的Python代码
  • 将签入邮件发送到邮件列表
  • 运行缩进脚本

答案 4 :(得分:3)

在我的工作场所,我们设置了一个提交后挂钩,生成RSS源,显示在各种仪表板上,用于代码审查员,以了解何时需要审核,以及让我们看到新员工承诺就足够了。

答案 5 :(得分:3)

对于那些正在为 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。

答案 6 :(得分:1)

前一段时间在subversion用户邮件列表中对此进行了讨论。 This帖子特别有一些有用的想法。

答案 7 :(得分:1)

提交后挂钩,用于将存储库中已更改内容的电子邮件通知发送到电子邮件列表。您需要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

答案 8 :(得分:1)

我正在使用post-commit hooks(I think it's this one)向Basecamp上的论坛发送消息以进行每次提交。两个优点:

  1. 作为首席开发人员,我每天早上都会收到一份提交文件(通过来自该basecamp论坛的RSS提要),并且可以快速查看我的团队的工作情况。

  2. 我们的Trac / SVN安装在我们的防火墙之后,因此这让我在其他位置的高层建筑成为了我们正在做的事情的窗口。他们可能不理解它,但对于经理来说,很多活动看起来都很好,很多活动;)

  3. 我猜这最终结果与@Aviv正在做的相似。

    我正在研究在单独的服务器上构建最新提交以进行持续集成的解决方案,但是我将不得不改变我们对数据库模式进行更改的方式,然后才能工作。

答案 9 :(得分:0)

我有一个设置使用我发送到篝火室的Ruby Tinder库,如果有人想要我可以发布的脚本或发送代码给你。

我见过的其他常见内容是错误跟踪系统和电子邮件通知的帖子。

答案 10 :(得分:0)

我认为最常见的是允许人们在评估后更改修订评论。

您需要启用'pre-revprop-change'挂钩脚本才能允许。提供的示例,如果启用,则只允许编辑comment属性,并且只能是原始的comitter。非常适合纠正错别字。

答案 11 :(得分:0)

用于通知错误/问题管理系统存储库更改的挂钩。 IE浏览器。提交消息有问题:546或其中的类似标记被解析并提供给错误管理系统。

答案 12 :(得分:0)

我们使用钩子脚本检查以下内容:

  • 提供了提交日志消息
  • 已为提交指定了审阅者
  • 没有自动生成的代码或禁止的文件类型在存储库中登陆
  • 创建分支/标记时发送电子邮件

我们仍然希望实施以下内容:

  • 当用户获取文件锁定时发送电子邮件
  • 锁定被盗后发送电子邮件
  • 修改属性更改后向所有人发送电子邮件

答案 13 :(得分:0)

我提交时忘记输入评论。没有时间弄清楚为什么我的pre-revprop-change挂钩无效。所以以下svnadmin命令对我来说输入了一个提交消息:     svnadmin setlog <filesystem path to my repository> --bypass-hooks -r 117 junk, 其中“垃圾”是包含我想成为评论的文本的文件。 svn setlog help有更多使用信息...

答案 14 :(得分:0)

我们使用提交钩子脚本来触发我们的发布机器人。将新版本信息写入我们不同产品中名为changes.txt的文件将触发标记和相关工件的创建。

答案 15 :(得分:0)

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