一键commit文件、目录到SVN服务器
by:授客 QQ:1033553122
一键提交文件、目录到svn
Win7 64位
Python 3.3.2
TortoiseSVN 1.9.6-64 Bit
#!/usr/bin/env/ python
#
-*- coding:utf-8 -*-
__author__
=
'shouke'
import
subprocess
import
os.path
class
SVNClient:
def
__init__(self):
self.svn_work_path
=
'D:svnmyfolder'
if
not
os.path.exists(self.svn_work_path):
print('svn工作路径:%s
不存在,退出程序'
%
self.svn_work_path)
exit()
self.try_for_filure
=
1
# 提交失败,重试次数
def
get_svn_work_path(self):
return
self.svn_work_path
def
set_svn_work_path(self,
svn_work_path):
self.svn_work_path
= svn_work_path
def
update(self):
args
=
'cd /d '
+
self.svn_work_path
+
' & svn update'
with
subprocess.Popen(args,
shell=True,
universal_newlines
=
True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
as
proc:
output
= proc.communicate()
print('执行svn
update命令输出:%s'
%
str(output))
if
not
output[1]:
print('svn
update命令执行成功'
)
return
[True,'执行成功']
else:
print('svn
update命令执行失败:%s'
%
str(output))
return
[False,
str(output)]
def
add(self,
path):
args
=
'cd /d '
+
self.svn_work_path
+
' & svn add '
+ path
with
subprocess.Popen(args,
shell=True,
universal_newlines
=
True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
as
proc:
output
= proc.communicate()
print('执行svn
add命令输出:%s'
% str(output))
if
not
output[1]
or
(
not
str(output) and
str(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)]
def
commit(self,
path):
args
=
'cd /d '
+
self.svn_work_path
+
' & svn commit -m "添加版本文件"'
+ path
with
subprocess.Popen(args,
shell=True,
universal_newlines
=
True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
as
proc:
output
= proc.communicate()
print('执行svn
commit命令输出:%s'
%
str(output))
if
not
output[1]:
print('svn
commit命令执行成功'
)
return
[True,'执行成功']
else:
print('svn
commit命令执行失败,正在重试:%s'
% str(output))
if
self.try_for_filure
!=
0:
self.commit(path)
self.try_for_filure
=
self.try_for_filure
-
1
return
[False,
str(output)]
filepath_list
= []
#
获取目标目录下的文件|子目录|子文件路径
def
get_subdir_or_subfile_paths(dirpath, excludes):
global
filepath_list
if
not
os.path.exists(dirpath):
print('路径:%s
不存在,退出程序'
% dirpath)
exit()
elif
not
os.path.isdir(dirpath):
print('路径:%s
不为目录'
% dirpath)
return
[]
for
name
in
os.listdir(dirpath):
for
exclude
in
excludes.strip(',').split(','):
if
not
name.endswith(exclude):
full_path
= os.path.join(dirpath, name)
filepath_list.append(full_path)
if
os.path.isdir(full_path):
get_subdir_or_subfile_paths(full_path,
exclude)
return
filepath_list
if
__name__ ==
'__main__':
svn_client
= SVNClient()
svn_client.update()
dirpath
=
'dirname' #
'D:svnmyfolderdirname'
if
svn_client.add(dirpath)[0]:
svn_client.commit(dirpath)
dirpath
=
'D:svnmyfolderdirname'
#
''
#
传递每个文件、目录的绝对路径,确保重复执行时,给定目录下新增的文件也可以被提交
paths
= get_subdir_or_subfile_paths(dirpath,
'.svn')
# .svn文件需要被过滤掉,因为无法提交成功
for
path
in
paths:
if
svn_client.add(path)[0]:
svn_client.commit(dirpath)
filepath
=
'myfile.txt'
# 'D:svnmyfolderdirnamemyfile.txt'
if
svn_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:svnmyfolder',即“执行checkout时选择的目录”
1、只能添加并提交位于svn工作目录下的文件目录,否则会报错,如下:
if
__name__ ==
'__main__':
svn_client
= SVNClient()
svn_client.update()
dirpath
=
'd:/svn/dir_out_of_svn_workpath'
if
svn_client.add(dirpath)[0]:
svn_client.commit(dirpath)
2、如果未对给定目录执行过add类函数,那么执行add函数后,执行commit函数,将会把该目录下的文件、目录及其下子文件、子目录,一起提交svn;否则不会做任何提交操作;所以,给add传递参数,最好是通过遍历的方式,传递每个文件、目录的绝对路径。
3、安装svn时,第二项,必须选择图示红色选框框选项,否则运行会报错:svn不是内部或外部命令,也不是可运行的程序