当前位置:首页> 正文

关于svn:Subversion钩子的常见类型

关于svn:Subversion钩子的常见类型

Common Types of Subversion Hooks

人们用于Subversion的挂钩脚本有哪些? 只是一般的想法,但是代码也很棒!


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

在这里,我发布了Windows NT或更高版本的pre-revprop-change.bat批处理文件...
当然可以通过更多修改来增强它。您还可以导出
post-revprop-change.cmd从它备份旧的snv:log到某处,或只是将其附加到新日志...

唯一棘手的部分是能够实际解析标准输入
批处理文件...这是通过FIND.EXE命令在此处完成的。

另一个是我收到了其他用户的报告,这些报告涉及/b命令与/b一起使用的问题。如果错误情况不能很好地解决,您可能只需要在特定的应用程序中删除该/b

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
34
35
36
37
38
39
40
41
42
43
44
45
46
@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 pre-commit hook-script作为预防措施。它可以防止由于文件重命名而导致Windows用户的svn更新失败而导致文件整理失败的情况。相信我,这很有可能为您省去麻烦。


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


在我的工作场所中,我们建立了一个提交后钩子,该钩子生成RSS提要,这些提要显示在各种仪表板上,供代码审阅者了解何时该进行审阅,并让我们看到新员工的投入程度。


对于那些正在寻找pre-revprop-change.bat进行snvsync操作的人:

https://gist.github.com/1679659

1
2
3
4
5
6
7
8
9
10
@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进行了修改。


我们将它们用于以下几点:

  • 与错误跟踪器集成(在我们的案例中为Trac-一??条显示" Closes#514"的提交消息会自动将该错误标记为已关闭
  • 与构建集成集成(在我们的示例中为buildbot-对受监视分支的提交触发构建
  • 预提交钩子,用于验证提交-我们使用svnchecker。它验证我们的Python代码是否具有PEP8正确性
  • 将签到邮件发送到邮件列表
  • 运行缩进脚本


提交后挂钩将电子邮件通知(将存储库中的某些内容发生更改)发送到电子邮件列表。您需要将sendmail.exe和sendmail.ini放在与挂钩文件相同的文件夹中。

您还需要在post-commit.cmd旁边的文件post-commit.tos.txt列出邮件收件人。该文件应包含:

1
user1@example.com,user2@example.com,user3@example.com

这是挂钩代码:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@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

我正在使用提交后挂钩(我认为这是一个)将每次提交的消息发布到Basecamp的论坛上。两个优点:

  • 作为首席开发人员,我每天早晨都会汇总提交(通过该basecamp论坛的RSS提要),并且可以看到我的团队的工作进展很快。

  • 我们的Trac / SVN安装位于防火墙的后面,因此这使我在其他位置的高层可以看到我们正在做的事情。他们可能不理解,但是对于经理来说,很多活动看起来就像很多活动;)

  • 我猜想这的最终结果类似于@Aviv所做的事情。

    我正在寻找在单独的服务器上构建最新提交以进行持续集成的解决方案,但是在此之前,我将不得不更改对数据库架构进行更改的方式。


    之前在Subversion用户邮件列表中对此进行了讨论。这篇文章特别有一些有用的想法。


    一个钩子,用于通知错误/问题管理系统对存储库的更改。就是提交消息中包含issue:546或类似的标记,该消息已解析并馈送到Bug管理系统。


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

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

    我们仍然要实现以下内容:

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


    我认为最常见的一种方法是允许人们在上岗后更改修订注释。

    您需要启用" pre-revprop-change"挂钩脚本才能允许这样做。提供的示例(如果启用)仅允许编辑comment属性,并且只能是原始提交者。非常适合纠正错别字。


    我使用发送到篝火室的Ruby Tinder库进行了一种设置,如果有人想要该脚本,我可以将其发布或发送给您。

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


    Windows预提交钩子以检查日志中是否包含某些内容。

    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
    34
    35
    @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

    我忘了在提交时输入评论。没有时间弄清楚为什么我的revprop-change钩子不起作用。因此,以下svnadmin命令为我工作,以输入提交消息:
    svnadmin setlog --bypass-hooks -r 117 junk
    其中"垃圾"是包含我要作为注释的文本的文件。 svn setlog help具有更多使用信息...


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


    展开全文阅读

    相关内容