蓝天,小湖,湖水中一方小筑

List all CVS tags

最近在折腾一个CVS的库,需要把它里面所有的tags给列出来,在网上找了一个Perl脚本,以前一直是直接用的,那天看了看发现原来不是很难,于是写了一个Python的,为的是可以当成函数嵌到我的脚本中。

脚本的原理就是检查一个working directory中所有文件的status,然后把输出的内容去重。脚本运行需要设置好CVSROOT环境变量,而且需要提供一个CVS的工作目录作为参数。

#!/usr/bin/python

import re
import os
import sys
import subprocess as sp

def get_all_tags(cvs_wdir):
    is_tag_line = False
    cvs_cmd = 'cvs -Q status -R -v'
    cvs_tag_pattern = re.compile(r'(\w+)\s+')
    tmp_tags = []

    os.chdir(cvs_wdir)
    cmd_pipe = sp.Popen(cvs_cmd, shell=True, stdout=sp.PIPE)

    for line in cmd_pipe.stdout.readlines():
        if 'Existing Tags' in line:
            is_tag_line = True
            continue

        if not is_tag_line:
            continue

        if '============' in line and is_tag_line == True:
            is_tag_line = 0
            continue

        line = line.strip()
        if line != '':
            try:
                tag = cvs_tag_pattern.findall(line.strip())[0]
            except IndexError:
                print line
                raise
            tmp_tags.append(tag)

    return set(tmp_tags)

if __name__ == '__main__':
    print '\n'.join(sorted(get_all_tags(sys.argv[1])))

话说,有人能提供更好的办法吗?然后,有人可以告诉我,这个东西取出来的东西是全部的tag吗?没用过CVS……