`
rikugun
  • 浏览: 349707 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

用python重写双重提交svn的脚本

阅读更多
之前的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:
			if	tn.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'脚本执行成功'
0
0
分享到:
评论

相关推荐

    Python处理svn状态脚本

    使用python调用svn命令行,完成对svn工作目录的自动清理,自动完成解决冲突和恢复版本。使用subprocess,适用于windows和mac os。 使用方法:python jtcleansvn.py workingspacepath

    用python脚本处理和分析svn log xml

    本代码实现了用python处理svn log数据(xml格式),把Log的数据转化为一个python的数据结构,方便作更进一步数据挖掘!

    SVN自动提交脚本 For Windows

    SVN自动提交脚本,通过执行SVN Status命令来获取当前目录的Svn diff,通过替换SVN diff来将文件列表转换成Svn提交命令,最后对执行所有SVN命令来完成自动提交,可以用于SVN仓库的代码自动导入

    python获取SVN日志

    指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间...

    python 实现svn文件下载

    python 实现svn的代码下载,解决了请求认证,字符编码,地址长度问题。非常不错的例子。

    SVN自动更新提交脚本.zip(windows版本)

    本压缩包"SVN自动更新提交脚本.zip(windows版本)"提供了一个在Windows环境下自动执行SVN更新和提交操作的解决方案。 1. **SVN自动更新**: SVN自动更新功能允许用户定期从服务器获取最新的项目代码,确保本地...

    python copy svn上传

    用python写的复制文件,调用svn命令上传文件的代码块

    一个很好用的SVN脚本

    这个脚本可能通过执行`svn cleanup`命令来解除锁定,或者使用`svn delete`命令来删除文件或文件夹,并将这些改变提交到服务器。 在使用这样的脚本时,需要注意以下几点: 1. **权限管理**:确保你有足够的权限执行...

    批量删除.svn脚本

    本文将详细讲解如何使用批量删除.svn脚本来清理不再需要的版本控制目录,以及与之相关的SVN操作和注意事项。 批量删除.svn脚本主要用于在代码迁移或项目整理过程中移除不再使用的Subversion工作副本目录。.svn...

    清除SVN脚本

    3. 使用`find`或`dir /s /ah`查找并删除.svn隐藏目录:这种方法可以手动或脚本化地遍历整个项目,查找并删除.svn目录。 三、使用场景 1. 项目交付:如果项目需要交付给不使用SVN的客户,清除SVN脚本可以帮助提供一...

    删除.svn脚本

    本文将详细介绍如何编写和使用一个简单的脚本来批量删除项目中的`.svn`目录。 标题"删除.svn脚本"指出,我们需要创建一个脚本来自动定位并删除项目中的`.svn`子目录。这个脚本通常会用到命令行工具,如在Unix/Linux...

    批量更新目录下所有CVS和SVN项目的Python脚本

    /usr/bin/python #coding=gb18030 # ============================================== # autoupdate - automate update cvs and svn repositories # ============================================== # by liude...

    SVN变化发送邮件(Python)

    标题 "SVN变化发送邮件(Python)" 描述的是一个使用Python编程语言实现的系统,该系统能够监控Subversion(SVN)版本控制系统中的变动,并在检测到任何更新或提交时自动发送电子邮件通知。这个功能对于团队协作尤其...

    python svn 版本间改动文件列表

    svn两个版本之间改动的文件列表 包括新增和更新的文件 用PYTHON写的脚本

    删除文件夹中所有.svn脚本

    标题 "删除文件夹中所有.svn脚本" 涉及到的是在计算机文件管理中如何清理特定类型的隐藏文件——`.svn` 文件。这些文件是Subversion(SVN)版本控制系统的一部分,用于跟踪项目文件的版本历史。在不再需要使用SVN...

    SVN半自动提交脚本

    可自动提交预设的文件,利用windows的计划任务可每天定时对文件进行提交。 可自行修改要提交的文件路径及日志的填写。

    基于Python与Shell的SVN项目自动化发布与重启脚本设计源码

    该方案为基于Python与Shell编写的SVN项目自动化发布与重启脚本,包含38个文件,涵盖16个Shell脚本、6个GZIP压缩文件、3个Python脚本、3个配置文件、2个BZIP2压缩文件、2个ZIP压缩文件、1个授权许可文件、1个INI文件...

    SVN脚本手册

    在这个 SVN 脚本手册中,我们将讨论如何使用 SVN 脚本来实现自动备份和迁移版本库的功能。该手册分为两个部分:全备份和增量备份。 全备份 全备份是指将整个版本库备份到另一个位置,用于在出现问题时恢复版本库。...

    python实现的清理svn工具

    用于删除svn文件,简单易用,注释详细,适合初学者学习。

    svn功能源代码py

    双击&命令提示符:svn.exe: 运行已保存的svn.exe 1.create: 创建svn文件夹 并开始管理 2.status: 查看(现在与原来的)状态变更 无=已管理未修改 M=已管理修改 G=已管理丢失 ?=未管理 3.add filename: ?→ +...

Global site tag (gtag.js) - Google Analytics