Subversion钩子

标签: Technical Subversion | 发表时间:2011-09-26 14:12 | 作者:老王 KnightE
出处:http://huoding.com

Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能。

所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有很多,默认有如下模板可供选择:

shell> ls /path/to/repository/hooks
post-commit.tmpl
post-lock.tmpl
post-revprop-change.tmpl
post-unlock.tmpl
pre-commit.tmpl
pre-lock.tmpl
pre-revprop-change.tmpl
pre-unlock.tmpl
start-commit.tmpl

其中最常用的是pre-commit和post-commit,也就是提交前后的钩子,下面以pre-commit为例来说明一下如何自定义Subversion钩子。

假设有一个PHP项目使用Subversion做版本控制,使用中发现了一些问题,比如程序员不写日志,或者提交的文件有BOM,或者提交的文件有语法错误,或者提交的文件不符合编码规范等等,这些问题都可以利用pre-commit钩子来解决,实际上已经有人写了解决类似问题的工具php-svn-hook,不过我们这里选择自己实现:

shell> cat /path/to/repository/hooks/pre-commit
#!/bin/bash

REPOS="$1"
TXN="$2"

SVNLOOK="/usr/bin/svnlook"
PHP="/usr/bin/php"

LOG=$($SVNLOOK log -t "$TXN" "$REPOS")

if [ "$LOG" = "" ]; then
      echo "Please input log" 1>&2
      exit 1
fi

FILES=$($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}')

for FILE in $FILES; do
    CONTENT=$($SVNLOOK cat -t "$TXN" "$REPOS" "$FILE")

    if echo "$CONTENT" | grep -q $'\xEF\xBB\xBF'; then
        echo "Please remove BOM from $FILE" 1>&2
        exit 1
    fi

    if [[ "$FILE" =~ \.(php|html)$ ]]; then
        MESSAGE=$(echo "$CONTENT" | $PHP -l 2>&1)

        if [ $? -ne 0 ]; then
            echo "$MESSAGE" | sed "s/ -/ $FILE/g" 1>&2
            exit 1
        fi
    fi
done

/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN" 1>&2 || exit 1

exit 0

注:代码里使用PHP_CodeSniffer检查编码规范。

配置好脚本后,一定要记着给脚本加上可执行属性,不然脚本执行后会显示不知所云的错误信息:svn: Commit blocked by pre-commit hook (exit code 255) with no output。

本文以pre-commit为例说明了一下钩子的用法,实际上其他脚本也很有用,比如说如果你想在提交代码后发一条微博,就可以利用post-commit来解决,大家自己领悟吧。

相关 [subversion] 推荐:

Subversion钩子

- KnightE - 火丁笔记
Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能. 所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有很多,默认有如下模板可供选择:. 其中最常用的是pre-commit和post-commit,也就是提交前后的钩子,下面以pre-commit为例来说明一下如何自定义Subversion钩子.

Subversion 1.7发布

- wang - Solidot
源代码管理系统Subversion 1.7.0发布. 主要新特性包括:集中式元数据存储、更好的HTTP支持,新的远程转储工具,新的svn patch命令等. 其中一个对用户友好的改进是:工作复本(Working copy)根目录下只有一个.svn目录,而以前版本的工作复本每个目录都有一个.svn目录.

使用 Subversion、Hudson 和 Eclipse 构建持续集成系统

- - 博客 - 伯乐在线
来源: developerWorks. 持续集成系统是指持续地编译、测试、检查和部署源代码的系统. Martin Fowler 对持续集成是这样定义的 :. 持续集成是一种软件开发实践,团队开发成员经常集成它们的工作,通常每个成员每天可能会发生多次集成. 每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误.