• subversion钩子函数使用记录


    在把SVN服务器搭建好之后,其中有个versions目录需要限制提交,就是只能Add提交,不能Modify、Delete操作提交。

    于是研究了钩子的使用,特做如下记录。

    1、确认处理的时机

    根据需求,必然要在提交之前进行处理。在查看了网上的资料,以及实际目录下的文件之后,必然是选择 pre-commit.impl进行编辑。

    2、着手处理

    (1)将 pre-commit.impl 文件重命名为 pre-commit,就是把后缀名干掉。

    (2)编辑文件内容。我选择的是 bash。内容如下

    #!/bin/bash
    
    REPOS="$1"
    TXN="$2" 
    
    
    # Make sure that the log message contains some text.  
    SVNLOOK=/usr/bin/svnlook
    SVNROOT=/home/svn/repos
    VERSION=version
    
    
    # wc -c, count in byte
    # wc -m, count in charactor
    LOGMSG=`$SVNLOOK log "$REPOS" -t "$TXN" | wc -m` 
    if [ $LOGMSG -lt 10 ]; then 
    	echo -e "Log message cann't be empty! you must input more than 10 chars as comment!." 1>&2 
    	exit 1 
    fi
    
    
    # 2020/5/8更新开始
    $SVNLOOK changed $REPOS -t $TXN | while read line; do
        items=($line)
        if [ ${#items[@]} == 2 ]; then
            if [ "${items[1]%%/*}" == "$VERSION" ] && [ "x${items[0]}" != "xA" ]; then 
                echo -e "ERR-S1: "$REPOS/$VERSION" folder only support add action.
    $line
    " 1>&2
                exit 1
            fi
        else
            echo -e "ERR-S2: too many args(${#items[@]}).
    $line
    " 1>&2
            exit 1
        fi  
    done
     
    # 因为前面使用了 while,属于一个新的进程,在while里面的break/exit都是终止while本身的进程
    # 所以当while结束,运行到这里的时候必须判断while的执行结果
    if [ $? != 0 ]; then
        echo -e "
    提示:
    version目录下仅支持新增操作,或者你的提交项中路径名(文件名/目录名)存在空格。
    请仔细检查!
    " 1>&2
        exit 1
    fi
     
    #2020/5/8更新结束
      
    
    # Exit on all errors.
    set -e
    
    # Check that the author of this commit has the rights to perform
    # the commit on the files and directories being modified.
    if [ -e "$REPOS"/hooks/commit-access-control.pl ] && [ -e "$REPOS"/hooks/commit-access-control.cfg ];
    then
    	"$REPOS"/hooks/commit-access-control.pl "$REPOS" $TXN 
    	  "$REPOS"/hooks/commit-access-control.cfg
    fi
    
    # All checks passed, so allow the commit.
    exit 0
    

      配置之后,进行了简单的验证,确认功能正常。先用着 ,以后实际有啥问题再补充记录。

     

    3、弯路

    在配置过程中,走了些弯路。

    (1)如何获取本地提交的修改清单?

    我前面使用svnlook的时候,只带了 repository 参数,没有带 transaction 参数,导致获取的提交信息全部是上一次已经提交的记录信息。为此查找无数网页,最后顿悟才发现是自己少传了参数。脚本开头传递进来的两个参数,第一个就是仓库地址,第二个就是本次事务ID。对于本次操作的各类信息,都是基于这个事务ID的。

    (2)如何在shell的循环里面变更变量的值?

    这个我搞来搞去,没搞定,翻了不少网页,最后确认将    command | while xx do  ... done 模式改成  while xx do ... done <<< $(command) 模式才,且在循环里面采用  var=$(($var+1)) 这样的写法才达到目的。

    (4)配置后,报错提示“commit-access-control.pl”找不到的错误

    找来找去,没看到网上有什么资料,我 直接先判断文件是否存在然后屏蔽 这个文件的操作。

     

    2020/5/8
    
    解决while循环读取的line数据只有一行而导致判断出错的问题。
    
    一开始我使用的是:
    while read line; do
    ...
    done <<< `command`
    这种重定向的方式来逐行解析,但是command的结果被当成一行数据处理了。
    
    我的两个想法:
    1、在while循环中逐行判断;
    2、在while循环中更改变量的值,待while结束后根据变量的值做不同的处理。
    
    为了实现上面的第2个想法,我尝试过(管道):
    `command` | while read line; do
    ...
    done
    这种方式无法更改变量的值,最后找了半天,换成 “<<<”(重定向)这种方式就可以了。
    
    在网上看到说
    RESULT=`$SVNLOOK changed $REPOS -t $TXN`
    echo $RESULT
    echo "$RESULT"
    如果没有引号,则输出的只有一行数据,即执行结果的换行符被替换成空格了。
    我在ubuntu和centos下都测试了下,确实如此。
    
    于是我就使用(重定向)
    while read line; do
    ...
    done <<< `echo "$RESULT"`
    结果就差异化了。
    在ubuntu上,可以逐行打印结果,
    但centos上,就只有一行数据。
    我也不知道问题出在哪里。
    
    于是干脆简单点,放弃我前面的第2个想法,改为“直接在while中判断后做出处理”。
    所以最后我更改成(妥协了,还是使用管道)
    $SVNLOOK changed $REPOS -t $TXN | while read line; do
        if [ ... ]; then
    	    # 注意这里的exit只能结束while循环,无法结束整个脚本的运行
    	    exit 1
    	fi
    done
    
    # 注意这里是判断while循环的执行结果,这里的exit才能结束整个脚本的运行
    if [ $? != 0 ]; then
        exit 1
    fi
    
    为什么在while里面的exit无法结束整个脚本?
    因为while实际启动的是一个新的进程(管道?),里面的exit执行只是退出while所启动的那个进程。
    这也是while循环里面更改变量的值之后,在主代码处理区域中不生效的原因所在。
    

      

    <完>

     

     

    如果转载,请注明出处。https://www.cnblogs.com/ssdq/
  • 相关阅读:
    Swift 面向对象解析(二)
    Swift 面向对象解析(一)
    iOS 动画笔记 (二)
    iOS 动画笔记 (一)
    UICollectionView 很简单的写个瀑布流
    MVC校验
    win8.1弹框
    Python开发之pip使用详解
    MySQL基础之数据类型和运算符
    网络爬虫之scrapy爬取某招聘网手机APP发布信息
  • 原文地址:https://www.cnblogs.com/ssdq/p/12693086.html
Copyright © 2020-2023  润新知