CVSNT: от тега к списку имен файлов и ревизий - PullRequest
1 голос
/ 03 марта 2011

У меня есть проект с источниками под контролем 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 всю нужную мне информацию, а затем могу отфильтровать ее для составления списка, но есть ли какая-нибудь утилита, которая уже делает то, что мне нужно?

1 Ответ

1 голос
/ 04 марта 2011

Вот скрипт 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, либо запустить ее из рабочей копии, извлеченной из репозитория, который вы хотитеquery.

Кроме того, отображаемые имена файлов основаны на свойстве «RCS File» вывода rlog, то есть они по-прежнему содержат префикс репозитория.Если вы хотите отфильтровать это, вы можете указать третий аргумент, например, когда ваш CVSROOT похож на sspi:server:/cvsrepo, тогда вы бы назвали это следующим образом:

ListCvsTagRevisions.py MyTag MyModule /cvsrepo/

Надеюсь, это поможет.


Примечание: Если вам нужен скрипт, который перечисляет ревизии, которые в настоящее время находятся в вашей рабочей копии, см. Историю изменений этого ответа.

...