【问题标题】:CVSNT: from a tag to a list of file names and revisionsCVSNT:从标签到文件名和修订列表
【发布时间】:2011-03-03 14:33:05
【问题描述】:

我有一个项目,其源代码受 CVSNT 控制。

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

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

我知道通过cvs log -rMYTAG > log.txt 我可以在log.txt 中获取我需要的所有信息,然后我可以对其进行过滤以构建我的列表,但是,是否有任何实用程序已经可以满足我的需要?

【问题讨论】:

    标签: windows cvs cvsnt


    【解决方案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 文件”属性,即它们仍然包含存储库前缀。如果您想过滤掉它,您可以指定第三个参数,例如当您的 CVSROOT 类似于 sspi:server:/cvsrepo 时,您可以这样称呼:

    ListCvsTagRevisions.py MyTag MyModule /cvsrepo/
    

    希望这会有所帮助。


    注意:如果您需要列出当前工作副本中的修订的脚本,请参阅此答案的编辑历史记录。

    【讨论】:

    • @uvts_cvs:不,这应该适用于至少 2.5 以上的任何内容。我自己仍在使用 Python 2.6.5,所以我实际上不确定它是否可以与 3 一起使用。请注意,cvs rlog 命令上的-S-选项需要相当新的 CVS(NT) 版本。但是,您可以安全地从代码中删除它:在这种情况下,对服务器的查询只需要多一点带宽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多