设为首页 收藏本站
查看: 1298|回复: 0

[经验分享] 用python重写双重提交svn的脚本

[复制链接]

尚未签到

发表于 2017-5-6 11:18:04 | 显示全部楼层 |阅读模式
之前的shell脚本是 2个svn root 同步提交
update:
2010-06-21:  导入文件支持#行注释
现在改成python写,妄图支持windows,未测试.
osx,python2.6下测试通过
目前问题:
optparse的选项默认值不能是unicode,大囧rz

#!/usr/bin/env python
#coding:utf-8
"""
Author:rikugun
Site: http://rikugun.iteye.com/
同时提交北京和本地SVN的脚本
本地环境需要设置环境变量:

本地开发编译目录 LOCAL_CRM=/Users/rikugun/Documents/tydic/Projects/LOCAL
本机实际开发目录 CRM=/Users/rikugun/Documents/tydic/Projects/CRM
执行
dsvn CRM_TRANS/src/ngbssIf/InterfaceElec/CheckInfoOrder.pc [...]
后脚本做了以下几件事
* SVN提交 $CRM/CRM_TRANS/src/ngbssIf/InterfaceElec/CheckInfoOrder.pc
* 拷贝/合并(使用合并工具) $CRM/CRM_TRANS/src/ngbssIf/InterfaceElec/CheckInfoOrder.pc $LOCAL_CRM/CRM_TRANS/src/ngbssIf/InterfaceElec/CheckInfoOrder.pc
* 如果$LOCAL_CRM/CRM_TRANS/src/ngbssIf/InterfaceElec/CheckInfoOrder.pc 不存在SVN中,执行 svn add
* SVN提交 $LOCAL_CRM/CRM_TRANS/src/ngbssIf/InterfaceElec/CheckInfoOrder.pc
* TELNET 到开发服务器, 切换到对应目录 执行 svn up  然后编译
"""
import optparse
import sys
import os
import subprocess
import telnetlib
import re
"""需要编译的文件类型"""
SOURCE_FILE_EXT =('.pc','.h','.c')
class TexudoBackend(object):
"""
Texudo后台
可以设置 _DEBUG_LEVEL 开启telnet 调试
"""
_DEBUG_LEVEL=0
def __init__(self, address,username,password=None,quite=False):
super(TexudoBackend, self).__init__()
self.address = address
self.username = username
self.password = password
self.instance = telnetlib.Telnet(host=self.address,timeout=60)
self.instance.set_debuglevel(self._DEBUG_LEVEL)
self.quite = quite
def login(self):
"""登录"""
if self.password:
self.instance.read_until("login: ")
self.instance.write(self.username+'\n')
self.instance.read_until("ssword: ")
self.instance.write(self.password+'\n')
self.instance.read_until('$ ')
return True
def exe_cmd(self,cmd):
"""执行命令"""
# print cmd
self.instance.write(cmd+'\n')
ret = self.instance.read_until('$ ').decode('GBK')
if not self.quite:
print ret
return ret
def close(self):
"""关闭链接"""
self.instance.close()
def getInput(msg):
"""获取用户输入,默认是NO"""
return opts.quite or raw_input(msg) not in ['n','no']
def sysexec(cmd):
"""执行命令幷返回结果"""
msg = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8')
if not opts.quite:
print u'================执行命令==================='
print cmd
print u'================我是分割线==================='
print msg
print u'================已执行命令==================='
return msg

SHARE_DIR_NAME = 'share'
def sort_dirs(dir1,dir2):
"""排序目录,优先编译 share 目录,再编译目录名短的"""
SHARE_DIR_NAME = 'share'
if dir1.endswith(SHARE_DIR_NAME) and not dir2.endswith(SHARE_DIR_NAME):
return -1
elif dir2.endswith(SHARE_DIR_NAME) and not dir1.endswith(SHARE_DIR_NAME):
return 1
elif dir1.endswith(SHARE_DIR_NAME) and  dir2.endswith(SHARE_DIR_NAME):
return dir1.find(SHARE_DIR_NAME) - dir2.find(SHARE_DIR_NAME)
else:
return len(dir1)-len(dir2)
if __name__ == "__main__":
opt = optparse.OptionParser("dsvn [-m comments] [-u usernaem] [-p password] [-s host] [-L listfile] filepath [other files]")
opt.add_option("-m","--comments",help=u"提交的注释",default="commit to compile")
opt.add_option("-L","--listfile",help=u"提交的文件列表")
opt.add_option("-u","--username",help=u"登录用户名",default="xxx")
opt.add_option("-p","--password",help=u"登录用户密码",default="xxx")
opt.add_option("-s","--server",help=u"登录服务器",default="xxx.xxx.xxx.xxx")
opt.add_option("-M","--mergetool",help=u"使用工具合并而非拷贝")
opt.add_option("-q","--quite",action="store_true",help=u"安静模式,所有提示都选择Y")
opts,files = opt.parse_args()
if len(files) == 0 and opts.listfile is None:
print u'请输入要提交文件,或者文件列表'
print opt.print_usage()
print __doc__
exit(2)
if not files and opts.listfile:
files = [line for line in open(opts.listfile,'r').readlines() if not line.startswith('#')]
#获取环境变量
# 开发环境
dev_dir =os.getenv('CRM')
# 本地编译目录
local_dir = os.getenv('LOCAL_CRM')
reg = re.compile(dev_dir+os.sep+'(.+)$')
#设置合并工具
if opts.mergetool is not None:
merge_cmd = opts.mergetool
elif os.name =='nt':
merge_cmd = 'copy /Y'
else:
merge_cmd='cp -r'
#过滤文件名 如 CRM_TRANS/src/share/EssErrorTrans.txt
fileset = set([reg.match(os.path.realpath(os.getcwd()+os.sep+it)).group(1).strip() for it in files])
file_list = ','.join(fileset)
#过滤需要编译的目录
dir_list = list(set([ os.path.dirname(x) for x in fileset if x.endswith(SOURCE_FILE_EXT)]))
#排序文件目录
dir_list.sort(sort_dirs)
#开发路径
src_file_list= [ dev_dir+os.sep+x  for x in fileset]
#同步到本地的路径
dst_file_list =[local_dir+os.sep+x for x in fileset]
#过滤新加的文件,需要额外执行svn add命令
add_dst_file_list = [x for x in dst_file_list if not os.path.exists(x)]
svn_cmd = ['svn ci -m "%s"' % opts.comments,]
if getInput('commit such files [%s] to BJ SVN ? (y)es/no :' % file_list) :
sysexec(' '.join(svn_cmd+src_file_list))
# 传输文件,本地提交
if getInput('commit such files [%s] to LOCAL SVN ? (y)es/no :' % file_list) :
sysexec(' '.join(['svn revert ']+dst_file_list))
map(lambda ff:sysexec(' '.join([merge_cmd,dev_dir+os.sep+ff,local_dir+os.sep+ff])),fileset)
if len(add_dst_file_list):
sysexec(' '.join(['svn add']+dst_file_list))
sysexec(' '.join(svn_cmd+dst_file_list))
# 切换到服务器编译
if getInput('Compile such files [%s] on server[%s] ? (y)es/no :' % (file_list,opts.server)) :
tn = TexudoBackend(opts.server,opts.username,opts.password)
try:
iftn.login() :
print u'登录成功'
#在服务器上更新文件
tn.exe_cmd('svn up %s' % ' '.join(files))
#逐个目录编译
for dir_path in dir_list:
tn.exe_cmd('cd ~/%s && make && make install ' % dir_path.replace('\\','/'))
except Exception:
print u"传输到服务器中编译发生错误"
tn.close()
exit(2)
print u'脚本执行成功'

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373745-1-1.html 上篇帖子: Ruby,Python不能威胁到Java的13个理由 下篇帖子: 模式代码《大话设计模式》Python版代码实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表