Subversion钩子
浏览:2450次 出处信息
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 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来解决,具体代码这里就不唠叨了,留给大家自己玩吧。
建议继续学习:
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:千万别学数学:最折磨人的数学未解之谜(二)
后一篇:趣题:旋转桌子避免灯泡全亮 >>
文章信息
- 作者:老王 来源: 火丁笔记
- 标签: Subversion 钩子
- 发布时间:2011-09-26 23:17:06
近3天十大热文
-
[903] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[55] 整理了一份招PHP高级工程师的面试题 -
[54] Innodb分表太多或者表分区太多,会导致内 -
[54] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] 全站换域名时利用nginx和javascri -
[52] CloudSMS:免费匿名的云短信 -
[52] 海量小文件存储 -
[51] 用 Jquery 模拟 select -
[49] jQuery性能优化指南
