天天看點

SVN鈎子運用(二)

一、Svn鈎子腳本簡介

鈎子腳本的具體寫法就是作業系統shell腳本程式寫法,請根據自己SVN所在的作業系統和shell程式進行相應的開發。

鈎子腳本就是被某些版本庫事件觸發的程式,例如建立新版本或修改未被版本控制的屬性。每個鈎子都能掌管足夠的資訊來了解發生了什麼事件,操作對象是什麼以及觸發事件使用者的賬号。根據鈎子的輸出或者傳回狀态,鈎子程式能夠以某種方式控制該動作繼續執行,停止或者挂起。

svn的hooks模版功能介紹

start-commit送出前觸發事務

pre-commit送出完成前觸發事務

post-commit送出完成時觸發事務

pre-revprop-change版本屬性修改前觸發事務

post-revprop-change版本屬性修改後觸發事務

post-commit

在送出完成,成功建立版本之後執行該鈎子,送出已經完成,不可更改,是以腳本傳回值被忽略

post-lock

對檔案進行加鎖操作之後執行該腳本

post-revprop-change

在修改revision屬性之後,執行該腳本。因為修改稿已經完成,不可更改,是以本腳本的傳回值被飯忽略

(不過實際上的實作似乎是該腳本的正确執行與否影響屬性修改)

post-unlock

對檔案進行解鎖操作之後執行該腳本

pre-commit

在Subversion transaction完畢之後,在送出之前,執行該腳本

pre-revprop-change

在修改revision屬性之前,執行該腳本

start-commit

對用戶端還沒有向伺服器送出資料之前,即還沒有建立Subversion transaction(縮寫txn)之前,執行該腳本

預設情況下,鈎子的子目錄中包含各種版本庫鈎子模闆

[root@svn ~]# ls -l /application/svndata/sadoc/hooks/

總用量 36

-rw-r--r-- 1 root root 1977 6月  15 16:42 post-commit.tmpl

-rw-r--r-- 1 root root 1638 6月  15 16:42 post-lock.tmpl

-rw-r--r-- 1 root root 2289 6月  15 16:42 post-revprop-change.tmpl

-rw-r--r-- 1 root root 1567 6月  15 16:42 post-unlock.tmpl

-rw-r--r-- 1 root root 3426 6月  15 16:42 pre-commit.tmpl

-rw-r--r-- 1 root root 2410 6月  15 16:42 pre-lock.tmpl

-rw-r--r-- 1 root root 2786 6月  15 16:42 pre-revprop-change.tmpl

-rw-r--r-- 1 root root 2100 6月  15 16:42 pre-unlock.tmpl

-rw-r--r-- 1 root root 2780 6月  15 16:42 start-commit.tmpl

[root@svn hooks]# cp post-commit.tmpl post-commit

[root@svn hooks]# vim post-commit

REPOS="$1"

REV="$2"

mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

touch /tmp/$(date +%MS).log

[root@svn hooks]# chmod 755 post-commit

二、在用戶端下

在D:\oldboy\trunk\test\tom.txt

<a href="http://s3.51cto.com/wyfs02/M02/6E/8D/wKiom1V_lRygEWoKAAD5op7ripE781.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/6E/8D/wKiom1V_lWXiXW62AAKXuB9Wx8g677.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6E/89/wKioL1V_lyfxnifSAAIAa8d6RT4194.jpg" target="_blank"></a>

四、在傳回svn伺服器

    送出完成,觸發程式,在/tmp下多了日志檔案

[root@svn hooks]# ll -lrt /tmp

總用量 16

drwx------. 2 root root 16384 4月  24 17:56 lost+found

-rw-r--r--  1 root root     0 6月  16 11:04 04S.log

-rw-r--r--  1 root root     0 6月  16 11:04 0452.log

-rw-r--r--  1 root root     0 6月  16 11:06 0644.log

-rw-r--r--  1 root root     0 6月  16 11:12 1224.log

-rw-r--r--  1 root root     0 6月  16 11:15 1548.log

五、鈎子腳本post-commit

TXN="$2"

#此處更改大小限制,這裡是5M

MAX_SIZE=5242880

#此處增加限制檔案後比綴名

FILTER='\.(zip|rar|o|obj|tar|gz)$'

#Make sure that the log message contains some test

SVNLOOK=/usr/bin/svnlook

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

LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -c`

if [ "$LOGMSG" -lt 9 ];

then

        echo -e "nLog message cann't be empty! you must input more than 8 chars as comment!." 1&gt;&amp;2

exit 1

fi

files=$($SVNLOOK changed -t $TXN $REPOS |cut -d "" -f 4-)

#echo "$files"&gt;&amp;2

#echo "$r"&gt;&amp;2

#exit 1

rc=0

echo "$files" | while read f;

do

#check file type

filesize=`$SVNLOOK cat -t "$TXN" "$REPOS" "$f" | wc -c `

if [ "filezie" -gt "$MAX_SIZE" ];

        echo "File $f is too large(must &lt;+$MAX_SIZE)B" &gt;&amp;2

        exit 1

done

#All checks passed,so allow the commit.

if [ $? -eq 1 ];

else

exit 0

本文轉自 zouqingyun 51CTO部落格,原文連結:http://blog.51cto.com/zouqingyun/1662285,如需轉載請自行聯系原作者