python svn库_python实现svn新老库迁移

1 #!/usr/bin/env python

2 #coding=utf-8

3

4 #启动环境:linux,安装了python,svn客户端,并且具备python部分依赖包,xlrd,shutil,如果没有网上搜索安装

5 #启动方式:将文件MvSvnLibToNew.py和MvSvnLibToNew.xls放到机器的某个目录

6 #然后nohup python MvSvnLibToNew.py type > 1.log& 启动,type=0-只检测配置,不上传,type=1-既检测配置,又上传

7 #配置文件MvSvnLibToNew.xls,有7列配置项,分别为

8

9 #配置文件参数说明如下

10 #old_url:老库的待迁移的svn地址

11 #old_local_path:下载到本地的目录

12 #old_username:老库的svn用户名

13 #old_password:老库的svn密码

14 #new_url:新库的上传路径

15 #new_username:新库的svn用户名

16 #new_password:新库的svn密码

17

18 #有如下检测功能

19 #检测old_url是否存在,用户名密码是否正确

20 #检测new_url是否存在,用户名密码是否正确

21 #检测new_url路径配置是否跟old_new的子目录一样

22

23 importos24 importxlrd25 importsys26 importshutil27

28 #python 3.8不需要

29 #reload(sys)

30 #sys.setdefaultencoding('utf-8')

31

32 defexecCmd(cmd):33 r =os.popen(cmd)34 text =r.read()35 r.close()36 returntext37

38 #checkout文件到本地

39 defcheckOutOldLib(old_url, old_local_path, old_username, old_password):40 command_str = "svn co" + old_url + " " + old_local_path + "--username" + old_username + "--password" + old_password + "--non-interactive"

41 print(command_str)42 text =execCmd(command_str)43 print(text)44

45 #判断远程目录是否存在

46 defjudgeRemoteDirExist(old_url, old_username, old_password, new_url, new_username, new_password):47 #判断老库是否存在

48 command_str = "svn ls" + old_url + "--username" + old_username + "--password" +old_password49 print(command_str)50 text =execCmd(command_str)51 #print(text)

52 if len(text) ==0 :53 print("ERROR:old_url[%s]不存在!" %(old_url))54 return(False)55

56 #首先判断新老连接配置最后的目录是否,比如old:xxxxx/develop,new:yyyyyy/develop,则会上传失败

57 listDataOld = old_url.split("/")58 listDataNew = new_url.split("/")59 #如果配置一样,则需要检测新库目录是否存在

60 if listDataOld[len(listDataOld)-1] == listDataNew[len(listDataNew)-1] :61 print("ERROR old_url[%s] 和 new_url[%s] 子目录配置一样,配置错误,请重新配置!" %(old_url, new_url))62 return(False)63 else:64 command_str = "svn ls" + new_url + "--username" + new_username + "--password" +new_password65 print(command_str)66 text =execCmd(command_str)67 #print(text)

68 if len(text) ==0 :69 return(True)70

71 #检查目录是否存在

72 #print(listDataOld[len(listDataOld)-1])

73 nPos = text.find(listDataOld[len(listDataOld)-1])74 #print(nPos)

75 #如果存在

76 if nPos >=0 :77 print("ERROR new_url: [%s] 已存在 [%s],导入失败,请确保新库导入为新的空目录!" % (new_url, listDataOld[len(listDataOld)-1]))78 return(False)79 else:80 return(True)81

82 #全量检测

83 defallCheckConfig(sheetobj):84 iSuccess =085 iFailed =086 iBool =True87 nrows =sheetobj.nrows88 ncols =sheetobj.ncols89 print("*********************************************************************************************")90 #先做一个全量检测

91 for i in range(1, nrows):92 for j inrange(ncols):93 if j ==0:94 old_url =sheetobj.row_values(i)[j]95 print("old_url: %s" %(sheetobj.row_values(i)[j]))96 elif j == 1:97 old_local_path =sheetobj.row_values(i)[j]98 print("old_local_path: %s" %(sheetobj.row_values(i)[j]))99 elif j == 2:100 old_username =sheetobj.row_values(i)[j]101 print("old_username: %s" %(sheetobj.row_values(i)[j]))102 elif j == 3:103 old_password =sheetobj.row_values(i)[j]104 print("old_password: %s" %(sheetobj.row_values(i)[j]))105 elif j == 4:106 new_url =sheetobj.row_values(i)[j]107 print("new_url: %s" %(sheetobj.row_values(i)[j]))108 elif j == 5:109 new_username =sheetobj.row_values(i)[j]110 print("new_username: %s" %(sheetobj.row_values(i)[j]))111 elif j == 6:112 new_password =sheetobj.row_values(i)[j]113 print("new_password: %s" %(sheetobj.row_values(i)[j]))114 print(" ")115 listData = old_url.split("/")116 old_local_path = old_local_path + "/" + listData[len(listData)-1]117

118 if judgeRemoteDirExist(old_url, old_username, old_password, new_url, new_username, new_password) ==False :119 print("配置异常!")120 iFailed += 1

121 iBool =False122 else:123 print("配置正常!")124 iSuccess += 1

125 print("*********************************************************************************************")126

127 print("总共检测%s个,其中配置正常%s个,配置异常%s个" % (nrows-1, iSuccess, iFailed))128 print("*********************************************************************************************")129

130 return(iBool)131

132 #全量导入新库

133 defallImportSvn(sheetobj):134 nrows =sheetobj.nrows135 ncols =sheetobj.ncols136

137 #全量导入

138 for i in range(1, nrows):139 for j inrange(ncols):140 if j ==0:141 old_url =sheetobj.row_values(i)[j]142 print("old_url: %s" %(sheetobj.row_values(i)[j]))143 elif j == 1:144 old_local_path =sheetobj.row_values(i)[j]145 print("old_local_path: %s" %(sheetobj.row_values(i)[j]))146 elif j == 2:147 old_username =sheetobj.row_values(i)[j]148 print("old_username: %s" %(sheetobj.row_values(i)[j]))149 elif j == 3:150 old_password =sheetobj.row_values(i)[j]151 print("old_password: %s" %(sheetobj.row_values(i)[j]))152 elif j == 4:153 new_url =sheetobj.row_values(i)[j]154 print("new_url: %s" %(sheetobj.row_values(i)[j]))155 elif j == 5:156 new_username =sheetobj.row_values(i)[j]157 print("new_username: %s" %(sheetobj.row_values(i)[j]))158 elif j == 6:159 new_password =sheetobj.row_values(i)[j]160 print("new_password: %s" %(sheetobj.row_values(i)[j]))161 listData = old_url.split("/")162 old_local_path = old_local_path + "/" + listData[len(listData)-1]163

164 if judgeRemoteDirExist(old_url, old_username, old_password, new_url, new_username, new_password) ==True :165 new_url = new_url + "/" + listData[len(listData)-1]166 checkOutOldLib(old_url, old_local_path, old_username, old_password)167 importNewLib(new_url, old_local_path, new_username, new_password)168 shutil.rmtree(old_local_path, ignore_errors=True)169 print("*********************************************************************************************")170

171

172 #上传本地文件到新库

173 defimportNewLib(new_url, old_local_path, new_username, new_password):174 command_str = "svn import" + old_local_path + " " + new_url + "-m 老库迁移至新库 --username" + new_username + "--password" +new_password175 print(command_str)176 text =execCmd(command_str)177 print(text)178

179 #读取配置的xls配置文件

180 defreadExcelData(excel_path):181 bookobj = xlrd.open_workbook(excel_path,encoding_override="utf-8")182 sheetobj =bookobj.sheet_by_index(0)183 returnsheetobj184

185

186 if __name__ == "__main__":187 excel_path = "./MvSvnLibToNew.xls"

188 sheetobj =readExcelData(excel_path)189

190 if len(sys.argv) != 2:191 print("start: \tpython MvSvnLibToNew.py type")192 print("param:")193 print("\ttype:")194 print("\t0-只检测配置,不上传")195 print("\t1-既检测配置,又上传")196 exit(1)197

198

199 #如果带了参数,type=0,只检测,不上传,type为其他,既检测又上传

200 #如果不带参数,既检测又上传

201 if len(sys.argv) == 2:202 type = sys.argv[1]203 #只检测,不上传

204 if type == '0':205 if allCheckConfig(sheetobj) ==False :206 exit(1)207 exit(1)208 elif type == '1':209 if allCheckConfig(sheetobj) ==False :210 exit(1)211 allImportSvn(sheetobj)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python二维表转一维表_二维表格转换成一维表格

# 加载数据import pandas as pddf_old1 pd.read_excel(r"D:\Jupyter\data\Python.xlsx",sheet_name "变一维")df_old1# 数据清洗,把第一列设为索引列df_old2 pd.read_excel(r"D:\Jupyter\data\Python.xlsx",sheet_name "变一…

java web后台_java web 后台那些事

java web 后台运行原理当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容…

MyBatis的缓存!!!!

1.一级缓存&#xff08;默认开启&#xff09; (1) 首先在UserMapper接口定义两个方法&#xff1a; package com.by.mapper;import com.by.pojo.User; import org.apache.ibatis.annotations.Param; import org.junit.Test;import java.util.List;/*** <p>Project: myb…

java动态语言_探秘Java 7:JVM动态语言支持详解

JDK 7 增加了对 JSR 292 的支持&#xff0c;在 JVM 中动态类型语言的运行速度将变得更快。这一支持的关键在于增加了新的 Java 字节码&#xff0c;invokedynamic&#xff0c;它用于方法调用&#xff0c;还有新的连接机制&#xff0c;其中包含了一个新的构造&#xff1a;方法句柄…

java 反射机制 视频_JAVA反射机制及其原理实现

9.1 概念JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;public、protected、private。OO(面向对象)&#xff0c;private私有的&#x…

python模型的属性是什么_python – Django:为什么Django模型字段的类属性?

不,原因与此相同&#xff1a;>>> class Foo(object):... bar Foo attribute...>>> f Foo()>>> f.barFoo attribute>>> Foo.barFoo attribute>>> f.bar instance attribute>>> f.barinstance attribute>>> F…

java 安卓下载文件_GitHub - Charay/downloadfile: 使用Retrofit2+Rxjava+Rxandroid+okhttp的方式下载文件并存储到sd卡指定目录...

downloadfile使用Retrofit2RxjavaRxandroidokhttp的方式下载文件并存储到sd卡指定目录使用&#xff1a;gradleStep 1.在工程build.gradle文件中加入maven地址repositories:allprojects {repositories {...maven { url https://jitpack.io }}}Step 2. 在module的build.gradle中添…

java map 队列_Java:queue队列,map集合

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Queue&#xff1a; 基本上&#xff0c;一个队列就是一个先入先出(FIFO)的数据结构Queue接口与List、Set同一级别&#xff0c;都是继承了Collection接口。LinkedList实现了Deque接 口示例代码&#xff1a;1. import java.util.Linke…

java溢出怎么处理_java数据溢出怎么处理?

publicstaticvoidmain(String[]args){//TODO自动生成的方法存根ScannerscnewScanner(System.in);Stringaasc.nextLine();sc.close();floatdn0,xn0,kn0,sn0,qn0;for(inti0;i<a...public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scnew Scanner(S…

java基础 最重要的部分_Java基础(1)最基础的部分

本文章均为自己在自学期间整理的笔记&#xff0c;2020年四月份开始学习Java&#xff0c;如有不足&#xff0c;请补充。希望对各位小伙伴都能有帮助。1.Java中public class和class区别&#xff1a;1)在一个Java文件中可以定义多个class 2)public的class不是必须的 3)public修…

logstash mysql增量_Logstash jdbc 按时间增量更新的一些总结

不同数据库的支持mysql数据类型显示样例是否支持timestampstatementtracking_columntracking_column_typeSQL示例date2020-10-20Nselect *, datediff(date, 1970-01-01) as days from tbl_time where datediff(date, 1970-01-01) > :sql_last_valuedaysnumericselect *, dat…

用java编写奖金税率_企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%_java企业利润提成计算代码...

今天上java课程的时候老师给布置了一个作业&#xff0c;让让java计算一下企业该发放的奖金总额&#xff0c;接下来吾爱编程就为大家介绍一下java实现企业发放的奖金根据利润提成的代码&#xff0c;有需要的小伙伴可以参考一下&#xff1a;1、题目如下&#xff1a;企业发放的奖金…

java 多线程工具_多线程测试工具groboutils的使用

public class FaultServiceTest extends TestCase {/*** param args* throws FaultException* throws ExpParamNotFoundException* throws ParseException*/private IFaultService faultService;private static final int NUM_THREAD 100; // 测试线程总数public FaultService…

java提取多行嵌套div/div内容的正则表达式_提取某一段div标签之间内容的正则表达式怎么写...

满意答案public static void main(String[] args) {String source"\">是大家是否gt;士大夫士大夫";StringBuilder resultnew StringBuilder();System.out.println("开始匹配文字内容");String patternStrs"()(.?)()";Pattern patternPa…

阶乘取模算法java_np问题(大数阶乘取模)

np问题题目描述&#xff1a;LYK 喜欢研究一些比较困难的问题&#xff0c;比如 np 问题。这次它又遇到一个棘手的 np 问题。问题是这个样子的&#xff1a;有两个数 n 和 p&#xff0c;求 n 的阶乘对 p 取模后的结果。LYK 觉得所有 np 问题都是没有多项式复杂度的算法的&#xff…

Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件

/*** 获取1号店生鲜食品的分类id字符串* param filePath* return*/public String getYHDSXCategoryIdStr(String filePath) {final String DELIMITER new String(new byte[]{1});final String INNER_DELIMITER ",";// 遍历目录下的所有文件BufferedReader br null…

python django 表单_Django ModelForm与Form

django表单系统中&#xff0c;所有的表单类都作为django.forms.Form的子类创建&#xff0c;包括ModelForm关于django的表单系统&#xff0c;主要分两种基于django.forms.Form基于django.forms.ModelForm表单API表单有两种状态&#xff0c;绑定&#xff0c;未绑定 Form.is_bound…

java获取2017年第39周_对输入计算机的数据进行审核,可采用()进行审核。A.抽查B.屏幕审核C.凭证清单和屏幕审核D.凭证清单...

参考答案如下对输的数单和薄基底膜肾病主要的遗传方式为A.常染色体显性遗传B.常染色体隐性遗传C.性染色体显性遗传D.性染色儿童的情感发展遵循若干的阶段,比较后出现的是()。A、入计惊讶B、好奇C、恐惧D、哀和乐算机审核智商和情商完全可以分开。()人格不包括以下哪个方面&…

php解析bt,PHP基于闭包思想实现的BT(torrent)文件解析工具实例详解

本文实例讲述了PHP基于闭包思想实现的torrent文件解析工具。分享给大家供大家参考&#xff0c;具体如下&#xff1a;PHP对静态词法域的支持有点奇怪&#xff0c;内部匿名函数必须在参数列表后面加上use关键字&#xff0c;显式的说明想要使用哪些外层函数的局部变量。function c…

php excel header,【IT专家】PHP生成excel,方法一-header生成

本文由我司收集整编&#xff0c;推荐下载&#xff0c;如有疑问&#xff0c;请与我司联系PHP生成excel&#xff0c;方法一:header生成2018/02/09 444 public function export_order() { //搜索条件$where ‘where 11 ‘; $consignee I(‘consignee’); if($consignee){ $where…