CVS 文件自动移 tag 的 Python 脚本
CVS 文件自动移 tag 的 Python 脚本
背景
工作中使用的版本管理工具是 CVS,在两次发布中,如果修改的文件比较少,会选择用移 Tag 的方式来生成一个新 Tag 发布。文件比较少的情况下直接使用 CVS 客户端完成移 tag 操作。但是文件比较多的情况下就要考虑使用脚本来完成这个任务了。
首先,关于 CVS tag 的一些概念可以参考这篇文章 cvs tag 与 rtag, tag 与 branch 区别
命令
然后再弄清楚 CVS 移 tag 的命令。可以直接查阅 CVS 的文档 Modifying-tags
然后来看一个实例:
有一个文件名为 invoiceListingInc.jsp 所在路径是 Betty/jsp/invoiceListingInc.jsp,所在分支是 BR230_201411191736 其中的一个版本号是 1.1.2.2.14.4。本次需要移动的 tag 是 FAS_2_3-124
- 把 tag 移动指定版本 1.1.2.2.14.2 上的命令是:
cvs rtag -r 1.1.2.2.14.2 -F FAS_2_3- Betty/jsp/invoiceListingInc.jsp
- 把 tag 移动指定分支 BR230_201411191736 上的最新版的命令是:
cvs rtag -r BR230_201411191736 -F FAS_2_3-124 Betty/jsp/invoiceListingInc.jsp
脚本
弄清楚了 CVS 的移 tag 命令,就可以开始写脚本了,脚本要做的工作就是处理一个文件列表,然后生成 CVS 命令并执行。Python 脚本如下:
# -- coding: utf-8 -- import sys
import os
import re
# 使用sys.stdin.readline()方法读入用户输入的一行 #分析可用的分支def showBranch(fileName, maps):
file = open(fileName)
index = 1
while 1:
line = file.readline()
if not line:
break
print " %d : %s "%(index, line[:-1])
maps[index] = line[:-1]
index += 1#分析文件列表def showFile(fileName, maps, namelist, branch):
file = open(fileName)
while 1:
line = file.readline()
if not line:
break
text = line[:-1]
text = text.replace('Betty/', '').replace('\t', '')
text = re.sub('\s+', ' ', text)
if len(text) > 1 :
names = text.split(' ')
fileName = 'Betty/' + names[0]
namelist.append(fileName)
if len(names) > 1 and len(names[1]) > 1 :
maps[fileName] = names[1]
else:
maps[fileName] = branch def arsk(title):
if title:
print title
line = sys.stdin.readline()
return line[:-1] branchs = {}
branch = ''print 'Select Branch:'
showBranch("branchs.txt", branchs)
branchNum = int(arsk(''))
branch = branchs[branchNum] print 'Input The Tag:'
line = sys.stdin.readline()
tag = line[:-1] versions = {}
names = []
showFile("files.txt", versions, names, branch)
for key in names:
print '%s;\tversion:%s;' %(key, versions[key])
print 'App will move these %d files to Tag : %s on Branch %s : ' % (len(names), tag, branch)
yes = arsk('Are you sure to do that ? y/n')
while 'y' not in yes and 'n' not in yes:
yes = arsk('Are you sure to do that ? y/n') if 'y' in yes:
target = open('command.txt', 'w') #打开文件
target.truncate() #清空文件
for key in names:
cmd = 'cvs rtag -r %s -F %s %s' % (versions[key], tag, key)
target.write(cmd) #写入文件
target.write('\n')
print cmd
os.system(cmd)
target.close()
脚本读取当前目录下的 file.txt 文件里的文件列表,使用 branchs.txt 文件来存储分支信息。如果需要移 tag 至指定版本号,则需要在 file.txt 里的文件名之后输入版本号。
在 CMD 输入输入
python movetag.py
来执行脚本。执行效果图如下:

最后输入 Y 确认移 tag 即可。
注意:移 tag 有风险,操作需谨慎。
另: 此脚本默认所在的运行环境是可以直接执行 cvs 命令的。 如果你对这个脚本不放心,可以注释掉自动执行 CVS 命令的那行脚本(倒数第二行):
#os.system(cmd)
这样就不会执行 CVS 的移 tag 命令了,而且脚本会在当前目录生成一个 command.txt 文件。里面就是处理好的 CVS 命令,你可以酌情自行执行。
完整的文件: 点击下载
CVS 文件自动移 tag 的 Python 脚本的更多相关文章
- 【Python脚本】Python创建删除文件-----------我的第一个Python脚本
Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...
- vim—自动缩进(编写Python脚本)
大神推荐使用vim编写Python脚本,学而时积之,不亦乐乎! 使用vim编写Python脚本的时候不能正常缩进,需要修改vimrc文件 Ubuntu系统下vimrc文件的位置: $ cd /etc/ ...
- Python核心笔记:在python文件中如何调用其它python脚本文件,你肯定不会
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:zhujuyu 笔者在自学python的时候遇到了这样一个练习题:将 ...
- 使用rdb文件进行redis数据迁移--python脚本
查找了一些redis迁移的方法,一般做法就是 1. 从源数据库把rdb文件保存,然后传到新的主机上,启动新的redis即可 2. 把新的redis当做源数据库的slave,同步数据 今天开发提了一个测 ...
- 文件批量加密重命名--python脚本AND mysql命令行导入数据库
在考试中学生交上来的报告,需要进行一下文件名加密,这样阅卷老师就不知道是谁的报告了 在百度帮助下,完成了加密和解密脚本, 加密 #!/usr/bin/python # -*- coding: utf- ...
- GCC源码自动编译-python脚本
一.前言 目前因机器OS GCC版本太老,导致无法编译一些新版本软件,所以写了一个自动编译GCC的python脚本,操作系统是比较老的suse 10, 很多系统自动软件版本都很低,所以此脚本一般可适用 ...
- 【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法
引子 跟踪perl和python脚本对文件的访问,实际过程中,perl和python解析器在解析完脚本后,直接关闭了 脚本文件,在进程中查询不到是访问文件的脚本文件名称. shell.perl和pyt ...
- Ipython Notebook ipynb文件转化为Python脚本
欢迎关注博主主页,学习python视频资源 方法1. pycharm可以打开 方法2 https://jingyan.baidu.com/article/19192ad8edc736e53e57072 ...
- Zabbix之Python脚本端口自动发现
Zabbix监控服务端口,可以手动添加配置,但是如果一个服务器上需要监控的端口数较多,那么利用Zabbix自动发现,比较高效,下面是自动发现port的Python脚本. #!/usr/bin/pyth ...
随机推荐
- java中封装
.什么是封装? 封装就是将属性私有化,提供公有的方法访问私有属性. 做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(setter)方法,用于对这些属性 ...
- API网关
API网关 最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vag ...
- python 笔记总结
python 3.5 面向对象:类:具有同种属性的对象称为类,是个抽象的概念.比如说:汽车.人.狗.神:对象:日常生活中的所有东西都是对象,是类的实例化.比如说:推土车是汽车的实例化:姚明是人的实例 ...
- java NIO与IO的区别
nio是new io的简称,从jdk1.4就被引入了.现在的jdk已经到了1.6了,可以说不是什么新东西了.但其中的一些思想值得我来研究.这两天,我研究了下其中的套接字部分,有一些心得,在此分享. 首 ...
- Ajax ContentType 列表
".*"="application/octet-stream" ".001"="application/x-001" & ...
- 单例模式(.NET)
问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个 ...
- 【BZOJ】【1965】SHUFFLE 洗牌
扩展欧几里德+快速幂 每次转换位置:第x位的转移到2*x %(n+1)这个位置上 那么m次后就到了(2^m)*x %(n+1)这个位置上 那么找洗牌m次后在 l 位置上的牌就相当于解线性模方程: (2 ...
- Ubuntu的LTS版本
Ubuntu的LTS版本什么意思 LTS是长期支持(Long Term Support)的缩写. 我们每六个月制作一个新的Ubuntu桌面和服务器的版本,这意味着你总能拥有开源世界提供的最新最好的应用 ...
- 从String类看写C++ class需要注意的地方
#include <iostream> #include <string.h> using namespace std; class String { char* m_data ...
- 任务调度 QUARTZ
任务调度在目前的JAVA应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能 闲话少说,上官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包 commo ...