SVN:从post-commit钩子获取文件属性

时间:2012-04-11 19:01:11

标签: svn svn-hooks

是否可以从post-commit hook获取文件属性?

我想检查所有已更改的文件,如果其中一个或多个具有我的特定属性,我想执行某些操作。

svn propget my:property file.txt

^这只从本地工作副本读取属性,但我没有在执行钩子的env中找到它。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用钩子时,应使用svnlook命令而不是svn命令。

TXN=$1
REPOS=$2
SVNLOOK="/usr/bin/svnlook"

"$SVNLOOK" pget -t $TXN $REPOS my:property /path/in/repository

您可以通过svnlook changed命令获取已更改的文件列表:

/usr/bin/svnlook changed -t $TXN

这将为您提供更改类型(U =已更新,D =已删除,M =已修改,R =已替换)以及文件名称。您可以使用该文件名和svnlook pget命令来查看属性。

也许是这样的:

$SVNLOOK changed -t $TXN | while read changeType fileName
do
    $SVNLOOK plist -t $TXN -v $REPOS $fileName
done

shell的一个问题是你不能很容易地在循环中做循环。例如,如果我可以使用$SVNLOOK plist执行某些操作会很好,但我已经将STDOUT传递给STDIN,因此svnlook plist的任何输出都会影响我的外部循环。您可以使用各种奇怪的东西来使用其他文件描述符,但使用Python或Perl会更容易。

你也真的无法改变提交的任何内容。您无法更改文件或文件属性。您可以更改的唯一内容是修订属性,如svn:log,甚至不建议这样做。

不确定你的想法,但要小心。还要明白,任何可能花费太长时间的事情都会延迟用户的提交,因为他们等待你的提交后脚本运行。我见过人们试图在Subversion钩子中编译和运行单元测试。在这种情况下,最好使用像Jenkins这样的连续构建系统来进行提交后处理。

您可以查看我的svn-watcher-hook,看看它是如何完成的。这是一个Perl脚本,但并不是那么复杂,我试着解释我所做的一切。这不应该太难理解。