常见的Subversion挂钩类型
人们用于Subversion的挂钩脚本有哪些?只是一般的想法,但是代码也很棒!
解决方案
回答
我认为最常见的一种方法是允许人们在上岗后更改修订注释。
我们需要启用" pre-revprop-change"挂钩脚本才能允许这样做。提供的示例(如果启用)仅允许编辑comment属性,并且只能是原始提交者。非常适合纠正错别字。
回答
在我的工作场所中,我们建立了一个提交后钩子,该钩子生成RSS提要,这些提要显示在各个仪表板上,供代码审阅者知道何时该进行审阅,并让我们看到新员工的承诺程度足够。
回答
我正在使用提交后挂钩(我想是这个)来为每次提交在Basecamp的论坛上发布消息。两个优点:
- 作为首席开发人员,我每天早晨都会汇总提交(通过该basecamp论坛的RSS提要),并且可以很快地了解我的团队所做的一切。
- 我们的Trac / SVN安装位于防火墙的后面,因此这使我在其他位置的高层可以看到我们正在做的事情。他们可能不理解,但是对于经理来说,很多活动看起来就像很多活动;)
我猜想这的最终结果类似于@Aviv所做的事情。
我正在研究用于在单独的服务器上构建最新提交以进行持续集成的解决方案,但是在此之前,我将不得不更改对数据库架构进行更改的方式。
回答
一个钩子,用于通知错误/问题管理系统对存储库的更改。 IE。提交消息中包含问题:546或者类似的标记,该消息已被解析并馈送到错误管理系统。
回答
我们使用钩子脚本检查以下内容:
- 已经提供了提交日志消息
- 已经为提交指定了审阅者
- 在存储库中没有自动生成的代码或者禁止的文件类型
- 创建分支/标签后发送电子邮件
我们仍然要实现以下内容:
- 当用户获得文件锁定时发送电子邮件
- 当锁被盗后发送电子邮件
- 修订属性更改后,向所有人发送电子邮件
回答
我们将它们用于以下几点:
- 与错误跟踪器集成(在我们的案例中为Trac-一条显示" Closes#514"的提交消息会自动将该错误标记为已关闭)
- 与构建集成集成(在我们的示例中为buildbot-对受监视分支的提交触发构建
- 预提交钩子,用于验证提交-我们使用svnchecker。它验证我们的Python代码是否具有PEP8正确性
- 将签到邮件发送到邮件列表
- 运行缩进脚本
回答
我们使用FogBugz进行错误跟踪,它提供了Subversion提交脚本,使我们可以在签入注释中包含案例编号,然后将错误与已修复的签入关联。它确实需要设置一个WebSVN实例,以便我们有一个基于Web的存储库查看器。
回答
我们使用提交钩子脚本来触发我们的发布机器人。在我们的不同产品中,将新的发行信息写入名为changes.txt的文件将触发标记和相关工件的创建。
回答
我使用发送到篝火室的Ruby Tinder库进行了一种设置,如果有人想要该脚本,我可以将其发布或者发送给我们。
我见过的其他常见问题是错误跟踪系统和电子邮件通知的帖子。
回答
如果我们同时使用unix和Windows用户,则建议我们使用case-insensitive.py pre-commit hook-script作为预防措施。它可以防止Windows用户由于文件重命名而svn更新失败而造成的难以解决的情况,因为文件重命名仅更改了文件名的大小写。相信我,这很有可能会为我们省去麻烦。
回答
不久前在Subversion用户邮件列表中对此进行了讨论。这篇文章特别有一些有用的想法。
回答
我正在使用pre-revprop-change
钩子,该钩子实际上可以返回并在执行提交后编辑注释和此类信息。如果提交注释中缺少/错误的信息,这将非常有用。
在这里,我发布了Windows NT或者更高版本的pre-revprop-change.bat批处理文件。
当然可以通过更多修改来增强它。我们还可以派生一个
从中获取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
回答
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
回答
提交后钩子将存储库中发生了某些更改的电子邮件通知发送到电子邮件列表。我们需要将sendmail.exe和sendmail.ini放在钩子文件所在的文件夹中。
我们还需要在post-commit.cmd旁边的文件post-commit.tos.txt列出邮件收件人。该文件应包含:
[email protected],[email protected],[email protected]
这是挂钩代码:
@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%[email protected] >> "%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