svn hooks

来源:互联网 发布:苹果经常无法加入网络 编辑:程序博客网 时间:2024/04/25 03:31
    钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!

下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。

有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。

所以对于看不明白钩子的同学,可以先学下Shell的基础知识。

不然只是一个理论上的SCM。

一.服务器后台管理命令

1.svnlook

1)svnlook author

可跟选项

--revision (-r)

--transaction (-t)

打印版本库一个修订版本或者事物的作者。

svnlook author -r 40 /usr/local/svn/repos

 

 2)svnlook cat

打印一个文件的内容

svnlook cat REPOS_PATH PATH_IN_REPOS

可跟选项

--revision (-r)

--transaction (-t)

svnlook cat -t ax8 /usr/local/svn/repos /trunk/README

svnlook cat -r 40 /usr/local/svn/repos /trunk/README

 

3)svnlook changed

打印修改的路径。

svnlook changed REPOS_PATH --最后一次修改

svn update样式的”状态字符:

'A '----条目添加到版本库。

'D '----条目从版本库删除。

'U '----文件内容改变了。

'_U'----条目属性改变了。

'UU'----文件内容和属性修改了。

文件和目录可以区分,目录路径后面会显示字符'/'。

可跟选项

--revision (-r)

--transaction (-t)

svnlook changed -r 39 /usr/local/svn/repos

 

4)svnlook date

 

$ svnlook date -r 40 /tmp/repos/

2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)

 

5)svnlook diff

svnlook diff REPOS_PATH

可跟选项

--revision (-r)

--transaction (-t)

--no-diff-added

--no-diff-deleted

$svnlook diff -r 40 /usr/local/svn/repos/

Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)

 

Added: trunk/vendors/deli/soda.txt

==============================================================================

 

Modified: trunk/vendors/deli/sandwich.txt

==============================================================================

--- trunk/vendors/deli/sandwich.txt (original)

+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600

@@ -0,0 +1 @@

+Don't forget the mayo!

 

Modified: trunk/vendors/deli/logo.jpg

==============================================================================

(Binary files differ)

 

Deleted: trunk/vendors/deli/chips.txt

==============================================================================

 

Deleted: trunk/vendors/deli/pickle.txt

==============================================================================

如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。

 

6)svnlook dirs-changed

打印本身修改的目录

svnlook dirs-changed REPOS_PATH

可跟选项

--revision (-r)

--transaction (-t)

$svnlook dirs-changed -r 40 /usr/local/svn/repos

trunk/vendors/deli/

 

7)svnlook history

打印版本库(如果没有路径,则是根目录)某一个路径的历史。

可跟选项

--revision (-r)

--show-ids

$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids

REVISION    PATH <ID>

--------    ---------

       19    /tags/1.0 <1.2.12>

       17    /branches/1.0-rc2 <1.1.10>

       16    /branches/1.0-rc2 <1.1.x>

       14    /trunk <1.0.q>

       13    /trunk <1.0.o>

       11    /trunk <1.0.k>

        9    /trunk <1.0.g>

        8    /trunk <1.0.e>

        7    /trunk <1.0.b>

        6    /trunk <1.0.9>

        5    /trunk <1.0.7>

        4    /trunk <1.0.6>

        2    /trunk <1.0.3>

        1    /trunk <1.0.2>

8)svnlook info

打印作者、时间戳、日志信息大小和日志信息。

svnlook info REPOS_PATH

可跟选项

--revision (-r)

--transaction (-t)

$ svnlook info -r 40 /usr/local/svn/repos

sally

2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)

15

Rearrange lunch.

 

9)svnlook lock

打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。

这描述了文件tree.jpg的锁定。

 

$ svnlook lock /svn/repos /trunk/tree.jpg

UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753

Owner: harry

Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)

Expires:

Comment (1 line):

Rework the uppermost branches on the bald cypress in the foreground.

 

10)svnlook log

打印日志信息。

svnlook log REPOS_PATH

--revision (-r)

--transaction (-t)

 

例子

 

这显示了实例版本库在修订版本40的日志输出:

 

可跟选项

--revision (-r)

--transaction (-t)

 

$ svnlook log /tmp/repos/

Rearrange lunch.

 

11)svnlook tree

打印树。

svnlook tree REPOS_PATH [PATH_IN_REPOS]

打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。

 

可跟选项

--revision (-r)

--transaction (-t)

--show-ids

 

12)svnlook youngest

打印最年轻的修订版本号。

这显示了在实例版本库显示最年轻的修订版本:

 

         

$ svnlook youngest /tmp/repos/

42

 

2.svnadmin

1)svnadmin hotcopy — 制作一个版本库的热备份。

svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

 

2)svnadmin dump — 将文件系统的内容转储到标准输出。

svnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。

这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。

然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,

也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。

 

转储整个版本库:

 

$ svnadmin dump /usr/local/svn/repos

SVN-fs-dump-format-version: 1

Revision-number: 0

* Dumped revision 0.

Prop-content-length: 56

Content-length: 56

 

从版本库增量转储一个单独的事务:

 

$ svnadmin dump /usr/local/svn/repos -r 21 --incremental

* Dumped revision 21.

SVN-fs-dump-format-version: 1

Revision-number: 21

Prop-content-length: 101

Content-length: 101

 

 

二.hooks简介

 

钩子脚本在每个repos的hooks目录下面。

每个里面都有模板,名字如下:

post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl

post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl

 

下面对每个钩子的功用 做一个说明!

 

1)start-commit — 开始提交的通知

描述

 

start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。

 

如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。

输入参数

 

传递给你钩子程序的命令行参数,按照顺序是:

1.版本库路径

2.认证过的尝试提交的用户名

3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).

 

2)pre-commit — 在提交结束之前提醒。

描述

pre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。

如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。

 

输入参数

 

传递给你钩子程序的命令行参数,按照顺序是:

1.版本库路径

2.提交事务的名称

 

3)post-commit — 成功提交的通知。

描述

 

post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。

如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。

输入参数

传递给你钩子程序的命令行参数,按照顺序是:

1.版本库路径

2.提交创建的修订版本号

 

4)pre-revprop-change — 修订版本属性修改的通知。

描述

pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。

如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。

输入参数

传递给你钩子程序的命令行参数,按照顺序是:

1.版本库路径

2.要修改属性的修订版本

3.企图修改属性的认证用户名

4.属性名称已修改

5.变更描述:A (添加的),D (删除的)或M (修改的)

 

此外,Subversion 通过标准输入将属性的新值传递给钩子程序。

 

5)post-revprop-change — 修订版本属性修改成功的通知

post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。

如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。

输入参数

传递给你钩子程序的命令行参数,按照顺序是:

 

1.版本库路径

2.经修改属性的修订版本

3.做出修改的认证用户名

4.属性名称已修改

5.变更描述:A (添加的),D (删除的)或M (修改的)

 

此外,Subversion 通过标准输入将属性的前一个值传递给钩子。

 

6)post-revprop-change — 修订版本属性修改成功的通知

描述

post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。

如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。

输入参数

 

传递给你钩子程序的命令行参数,按照顺序是:

   1.版本库路径

   2.已经修改属性的修订版本

   3.做出修改的认证用户名

   4.属性名称已修改

   5.变更描述:A (添加的),D (删除的)或M (修改的)

此外,Subversion 通过标准输入将属性的前一个值传递给钩子。

 

7)post-lock — 成功锁定路径的通知。

描述

post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。

如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。

输入参数

传递给你钩子程序的命令行参数,按照顺序是:

1.版本库路径

2.锁定路径的认证用户名

 

此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。

 

8)pre-unlock — 路径解锁尝试的通知。

描述

pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。

如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。

输入参数

 

传递给你钩子程序的命令行参数,按照顺序是:

 

   1.版本库路径

   2.Versioned path which is to be unlocked

   3.Authenticated username of the person attempting the unlock

 

9)post-unlock — 路径成功解锁的通知。

描述

post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。

如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。

输入参数

传递给你钩子程序的命令行参数,按照顺序是:

1.版本库路径

2.路径解锁的认证用户名

 

此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。

 

 

三.hooks本应用demo

就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。

 

1.如果不想开发人员有删除权限,只有SCM用户有删除权限...

 

#############################################

REPOS="$1"

TXN="$2"

RES="OK"

#USER="$3"

Sorry~没有这个变量 呵呵

USER可以这么获取

USER=`svnlook author -t $TXN $REPOS`

SCMLIST="user1,user2,user3" #scm人员列表

 

if [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断

then

SVNLOOK=/usr/bin/svnlook

LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`

LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`

 

if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]

        then

        echo -e "\n You Don't have the pemmision of delete  " 1>&2

        exit 1

fi

fi

#############################################

 

 

 

2.提交完毕邮件通知

http://bbs.scmlife.com/thread-14543-1-1.html

见此帖子

3.增量备份

 

 

4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件

pre-commit

###############################

REPOS="$1"

TXN="$2"

RES="OK"

st="k2/branch/BR-K2-1_0_001_20100316/"

ABSUSER=$($SVNLOOK author $REPOS -t $TXN)

if [ $ABSUSER != "ads" ]

then

        if [ "`echo $files|grep $st`" =   "$files" ]

        then

                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2

                exit 1

        fi

fi

 

exit 0

 

###############################

自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。

 

5.钩子脚本 对锁的管理

http://bbs.scmlife.com/viewthrea ... highlight=+go2cxg

见这个帖子 有详细的说明。

 

6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)

pre-commit

########################################

REPOS="$1"

TXN="$2"

RES="OK"

MAX_SIZE=10240000

files=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')

for f in $files

do

filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)

if [ $filesize -gt $MAX_SIZE ] ; then

echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr

exit 1

fi

done

########################################

当然 这里还可以做一些其他的限制

比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制

 

转载请注明源自www.SCMLife.com,请保留版权. 本贴地址:http://bbs.scmlife.com/viewthread.php?tid=23132

原创粉丝点击