SVN hook 的打开方式

公司最近决定用SVN来管理设计相关的代码,虽然这个玩意有点老了,但是IC上似乎喜欢的人还是挺多,并且这个玩意比较符合IC设计的一些流程,因为IC中一般都是按照IP管理的,每个IP都相对独立,如果要用git的话,就要搞很多的submodule,实际操作起来更为复杂,并且SVN每个目录都可以单独pop,虽然达不到IC设计希望的单独文件的pop,还是比git每次都要下载整个git源要好很多,综合对比之后,我们还是决定要用SVN进行代码管理。

使用SVN代码管理之后,我们需要做一些代码提交的规范,比如tags不允许修改,今天我们主要就是针对这个问题展开。

我们知道所谓的tags, trunk等svn上常用的约定成俗的规范,实际在svn看来只是普通的目录,所以用户还是可以随心所欲的对tags进行改动,而这个操作理论上应该是不允许的,所以我们就需要通过一些手段对这个操作加以限制,防止用户意外修改tags下的内容。

其实SVN设计之初也考虑了这些问题,但是为了用户使用的灵活性,在软件上并没有做限制,而是将这些限制通过hook的方式让用户自己进行定义。在使用svnadmin创建仓库目录的时候,系统会创建一个hooks的文件夹,这个文件夹里面默认提供了一些hook的模板,当用户有需要的时候就可以定义hook来对提交的代码进行检查,或者在代码提交之后发送相应的通知等等。

这里,我们的需求是不允许用户像tags下面的文件提交更新,所以比较简单的做法就是定义一个pre-commit的钩子,这样用户每次提交的时候,SVN会检查提交是否有效(目前是简单检查提交目录中是否含有tags)关键字,如果提交无效则直接拒绝用户提交,对于这个钩子的实现,主要代码如下:

#!/bin/sh
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
#it needs somewhat numbers of commiting message
LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
Len_log=`echo ${#LOG}`
if [ $Len_log -le 10 ]; then
    echo -e "The Length of Committing Message is Too Short" 1>&2
    exit 1
fi
#prevent someone from modifying a tag
MSG=`$SVNLOOK dirs-changed -t "$TXN" "$REPOS"`
echo $MSG | grep '/tags/' > /dev/null
if [ $? -eq 0 ]; then
    echo $MSG | grep '/tags/$' > /dev/null
    if [ $? -ne 0 ]; then
        echo -e "Cannot Change A Tag! Please Recreate A New Tag." 1>&2
        exit 1
    else
        $SVNLOOK changed -t "$TXN" "$REPOS" |grep '^A' > /dev/null
        if [ $? -ne 0 ]; then
            $SVNLOOK author -t "$TXN" "$REPOS" |grep '^major$' > /dev/null
            if [ $? -eq 0 ]; then
                exit 0
            else
                echo -e "Cannot Change A Tag! Please Recreate A New Tag." 1>&2
                exit 1
            fi
        fi
    fi
fi

相关文章

发表新评论