python利用pysvn发布lib的小程序
时间:2022-04-26
本文章向大家介绍python利用pysvn发布lib的小程序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景:
本人在公司的平台部门工作,我们部门写出的代码都是编译成.a文件,定期发布版本到各个产品,现在老大要求我负责每周向公司的某个产品发布lib。发布lib的步骤大概就是自动化的兄弟给我提供一个归档的版本号、lib的标签号(对应我们平台的代码)和产品适配的标签号(对应产品代码,我们的.a文件会定期提交到这个svn下),然后我根据这个信息,操作svn,定期把适配中指定标签下的指定的两个文件夹导出到归档目录下,然后在归档路径下创建记录这次发布信息(lib、适配各包含哪些标签、版本信息)的文档,还有就是创建一个release notes,要大家填写依赖。为了方便记录我还在另一个目录下记录着每次发布的信息。大概就是这样比较机械的操作,作为程序员当然不能甘于每周重复一次这样无趣的操作,于是乎利用今天调休的时间,用python写了个脚本代替这个工作。
主要用到的是python和pysvn(python)的一个第三方库。这里注意下pysvn要和对应版本的python使用才能生效,否则import会失败,所以建议先选pysvn,然后根据版本选python。
软件下载和使用文档:
软件下载:https://www.python.org/getit/
http://pysvn.tigris.org/project_downloads.html
pysvn非常好的官方使用说明文档:http://pysvn.tigris.org/docs/pysvn_prog_ref.html
代码:
import pysvn
import os
import time
import shutil
#发布lib时对应的适配代码路径
code_path = "F:/xyp_work";
#lib的归档路径
dest_path = "F:/AR_lib发布";
#自己的备份信息
myself_save_path = "F:/save/备份.txt";
#填写依赖的路径
dependence_path = "F:/依赖";
#维护一个专门记录lib和br标签号的文档用于读取上一次发lib时的标签号
old_num_path = "F:/save/old_num.txt";
#svn 路径
lib_svn = "lib的svn路径"
br_svn = "br的svn路径"
#版本号和标签号
#verson = "esap v2R2C00B100";
#lib_num = 2;
#br_num = 7;
###读取上一次的标签号和用户输入的本次lib的标签号和版本号###
print("输入版本号");
verson = input();
print("输入lib的标签号");
lib_num = int(input());
print("输入适配的标签号");
br_num = int(input());
fp = open(old_num_path,"r");
last_lib_num = fp.readline();
last_br_num = fp.readline();
fp.close();
print("last lib num is "+str(last_lib_num));
print("last br num is "+str(last_br_num));
print("current verson is "+str(verson)+"n");
print("current lib num is "+str(lib_num)+"n");
print("current br num is "+str(br_num)+"n");
print("please confirm : y/n");
res=input();
if "y"== res:
print("now start");
else:
exit();
###################创建文件夹和文件######################
vasp = dest_path+'/'+"vasp";
vaspadp = dest_path + '/' + "vaspadp";
svn_txt = dest_path + '/'+"svn.txt";
isExists=os.path.exists(dest_path);
if not isExists:
os.makedirs(dest_path);
else:
print("AR_lib发布文件夹已存在,看看是否搞错了");
exit();
isExists=os.path.exists(vasp)
if not isExists:
os.makedirs(vasp);
isExists=os.path.exists(vaspadp)
if not isExists:
os.makedirs(vaspadp);
#svn.txt
fp = open(svn_txt,"a");
fp.write(verson+"n");
fp.write((lib_svn+" "+ str(lib_num) +"n"));
fp.write((br_svn+" "+ str(br_num) +"n"));
fp.close();
#自己的备份记录
fp = open(myself_save_path,"a");
fp.write("n");
fp.write("n");
fp.write("n");
fp.write(time.strftime("%d/%m/%Y") + "n");
fp.write(verson+"n");
fp.write((lib_svn+" "+ str(lib_num) +"n"));
fp.write((br_svn+" "+ str(br_num) +"n"));
fp.close();
#依赖文件 复制release notes.xlsx,然后重命名,否则直接创建出来不是共享的
shutil.copyfile(dependence_path+"/release notes.xlsx",dependence_path + "/" + verson+" release notes.xlsx");
#维护一个专门记录lib和br标签号的文档用于读取上一次发lib时的标签号
fp = open(old_num_path,"w");
fp.truncate(); #清除文件内容
fp.write(str(lib_num)+"n");
fp.write(str(br_num)+"n");
fp.close();
##############################################
pysvn_current_br_num = pysvn.Revision( pysvn.opt_revision_kind.number, br_num);
pysvn_log_start = pysvn.Revision( pysvn.opt_revision_kind.number, last_lib_num);
pysvn_log_end = pysvn.Revision( pysvn.opt_revision_kind.number, lib_num);
"""
retcode - boolean, False if no username and password are available. True if subversion is to use the username and password.
username - string, the username to uses
password - string, the password to use
save - boolean, return True if you want subversion to remember the username and password in the configuration directory. return False to prevent saving the username and password.
"""
#def get_login( realm, username, may_save ):
# return retcode, username, password, save
client = pysvn.Client()
#client.callback_get_login = get_login
client.revert(code_path,True);
client.update(code_path,True,pysvn_current_br_num,False);
client.export(code_path+"/vasp",vasp,True,pysvn_current_br_num,None,False);
client.export(code_path+"/product/ar/vaspadp",vaspadp,True,pysvn_current_br_num,None,False);
"""
log returns a list of log entries; each log entry is a dictionary. The dictionary contains:
author - string - the name of the author who committed the revision
date - float time - the date of the commit
message - string - the text of the log message for the commit
revision - pysvn.Revision - the revision of the commit
changed_paths - list of dictionaries. Each dictionary contains:
path - string - the path in the repository
action - string
copyfrom_path - string - if copied, the original path, else None
copyfrom_revision - pysvn.Revision - if copied, the revision of the original, else None
"""
logmessege=client.log(code_path,pysvn_log_start,pysvn_log_end,False,False);
log_file = dest_path + '/'+"log.txt";
fp = open(log_file,"a");
for log_one in logmessege:
fp.write(log_one.author +" "+ log_one.message + "n");
fp.close();
- Enterprise Library Policy Injection Application Block 之一: PIAB Overview
- Python教学——第七天
- 大数据将带来电视媒体生态式变革!大数据如何深度融合电视媒体?
- Silverlight SEO优化
- Silverlight性能优化
- WCF后续之旅(6): 通过WCF Extension实现Context信息的传递
- WCF后续之旅(6): 通过WCF Extension实现Context信息的传递
- 理性的相亲方法!精品课:《决策树》
- Asp.Net无刷新分页( jquery.pagination.js)
- 为什么网站需要用CDN来加速?
- Jmeter常用获取数据的几种方式
- [Silverlight 4 RC]RichTextBox概览
- WCF后续之旅(4):WCF Extension Point 概览
- Asp.Net无刷新上传并裁剪头像
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用wget递归镜像网站
- 整理Linux中字符串的相关操作技巧
- Ubuntu 16.04下无法安装.deb的解决方法
- 关于linux中系统输入输出的管理详解
- Linux下IP设置脚本的实例及遇到问题解决办法
- Linux与Windows文件互传(VMWare)
- 如何测试Linux下tcp最大连接数限制详解
- Linux中利用Vim对文件进行密码保护的方法详解
- Linux中禁止用户修改/重置密码
- 详解 MAC/Linux Vi配置环境变量及Java环境变量配置
- 扒开DMA映射的内裤
- 如何理解与识别Linux中的文件类型
- ubantu 16.4下Hadoop完全分布式搭建实战教程
- Linux定时删除日志的简单实现方法
- ubuntu如何安装中文输入法