一键commit文件、目录到SVN服务器
一键提交文件、目录到svn
Win7 64位
Python 3.3.2
TortoiseSVN 1.9.6-64 Bit
#!/usr/bin/env/ python
# -*- coding:utf-8 -*-
__author__ ='shouke'
importsubprocess
importos.path
classSVNClient:
def__init__(self):
self.svn_work_path ='D:\svn\myfolder'
if notos.path.exists(self.svn_work_path):
print('svn工作路径:%s不存在,退出程序'%self.svn_work_path)
exit()
self.try_for_filure =1# 提交失败,重试次数
defget_svn_work_path(self):
returnself.svn_work_path
defset_svn_work_path(self, svn_work_path):
self.svn_work_path = svn_work_path
defupdate(self):
args ='cd /d '+self.svn_work_path +' & svn update'
withsubprocess.Popen(args,shell=True,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)asproc:
output = proc.communicate()
print('执行svn update命令输出:%s'%str(output))
if notoutput[1]:
print('svn update命令执行成功')
return[True,'执行成功']
else:
print('svn update命令执行失败:%s'%str(output))
return [False, str(output)]
defadd(self, path):
args ='cd /d '+self.svn_work_path +' & svn add '+ path
withsubprocess.Popen(args,shell=True,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)asproc:
output = proc.communicate()
print('执行svn add命令输出:%s'% str(output))
if notoutput[1]or(notstr(output) andstr(output).find('is already under version control') != -1):
print('svn add命令执行成功')
return[True,'执行成功']
else:
print('svn add命令执行失败:%s'%str(output))
return [False,'svn add命令执行失败:%s'% str(output)]
defcommit(self, path):
args ='cd /d '+self.svn_work_path +' & svn commit -m "添加版本文件"'+ path
withsubprocess.Popen(args,shell=True,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)asproc:
output = proc.communicate()
print('执行svn commit命令输出:%s'%str(output))
if notoutput[1]:
print('svn commit命令执行成功')
return[True,'执行成功']
else:
print('svn commit命令执行失败,正在重试:%s'% str(output))
ifself.try_for_filure !=0:
self.commit(path)
self.try_for_filure =self.try_for_filure -1
return [False, str(output)]
filepath_list = []
# 获取目标目录下的文件|子目录|子文件路径
defget_subdir_or_subfile_paths(dirpath, excludes):
global filepath_list
if notos.path.exists(dirpath):
print('路径:%s不存在,退出程序'% dirpath)
exit()
elif notos.path.isdir(dirpath):
print('路径:%s不为目录'% dirpath)
return []
fornameinos.listdir(dirpath):
forexcludeinexcludes.strip(',').split(','):
if notname.endswith(exclude):
full_path = os.path.join(dirpath, name)
filepath_list.append(full_path)
ifos.path.isdir(full_path):
get_subdir_or_subfile_paths(full_path, exclude)
returnfilepath_list
if__name__ =='__main__':
svn_client = SVNClient()
svn_client.update()
dirpath ='dirname' # 'D:\svn\myfolder\dirname'
ifsvn_client.add(dirpath)[0]:
svn_client.commit(dirpath)
dirpath ='D:\svn\myfolder\dirname' # ''
# 传递每个文件、目录的绝对路径,确保重复执行时,给定目录下新增的文件也可以被提交
paths = get_subdir_or_subfile_paths(dirpath,'.svn')# .svn文件需要被过滤掉,因为无法提交成功
forpathinpaths:
ifsvn_client.add(path)[0]:
svn_client.commit(dirpath)
filepath ='myfile.txt'# 'D:\svn\myfolder\dirname\myfile.txt'
ifsvn_client.add(filepath)[0]:
svn_client.commit(filepath)
# 报错
# dirpath = 'd:/svn/dir_out_of_svn_workpath'
# if svn_client.add(dirpath)[0]:
# svn_client.commit(dirpath)
注意:
例中,svn工作路径为:'D:\svn\myfolder',即“执行checkout时选择的目录”
1、只能添加并提交位于svn工作目录下的文件目录,否则会报错,如下:
if__name__ =='__main__':
svn_client = SVNClient()
svn_client.update()
dirpath ='d:/svn/dir_out_of_svn_workpath'
ifsvn_client.add(dirpath)[0]:
svn_client.commit(dirpath)
2、如果未对给定目录执行过add类函数,那么执行add函数后,执行commit函数,将会把该目录下的文件、目录及其下子文件、子目录,一起提交svn;否则不会做任何提交操作;所以,给add传递参数,最好是通过遍历的方式,传递每个文件、目录的绝对路径。
3、安装svn时,第二项,必须选择图示红色选框框选项,否则运行会报错:svn不是内部或外部命令,也不是可运行的程序