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 上的命令是:
  1. cvs rtag -r 1.1.2.2.14.2 -F FAS_2_3- Betty/jsp/invoiceListingInc.jsp
  • 把 tag 移动指定分支 BR230_201411191736 上的最新版的命令是:
  1. cvs rtag -r BR230_201411191736 -F FAS_2_3-124 Betty/jsp/invoiceListingInc.jsp

脚本

弄清楚了 CVS 的移 tag 命令,就可以开始写脚本了,脚本要做的工作就是处理一个文件列表,然后生成 CVS 命令并执行。Python 脚本如下:

  1. # -- coding: utf-8 -- import sys
  2. import os
  3. import re
  4. # 使用sys.stdin.readline()方法读入用户输入的一行
  5.  
  6. #分析可用的分支def showBranch(fileName, maps):
  7. file = open(fileName)
  8. index = 1
  9. while 1:
  10. line = file.readline()
  11. if not line:
  12. break
  13. print " %d : %s "%(index, line[:-1])
  14. maps[index] = line[:-1]
  15. index += 1#分析文件列表def showFile(fileName, maps, namelist, branch):
  16. file = open(fileName)
  17. while 1:
  18. line = file.readline()
  19. if not line:
  20. break
  21. text = line[:-1]
  22. text = text.replace('Betty/', '').replace('\t', '')
  23. text = re.sub('\s+', ' ', text)
  24. if len(text) > 1 :
  25. names = text.split(' ')
  26. fileName = 'Betty/' + names[0]
  27. namelist.append(fileName)
  28. if len(names) > 1 and len(names[1]) > 1 :
  29. maps[fileName] = names[1]
  30. else:
  31. maps[fileName] = branch
  32.  
  33. def arsk(title):
  34. if title:
  35. print title
  36. line = sys.stdin.readline()
  37. return line[:-1]
  38.  
  39. branchs = {}
  40. branch = ''print 'Select Branch:'
  41. showBranch("branchs.txt", branchs)
  42. branchNum = int(arsk(''))
  43. branch = branchs[branchNum]
  44.  
  45. print 'Input The Tag:'
  46. line = sys.stdin.readline()
  47. tag = line[:-1]
  48.  
  49. versions = {}
  50. names = []
  51. showFile("files.txt", versions, names, branch)
  52. for key in names:
  53. print '%s;\tversion:%s;' %(key, versions[key])
  54. print 'App will move these %d files to Tag : %s on Branch %s : ' % (len(names), tag, branch)
  55. yes = arsk('Are you sure to do that ? y/n')
  56. while 'y' not in yes and 'n' not in yes:
  57. yes = arsk('Are you sure to do that ? y/n')
  58.  
  59. if 'y' in yes:
  60. target = open('command.txt', 'w') #打开文件
  61. target.truncate() #清空文件
  62. for key in names:
  63. cmd = 'cvs rtag -r %s -F %s %s' % (versions[key], tag, key)
  64. target.write(cmd) #写入文件
  65. target.write('\n')
  66. print cmd
  67. os.system(cmd)
  68. target.close()

脚本读取当前目录下的 file.txt 文件里的文件列表,使用 branchs.txt 文件来存储分支信息。如果需要移 tag 至指定版本号,则需要在 file.txt 里的文件名之后输入版本号。
在 CMD 输入输入

  1. python movetag.py

来执行脚本。执行效果图如下:

最后输入 Y 确认移 tag 即可。

注意:移 tag 有风险,操作需谨慎。
另: 此脚本默认所在的运行环境是可以直接执行 cvs 命令的。 如果你对这个脚本不放心,可以注释掉自动执行 CVS 命令的那行脚本(倒数第二行):

  1. #os.system(cmd)

这样就不会执行 CVS 的移 tag 命令了,而且脚本会在当前目录生成一个 command.txt 文件。里面就是处理好的 CVS 命令,你可以酌情自行执行。

完整的文件: 点击下载

CVS 文件自动移 tag 的 Python 脚本的更多相关文章

  1. 【Python脚本】Python创建删除文件-----------我的第一个Python脚本

    Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...

  2. vim—自动缩进(编写Python脚本)

    大神推荐使用vim编写Python脚本,学而时积之,不亦乐乎! 使用vim编写Python脚本的时候不能正常缩进,需要修改vimrc文件 Ubuntu系统下vimrc文件的位置: $ cd /etc/ ...

  3. Python核心笔记:在python文件中如何调用其它python脚本文件,你肯定不会

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:zhujuyu 笔者在自学python的时候遇到了这样一个练习题:将 ...

  4. 使用rdb文件进行redis数据迁移--python脚本

    查找了一些redis迁移的方法,一般做法就是 1. 从源数据库把rdb文件保存,然后传到新的主机上,启动新的redis即可 2. 把新的redis当做源数据库的slave,同步数据 今天开发提了一个测 ...

  5. 文件批量加密重命名--python脚本AND mysql命令行导入数据库

    在考试中学生交上来的报告,需要进行一下文件名加密,这样阅卷老师就不知道是谁的报告了 在百度帮助下,完成了加密和解密脚本, 加密 #!/usr/bin/python # -*- coding: utf- ...

  6. GCC源码自动编译-python脚本

    一.前言 目前因机器OS GCC版本太老,导致无法编译一些新版本软件,所以写了一个自动编译GCC的python脚本,操作系统是比较老的suse 10, 很多系统自动软件版本都很低,所以此脚本一般可适用 ...

  7. 【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法

    引子 跟踪perl和python脚本对文件的访问,实际过程中,perl和python解析器在解析完脚本后,直接关闭了 脚本文件,在进程中查询不到是访问文件的脚本文件名称. shell.perl和pyt ...

  8. Ipython Notebook ipynb文件转化为Python脚本

    欢迎关注博主主页,学习python视频资源 方法1. pycharm可以打开 方法2 https://jingyan.baidu.com/article/19192ad8edc736e53e57072 ...

  9. Zabbix之Python脚本端口自动发现

    Zabbix监控服务端口,可以手动添加配置,但是如果一个服务器上需要监控的端口数较多,那么利用Zabbix自动发现,比较高效,下面是自动发现port的Python脚本. #!/usr/bin/pyth ...

随机推荐

  1. synchronized关键字使用剖析

    synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C. D等)正在用这个方法,有的话要等正在使用synchroniz ...

  2. 一致性hash应用到redis

    理解分布式存储的本质 有一个经典的实践经验: 数(值)据大了, 什么都是问题! 如果要求128B或更大数值计算, 哪么四则运算会是个大问题! 如果要求128T或更大日志存储, 哪么文件存储会是个大问题 ...

  3. 保持iOS上键盘出现时输入框不被覆盖

    如果屏幕中的内容项目比较多,键盘就可能覆盖住文本输入框之类的对象.你必须调整你的内容,使得输入框保持可见. 你会想到哪些处理方法呢? 第一种, 临时调整窗口中各个视图的大小,使得键盘从下向上占领的区域 ...

  4. ubuntu: 环境搭建

    1.修改更新源    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak    sudo gedit /etc/apt/sources.li ...

  5. 清除SQL Server执行计划

    有时需要调试SQL语句的性能, 需要不断的执行SQL语句, 可是多次执行同一条语句的时候,SQL Server 会缓存表的数据,结果就测不出来 实际的 SQL 的性能 用以下SQL可以清除缓存数据 D ...

  6. c#之委托和事件的区别

    1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...

  7. Xcode8兼容iOS7手记-b

    对于Xcode8的发布,苹果也是来了个大的跳跃,默认最低支持的iOS版本为8.0,当然也并不是说8.0以下就直接放弃了,虽然表现出来的是这样,毕竟使用8.0以下系统的还是大有人在的,老项目要兼容iOS ...

  8. 贱贱的美团安卓客户端---如何实现让安卓app在应用列表获得较靠前的位置

    起因: 自打愚安我开始使用android设备以来,一直觉得google还算厚道,应用列表里的顺序一直都是依据APP的名称,按照先中文(拼音字母表顺序),后英文(字母表顺序)的原则进行排序的,并没有说G ...

  9. C#系统缓存全解析

    原文:http://blog.csdn.net/wyxhd2008/article/details/8076105 目录(?)[-] 系统缓存的概述 页面输出缓存 页面局部缓存 文件缓存依赖 数据库缓 ...

  10. 备份apt目录节省下载时间

    备份与清理      * 备份快速设置已下载的部分软件包,以便重装系统再次使用,免去重新下载的时间   tar cizvf backup.tar.gz /var/cache/apt/archives ...