• svn hooks的使用demo


    我是理论家:

    svn server端提供了Hooks Script。所谓钩子实际上是一种时间触发机制,是指当系统执行到某个特殊的事件时,触发我们预定义的动作,可以让我们在某些特定状态发生的时候做我们想做的事。同时,钩子可以调用shell、批处理文件或者perl、python、ruby等脚本。

    那么Svn的Hooks 在哪里呢?

    进入一个svn的代码仓库,在仓库目录下有一个Hooks的目录,进入该目录,正常情况下,你应该看到的是下图(每一个Repo对应一个hooks目录

    ·

    .tmpl是每个hooks的模板文件,其实都是文本文件,使用vim打开后,可以看到里面的注释和详细的说明,这些是我们可以使用的第一手的帮助文件。

    如上图svn服务端有9种钩子,分别是:

    A.关于锁定的2种
    a1.pre-lock
    a2.post-lock
    B.关于解锁的2种
    b1.pre-unlock
    b2.post-unlock
    C.关于提交的3种
    c1.start-commit
    c2.pre-commit
    c3.post-commit

    顺序是:c1---->c2----->c3

    D.关于属性的2种
    d1.pre-revprop-change
    d2.post-revprop-change

    需要特别注意的是:为安全起见,svn执行脚本的环境变量为空(连PATH环境变量都木),所以你需要使用绝对路径或者定义PATH环境。

    pre-lock:在每次有人尝试锁定文件时执行。可以防止完全锁定,或者用来创建控制哪些用户可以锁定哪些路径的复杂策略。如果钩子发现已存在锁,也可以决定是否允许用户“窃取”这个锁。

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

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

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

    start-comint:开始提交事务前调用,通常用来判定一个用户是否有权提交。同时传入三个参数,第一个是提交的Repository的路径(服务器端的实际路径),第二个是尝试提交的用户名,第三个是一些capabilities信息,是在1.5 version中新加入的,建议是不使用。

    pre-commit:在事务完成提交之前运行,同时传两个参数进去,一个就是提交的Repository的路径(服务器端的实际路径),第二个是TXN-Name.(Transaction Name),这个是用于标识此提交进程的事务ID。

    post-commit:它在事务完成后运行,创建一个新的修订版本。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者作为版本库的备份。版本库传给程序两个参数:到版本库的路径和被创建的新的修订版本号。退出程序会被忽略。

    pre-revprop-change:因为Subversion的修订版本属性不是版本化的,对这类属性的修改(例如提交日志属性svn:log)将会永久覆盖以前的属性值。因为数据在此可能 丢失,所以Subversion提供了这种钩子(及与之对应的post-revprop-change),因此版本库管理员可用一些外部方法记录变化。作为对丢失未版本化属性数据的防范,Subversion客户端不能远程修改修订版本属性,除非为你的版本库实现这个钩子。

    post-revprop-change:这个钩子与pre-revprop-change对应。事实上,因为多疑的原因,只有存在pre-revprop-change时这个脚本才会执行。当这 两个钩子都存在时,post-revprop-change在修订版本属性被改变之后运行,通常用来发送包含新属性的email。版本库传递四个参数给该 钩子:到版本库的路径,属性存在的修订版本,经过校验的产生变化的用户名,和属性自身的名字。

    下面来点实战:

    Question1:实现一些白名单之类的功能,只有在某个文件里用户才能提交到svn。

    由于是在提交之前做一写工作,这里需要用到start-commit这个hooks,通过对比start-commit传入的用户这个参数和白名单里的用户,来判断是否准入。

    代码如下:

    #!/bin/bash
    
    # START-COMMIT HOOK
    #
    # The start-commit hook is invoked before a Subversion txn is created
    # in the process of doing a commit.  Subversion runs this hook
    # by invoking a program (script, executable, binary, etc.) named
    # 'start-commit' (for which this file is a template)
    REPOS="$1"
    USER="$2"
    
    BLACKLIST_FILE="$REPOS/hooks/BLACK_LIST"
    # check if the user is in the black list
    #commit-allower.pl --repository "$REPOS" --user "$USER" || exit 1
    #special-auth-check.py --user "$USER" --auth-level 3 || exit 1
    if  [ -s $BLACKLIST_FILE ]; then 
        (grep -v "^#" $BLACKLIST_FILE | grep -iwq $USER ) || exit 1    
        #exit 1
    fi
    # All checks passed, so allow the commit.
    exit 0

    这里用到了一些shell的知识,关于shell的坑,以后再总结。

    Question2:强制svn的提交者必须输入对应的log,我们就需要pre-commit这个hooks。

    接下里重命名pre-commit.tmpl为pre-commit,并同时给该文件可执行权限(很重要,我就是这里忘记了,排错了好久,不然脚本执行后会显示不知所云的错误信息:svn: Commit blocked by pre-commit hook (exit code 255) with no output。)

    修改pre-commit文件内容如下:

    #!/bin/sh
    REPOS="$1"
    TXN="$2"
    SVNLOOK=/usr/bin/svnlook  
    LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
    if [ "$LOGMSG" -lt 5(要求的log长度,依实际需要修改) ];
    then
    echo -e "nEmpty log message not allowed. Commit aborted!" 1>&2
    exit 1
    fi
    # All checks passed, so allow the commit.
    exit 0

    不用重启svn,再提交代码时,就必须按要求写注释了。

    Tips:

    1,配置完成之后一定要给对应的*-commit加上可执行权限,否则会出现如图所示错误。

    ,

    2,使用post-commit的时候要慎重,因为整个操作不能保证原子性。

  • 相关阅读:
    自执行函数的几种不同写法的比较
    Textarea与懒惰渲染
    备忘:递归callee.caller导致死循环
    围观STK
    某台机器上IE8抛“Invalid procedure call or argument”异常
    QWrap Selector之W3C版
    onclick与listeners的执行先后问题
    随机问题之洗牌算法
    selector4 之 巧妙的主体定义符
    神奇的"javascript:"
  • 原文地址:https://www.cnblogs.com/babybluevino/p/3852500.html
Copyright © 2020-2023  润新知