公司的SVN服务器是在Windows上的,ReviewBoard是在Linux虚拟服务器上的。
好吧,主要是历史原因了哦。。。
解决思路是,利用SVN的post-commit钩子,在提交后,将版本号存到一个文件中。
在Linux服务器中,定时去扫描这些文件,有变动的话,则利用RBTools提交请求。
1、Windows中用post-commit钩子获取版本号
post-commit.bat
@echo off
SET REPOS=%1%
SET REV=%2%
SET RPATH=PATH_TO_STORE_FILE
CALL :getfilename %REPOS%
echo %REV% >> %RPATH%\%FNAME%.txt
:success
exit 0
:getfilename
set FNAME=%~nx1
2、Linux中用python脚本扫描文件变动
runme.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2016-11-24
@author: Hansen
遍历监视文件夹下所有的txt文件
当文件多余两行时,对于每一行,调用rbt生成review请求
最后,只保留最后一行
'''
import os
import sys
import datetime
import nsvnutils
#记录日志
def nlog(logpath,msg):
fo = open(logpath,'a+')
try:
fo.write(msg)
finally:
fo.close()
#创建rbt命令,并调用命令
def create_rbt_command(repo, revision1, revision2, logpath):
title = repo+"_Rev"+revision1
comment = nsvnutils.get_svn_log(revision1)
commiter = nsvnutils.get_svn_commiter(revision1)
#rbt好像不支持utf8参数,因此用更新db的方式添加注释
cmd = 'rbt post -p --repository ' +repo+" --repository-type svn --server http://127.0.0.1 --api-token API_TOKEN --summary "+title+' '+revision1
fo = open(logpath,'a+')
try:
fo.write('adding rbt job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
fo.write('PWD is '+os.getcwd()+'\n')
fo.write('CMD is '+cmd+'\n')
logs = os.popen(cmd.encode('UTF8')).readlines()
for log in logs:
fo.write(log+'\n')
fo.write('\n')
finally:
fo.close()
#写回最后一行
def write_last_line(txtpath,line):
fo = open(txtpath,'w+')
try:
fo.write(line)
finally:
fo.close()
#遍历行
#多于两行则自动生成post review
def enum_line(txtpath,logpath,repo):
nlog('/mnt/rb/rb.log','Trying repositor '+repo+'\n')
fi = open(txtpath)
try:
lines=fi.readlines()
linesize=len(lines)
if linesize <= 1:
nlog('/mnt/rb/rb.log','Skiping repositor '+repo+'\n')
return
for i in range(0, linesize):
if i+1<linesize:
rbRepo = nsvnutils.get_repo_name(repo)
if len(rbRepo)==0 :
nlog('/mnt/rb/rb.log','Skiping repositor '+repo+'\n')
return
nlog('/mnt/rb/rb.log','Parsing repository '+rbRepo+'\n')
create_rbt_command(rbRepo,lines[i].replace('\n','').replace('\r',''),lines[i+1].replace('\n','').replace('\r',''),logpath)
except Exception as ex:
nlog('/mnt/rb/rb.log',str(ex))
finally:
fi.close()
write_last_line(txtpath,lines[linesize-1])
#递归遍历文件
def enum_file(targetdir,sufix,logpath):
for root, dirs, files in os.walk(targetdir, True):
for fname in files:
fsufix = os.path.splitext(fname)[1][1:]
repo = os.path.splitext(fname)[0]
if sufix == fsufix:
txtpath = root+"/"+fname
#txtpath = root+"\\"+fname
enum_line(txtpath,logpath,repo)
#start here
nlog("/mnt/rb/rb.log", 'Starting job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
enum_file("/mnt/rb","txt", "/mnt/rb/rb.log")
#enum_file("D:/MyProducts/Python/ReviewBoard/rb","txt", "D:/MyProducts/Python/ReviewBoard/rb/rb.log")
nlog("/mnt/rb/rb.log", 'Ending job on '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+'\n')
nsvnutils.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2016-11-24
@author: Hansen
获取指定svn文件夹下,指定svn版本的注释
'''
import os
import sys
#切换路径,并获取repository名称
def get_repo_name(repo):
mydict = {'REPO1':'REPO1','REPO2':'REPO2'}
if not mydict.get(repo):
return ''
os.chdir('/home/neohope/repository/'+mydict.get(repo))
#os.chdir('D:/MyProducts/Python/ReviewBoard/repo/'+mydict(repo))
return mydict[repo]
#获取指定svn版本的注释
def get_svn_log(revision):
cmd = 'svn log -r '+revision
logs = os.popen(cmd).readlines()
#for log in logs:
# print(log)
if len(logs)>3:
print(logs[3].replace('\r','').replace('\n',''))
return logs[3].replace('\r','').replace('\n','')
else:
print('no svn comment')
return 'no svn comment'
#获取指定svn版本的提交者
def get_svn_commiter(revision):
cmd = 'svn log -r '+revision
logs = os.popen(cmd).readlines()
if len(logs)>2:
ss=logs[1].split('|')
if len(ss)>2:
print(ss[1].strip().replace('\r','').replace('\n',''))
return ss[1].strip().replace('\r','').replace('\n','')
else:
#print('no svn commiter')
return 'no svn commiter'
else:
#print('no svn commiter')
return 'no svn commiter'
#start here
#get_svn_log('193')
#get_svn_commiter('193')
3、建立定时任务,执行脚本
crontab -l
#半小时运行一次
*/30 * * * * /home/neohope/scripts/runme.py
比较麻烦的是,仍需要在Linux下面,先把SVN的repository检出才可以。
同时要注意,要做好SVN及ReviewBoard之间名称的映射。。。