SVN project revision monitor on Linux

Monitor revision of SVN repository, auto send change log to user by mail

pmt.sh

#!/usr/bin/bash
################################################################################
# 自动获取SVN版更新信息,并发送邮件通知
# 历史记录:
#   2012-12-20    v1.0    Dennis  Create
#   2012-12-21    v1.1    Dennis  增加注释,加入文件存在判断和写日志
#   2012-12-24    v1.2    Dennis  增加log日期注释,加入文件存在判断和写日志
################################################################################

conf_file=/etc/pmt.conf
log_file=/tmp/pmt.log

cur_time=`date "+%F %R:%S"`
echo $cur_time "pmt start" >> $log_file

# 如果配置文件不存在, 退出程序
if [ ! -f $conf_file ]
then
    echo "Not found $conf_file" >> $log_file
    goto _EXIT
fi

# Fields: project#url#revision#mail
# 每行列数目为4,使用#号作为分割符号提取行信息到数组arr 
field_size=4
arr=($(awk -F'#' '{print $1,$2,$3,$4}' $conf_file))

# 以4个元素为一个单位,获取数组大小, 以模仿二维数组
item_size=$[${#arr[@]}/$field_size]

while true 
do
    # 循环二维数组(模仿)
    for ((i=0;i<$item_size;i++))
    do
    {
    index=$[i*$field_size]

    prj=${arr[$[index+0]]}
    url=${arr[$[index+1]]}
    rev_old=${arr[$[index+2]]}
    # 提取最新版本号
    rev_new=$(svn info $url | awk 'NR==8{print $NF}')

    if (( $rev_new > $rev_old ))
    then
        # 更新版本号到数组
        arr[$[index+2]]=$rev_new

        # 提取log信息
        svn log $url -r $rev_new:$rev_old > svn.log

        subject="[svn monitor]"${arr[$[index+0]]}" update"
        to=${arr[$[index+3]]}

        # 发送邮件通知
        mail -s "$subject" $to < svn.log

        # 修改为最新版本号
        # sed中使用变量要加上单引号
        sed -i '/'$prj'/{s/\(.*#.*#\)[0-9]\+/\1'$rev_new'/}' $conf_file

        cur_time=`date "+%F %R:%S"`
        echo $cur_time "${arr[$[index+0]]} update, mail to $to" >> $log_file
    fi
    }
    done
    sleep 5
done

:_EXIT
cur_time=`date "+%F %R:%S"`
echo $cur_time "pmt exit" >> $log_file
exit 0

pmt.conf

project01#http://172.168.1.122/repos/dev/project01#18559#usr01@gmail.com
project02#http://172.168.1.122/repos/dev/project02#18635#usr02@gmail.com