2011-03-03 45 views
1

我有一个CVSNT控制下的源代码项目。CVSNT:从标签到文件名和修订版列表

我需要一个属于某个标签的源文件名和修订版的列表。 例如:

the tag MYTAG is: 
myproject/main.cpp 1.5.2.3 
myproject/myclass.h 1.5.2.1 

我知道,与cvs log -rMYTAG > log.txtlog.txt所有我需要的信息获取,然后我可以过滤它来建立我的名单,但是,是有它已经做什么,我需要什么工具?

回答

1

下面是一个Python脚本,做这样的:

import sys, os, os.path 
import re, string 

def runCvs(args): 
    f_in, f_out, f_err = os.popen3('cvs '+string.join(args)) 
    out = f_out.read() 
    err = f_err.read() 
    f_out.close() 
    f_err.close() 
    code = f_in.close() 
    if not code: code = 0 
    return code, out, err 

class RevDumper: 
    def parseFile(self, rex, filelog): 
    m = rex.search(filelog) 
    if m: 
     print '%s\t%s' % (m.group(1), m.group(2)) 

    def filterOutput(self, logoutput, repoprefix): 
    rex = re.compile('^={77}$', re.MULTILINE) 
    files = rex.split(logoutput) 
    rex = re.compile('RCS file: %s(.*),v[^=]+selected revisions: [^0][^=]+revision ([0-9\.]+)' % repoprefix, re.MULTILINE) 
    for file in files: 
     self.parseFile(rex, file) 

    def getInfo(self, tag, module, repoprefix): 
    args = ['-Q', '-z9', 'rlog', '-S', '-N', '-r'+tag, module] # remove the -S if you're using an older version of CVS 
    code, out, err = runCvs(args) 
    if code == 0: 
     self.filterOutput(out, repoprefix) 
    else: 
     sys.stderr.write('CVS returned %d\n%s\n' % (code, err)) 

if len(sys.argv) > 2: 
    tag = sys.argv[1] 
    module = sys.argv[2] 
    if len(sys.argv) > 3: 
    repoprefix = sys.argv[3] 
    else: 
    repoprefix = '' 
    RevDumper().getInfo(tag, module, repoprefix) 
else: 
    sys.stderr.write('Syntax: %s TAG MODULE [REPOPREFIX]' % os.path.basename(sys.argv[0])) 

注意,你要么必须有一个CVSROOT环境变量设置或工作副本中运行这些从您要查询的库中检出了。

此外,显示的文件名基于rlog输出的“RCS File”属性,即它们仍包含存储库前缀。如果你想过滤掉,你可以指定第三个参数,例如当你CVSROOT是一样的东西sspi:server:/cvsrepo那么你会调用这个样:

ListCvsTagRevisions.py MyTag MyModule /cvsrepo/ 

希望这有助于。


注:如果你需要一个脚本,目前列出你的工作拷贝的修订,看到这个答案的编辑历史。

+0

它需要Python 3吗? – 2011-03-04 17:09:34

+0

@uvts_cvs:不,这应该适用于至少2.5以上的任何东西。我自己仍然使用Python 2.6.5,所以我不确定它是否适用于3.请注意,'cvs rlog'命令上的'-S'选项需要一个相当新的版本的CVS(NT) 。但是,您可以安全地将其从代码中移除:在这种情况下,对服务器的查询只需要更多的带宽。 – 2011-03-04 17:27:57