Python 一键commit文件、目录到SVN服务器

2019-09-11 16:30:03 浏览数 (1)

实现功能 1

测试环境 1

代码show 1

实现功能

一键提交文件、目录到svn

测试环境

Win7 64位

Python 3.3.2

TortoiseSVN 1.9.6-64 Bit

代码show

#!/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不是内部或外部命令,也不是可运行的程序

0 人点赞