扩展性:所有你可以想到的地方
所需:《msmtp使用特定邮箱地址发邮件-Mutt协作篇》,请安装了sendmail、mutt、msmtp服务
以为是为了适合我们公司的一些特性,所以在构建邮件配置列表的时候需要手动,或者修改一下php代码。
思路:通过输入特殊的字符串来操作特殊的功能,比如需要通知QA的的提交,则只需在提交信息内输入 " mailtoqa ”,(mailtoqa两侧有空格),也就是说你可以通过这个方法在svn提交操作上做很多你想要去实现的功能。
难点:在svn提交的信息,通过post-commit来获取后,内容都变成ASCII码,需要转换一下![非常感谢@zeal 帮助]
—-为了偷懒我用php来获取svn访问控制列表内组的用户,然后写如到通知列表
转码部分:@zeal提供部分
1 2 |
awk --re-interval '{print gensub(/?\\([0-9]{1,3})/,"\\1\n","g");}' | \ awk --re-interval '{if($0 ~ /^[0-9]{1,3}$/) {printf("%c",$0)} else {printf("%s",$0)}}' |
我稍微修改了一下,增加了对字符等一下字符的处理,不然会出现“?”
1 2 3 |
awk --re-interval '{print gensub(/?\\([0-9]{1,3})/,"\\1\n","g");}'| \ awk --re-interval '{print gensub(/^([A-Za-z,\ ]+)/,"\\1\n","g");}' | \ awk --re-interval '{if($0 ~ /^[0-9]{1,3}$/) {printf("%c",$0)} else {printf("%s",$0)}}') |
POST-COMMIT内容“shell方法”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
#!/bin/bash # 唯一要配置的就是这个svnlook的地址 # 当然最好在hooks下面创建个conf的文件夹 # chown -R 所属者.组 hooks下面的所有文件 SVNLOOK_PATH="/usr/bin/svnlook" # ################################### # Allow Configuration be modified CONFIG not't add "/" # CONFIG=代码库路径 # * grep、svnlook、dirname、basename in $PATH exist? # # 当然这个脚本没有太那么笨 REV=$2 REPOS=$1 # Cannot be modified TITLE="提醒Svn代码库有变动" LIST=0 CASE_I=0 CONFIG_PATH="${REPOS}/hooks/" declare -a TOMAIL GREP ## config CONF="${CONFIG_PATH}conf/" QA=`cat ${CONF}qa.list` ANDROIDPAD=`cat ${CONF}android_pad.list` ANDROIDVT=`cat ${CONF}android_vt.list` ANDROIDPHONE=`cat ${CONF}android_phone.list` ANDROIDVANCLCORE=`cat ${CONF}android_vanclcore.list` ANDROIDNEWVANCL=`cat ${CONF}android_newvancl.list` SYMBIANV3=`cat ${CONF}symbian_v3.list` SYMBIANV5=`cat ${CONF}symbian_v5.list` WINPHONE=`cat ${CONF}win_phone.list` PRODUCT=`cat ${CONF}product.list` IOSIPHONE=`cat ${CONF}ios_iphone.list` IOSIPAD=`cat ${CONF}ios_ipad.list` MAILLIST=`cat ${CONF}.maillist` ## GREP=( ${MAILLIST} ) REPOS_FILE=`/bin/basename $REPOS` MESS="`${SVNLOOK_PATH} log -r ${REV} ${REPOS}`" MESS_ASCII=$(echo "${MESS}" |awk --re-interval '{print gensub(/?\\([0-9]{1,3})/,"\\1\n","g");}'|awk --re-interval '{print gensub(/^([A-Za-z,\ ]+)/,"\\1\n","g");}' |awk --re-interval '{if($0 ~ /^[0-9]{1,3}$/) {printf("%c",$0)} else {printf("%s",$0)}}') AUTHOR=`${SVNLOOK_PATH} author -r ${REV} ${REPOS}` FILE=`${SVNLOOK_PATH} changed -r ${REV} ${REPOS} |awk 'NR==1 {print $0}'|awk -F ' ' '{print $2}'|awk -F '/' '{print $1}'` sed 's@#REPOS_FILE#@'"${REPOS_FILE}"'@g' ${CONF}mtl/index.html.head > ${CONF}mtl/index.html.&& mv ${CONF}mtl/index.html. ${CONF}mtl/index.html sed 's@#AUTHOR#@'"${AUTHOR}"'@g' ${CONF}mtl/index.html > ${CONF}mtl/index.html. && mv ${CONF}mtl/index.html. ${CONF}mtl/index.html sed 's@#FILE#@'"${FILE}"'@g' ${CONF}mtl/index.html > ${CONF}mtl/index.html. && mv ${CONF}mtl/index.html. ${CONF}mtl/index.html sed 's@#REVISION#@'"${REV}"'@g' ${CONF}mtl/index.html > ${CONF}mtl/index.html. && mv ${CONF}mtl/index.html. ${CONF}mtl/index.html Fun_SvnMail(){ case $TO in MAILTOQA|mailtoqa) MAILTO=${QA} ;; MAILTOPAD|mailtopad) MAILTO=${ANDROIDPAD} ;; MAILTOVT|mailtovt) MAILTO=${ANDROIDVT} ;; MAILTOVANCLCORE|androidcore) MAILTO=${ANDROIDVANCLCORE} ;; MAILTOPHONE|mailtophone) MAILTO=${ANDROIDPHONE} ;; MAILTOV3|mailtov3) MAILTO=${SYMBIANV3} ;; MAITOV5|mailtov5) MAILTO=${SYMBIANV5} ;; MAILTOWINPHONE|mailtowinphone|MAILTOWIN|mailtowin) MAILTO=${WINPHONE} ;; MAILTOIPHONE|mailtoiphone) MAILTO=${IOSIPHONE} ;; MAILTOIPAD|mailtoipad) MAILTO=${IOSIPAD} ;; MAILTOALL|mailtoall) MAILTO="${QA} ${ANDROIDPAD} ${ANDROIDVT} ${ANDROIDVANCLCORE} ${ANDROIDPHONE} ${SYMBIANV3} ${SYMBIANV5} ${WINPHONE} ${IOSIPHONE} ${IOSIPAD}" ;; *) MAILTO=FOUND ;; esac if [[ ${MAILTO} != FOUND ]];then TOMAIL=( ${MAILTO} ) while [[ "${CASE_I}" -lt "${#TOMAIL[@]}" ]] do echo "`cat ${CONF}mtl/index.html` ${MESS_ASCII} `cat ${CONF}mtl/index.html.foot`"| mutt -s "$AUTHOR $TITLE" -e "my_hdr content-type:text/html" ${TOMAIL[$CASE_I]} ((CASE_I=$CASE_I+1)) done CASE_I=0 fi } while [[ "$LIST" -lt "${#GREP[@]}" ]] do TO="" && echo ${MESS}|grep -P -o -i "?${GREP[$LIST]}?" && TO=${GREP[$LIST]} || TO=FOUND ## modifai 'grep -P -o -i " ${GREP[$LIST]}?'/'grep -P -o -i "?${GREP[$LIST]}?' if [[ ${TO} != FOUND ]];then Fun_SvnMail fi ((LIST=$LIST+1)) done ## rm -fr ${CONF}mtl/index.html |
php文件内容:配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
[root@PEK7-QAS-01 svn]# cat maillist_config.php <?php // // --- 以下均包含文件本身,如:/opt/svnroot/conf/android_vancl.conf $vanclmobile_path="/opt/svnroot/KINGGOOMobile/hooks/"; $maillist='/opt/svn_config/KINGGOOMobile.org'; //$create_list="1" ;// "1" or "0", 0 is to create file $mailto=array( array( // 组邮件配置列表文件 "QA", "ANDROID_PAD" , "ANDROID_VT" , "ANDROID_NEWVANCL" , "ANDROID_PHONE" , "ANDROID_VANCLCORE" , "SYMBIAN_V3" , "SYMBIAN_V5" , "WINPHONE_PHONE" , "IOS_IPHONE" , "IOS_IPAD" , "PRODUCT" , ), array( // 组邮件配置列表文件 $vanclmobile_path."conf/qa.list" , // 测试邮件组 $vanclmobile_path."conf/android_pad.list", // android pad开发邮件组 $vanclmobile_path."conf/android_vt.list", // android vt开发邮件组 $vanclmobile_path."conf/android_newvancl.list", // android newvancl开发邮件组 $vanclmobile_path."conf/android_phone.list", // android new开发邮件组 $vanclmobile_path."conf/android_vanclcore.list", // android vanclcore开发邮件组 $vanclmobile_path."conf/symbian_v3.list", // symbian v3 开发邮件组 $vanclmobile_path."conf/symbian_v5.list", // symbian v5开发邮件组 $vanclmobile_path."conf/win_phone.list", // windowsphone开发邮件组 $vanclmobile_path."conf/ios_iphone.list", // iPhone开发邮件组 $vanclmobile_path."conf/ios_ipad.list", // iPad开发邮件组 $vanclmobile_path."conf/product.list", // 产品组 //$vanclmobile_path."conf/.maillist" // svn权限分配的配置文件路径 ), array( "mailtoqa|MAILTOQA", "mailtopad|MAILTOPAD" , "mailtovt|MAILTOVT" , "mailtonewvancl|MAILTONEWVANCL" , "mailtophone|MAILTOPHONE" , "mailtovanclcore|MAILTOVANCLCORE" , "mailtov3|MAILTOV3" , "mailtov5|MAILTOV5" , "mailtowinphone|MAILTOWINPHONE" , "mailtoiphone|MAILTOIPHONE" , "mailtoipad|MAILTOIPAD" , "mailtoproduct|MAILTOPRODUCT" ) ); ?> |
php文件内容:写入邮件列表文件/处理邮箱后缀等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
[root@PEK7-QAS-01 svn]# cat svnmaillist.php <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php include_once("maillist_config.php"); ?> <?php $config_org=file_get_contents("$maillist"); $org_regular = "/##groupsstart(.*?)##groupsstart/is"; $group_regular = "/(^[a-z0-9_]+)=([a-z0-9_,.]+)/im"; $mode = "/([a-z0-9_.]+),|$/ie"; preg_match_all($org_regular, $config_org, $arr_); //范围正则 $vanclmobile_org=$arr_[1][0]; function _switch($mailname){ //判断正则后字符串是否含有 “.” if(strstr($mailname, ".")){ return $mailname."@***.*** "; //外包公司邮箱拼接 }else{ return $mailname."@***.*** "; //公司邮箱拼接 } } function _writemaillist($writelist_group,$writelist_mail){ //写入邮箱 //$writelist_group maillist_config数组内的配置文件路径 //$writelist_mail svn配置文件内组的用户(处理过) if(is_writeable($writelist_group)){ $fp=fopen($writelist_group,"w"); fwrite($fp, $writelist_mail); fclose($fp); }else { echo "<font color=red site:13px>文件:“".$writelist_group."”不可写或不存在,请更改此文件为可写状态<br />"; $writemaillist_error=1; return $writemaillist_error; } } echo "<hr />"; if(preg_match_all($group_regular, $vanclmobile_org, $arr)){ $arr[2] = preg_replace($mode, "_switch('\\1')", $arr[2]) ; $len_arr=count($arr[1]); //MOBILE_QA group长度 $len_mailto=count($mailto[1]); //拼接数组长度 for($i=0;$i< =$len_arr;$i++){ //其实有更好的方法来判断,我这是根据最初的想法改的!有些多余的switch,笑着飘过吧 $c=$arr[1][$i]; $d=$arr[2][$i]; for($j=0;$j<=$len_mailto;$j++){ $jlist=$mailto[0][$j]; $mailto_one=MOBILE_.$jlist; $mailto_two=$mailto[1][$j]; switch ($c){ case "$mailto_one": _writemaillist($mailto_two,$d); break; } } } if($writemaillist_error == "1"){ echo "以上文件无写入权限"; } echo "写入成功"; }else { echo "自己看看哪个地方失败了吧......"; //我觉得我这个地方写的很二~哈哈,出问题就在机器上执行一下这个php页面吧,错误信息提示还是很全的 } ?> </html> |
写的可能很多不组,还请见谅啊,实在没时间去优化更好!
- THE END -
Hello, just wanted to mention, I loved this blog post.
It was inspiring. Keep on posting!
Hey there I am so glad I found your blog,
I really found you by mistake, while I was looking on Aol for something else,
Anyhow I am here now and would just like to say many thanks for a marvelous post and a all round enjoyable
blog (I also love the theme/design), I don’t have time to look over it all at the minute but I have book-marked it and also added in your RSS feeds, so when I have time I will be back to read much more, Please do keep up the fantastic work.
I’m extremely impressed together with your writing talents and also with the layout on your weblog. Is that this a paid subject or did you modify it yourself? Anyway keep up the nice high quality writing, it’s rare to look a great blog like this one these days.
.
Is their own modifications, thx
Have you ever considered creating an e-book or guest authoring on other websites?
I have a blog based upon on the same information you
discuss and would really like to have you share some
stories/information. I know my audience would appreciate your work.
If you are even remotely interested, feel free to shoot me an e mail.
What’s up to all, how is everything, I think every one is getting more from this site, and your views are good for new viewers.
Wow, fantastic blog layout! How long have you been blogging for?
you make blogging look easy. The overall look of your web
site is wonderful, let alone the content!
Hello! my English is not good, I use Google translate, please forgive!
Thanks for your comment, I’ll do better!
THX