Added -b tag option to limit output to a specific branch only.

Use -b HEAD to limit output to the trunk (skip all branch revisions).
This commit is contained in:
Guido van Rossum 2002-09-29 04:37:36 +00:00
parent f2324b9e89
commit bc01c3248d
1 changed files with 43 additions and 5 deletions

View File

@ -19,12 +19,21 @@ entry; this is useful when using something like the above cvs log
command, which shows the revisions including the given tag, while you command, which shows the revisions including the given tag, while you
probably want everything *since* that tag. probably want everything *since* that tag.
The -r option reverses the output (oldest first; the default is oldest
last).
The -b tag option restricts the output to *only* checkin messages
belonging to the given branch tag. The form -b HEAD restricts the
output to checkin messages belonging to the CVS head (trunk). (It
produces some output if tag is a non-branch tag, but this output is
not very useful.)
XXX This code was created by reverse engineering CVS 1.9 and RCS 5.7 XXX This code was created by reverse engineering CVS 1.9 and RCS 5.7
from their output. from their output.
""" """
import os, sys, getopt, re import os, sys, getopt
sep1 = '='*77 + '\n' # file separator sep1 = '='*77 + '\n' # file separator
sep2 = '-'*28 + '\n' # revision separator sep2 = '-'*28 + '\n' # revision separator
@ -33,18 +42,21 @@ def main():
"""Main program""" """Main program"""
truncate_last = 0 truncate_last = 0
reverse = 0 reverse = 0
opts, args = getopt.getopt(sys.argv[1:], "tr") branch = None
opts, args = getopt.getopt(sys.argv[1:], "trb:")
for o, a in opts: for o, a in opts:
if o == '-t': if o == '-t':
truncate_last = 1 truncate_last = 1
elif o == '-r': elif o == '-r':
reverse = 1 reverse = 1
elif o == '-b':
branch = a
database = [] database = []
while 1: while 1:
chunk = read_chunk(sys.stdin) chunk = read_chunk(sys.stdin)
if not chunk: if not chunk:
break break
records = digest_chunk(chunk) records = digest_chunk(chunk, branch)
if truncate_last: if truncate_last:
del records[-1] del records[-1]
database[len(database):] = records database[len(database):] = records
@ -77,8 +89,8 @@ def read_chunk(fp):
lines.append(line) lines.append(line)
return chunk return chunk
def digest_chunk(chunk): def digest_chunk(chunk, branch=None):
"""Digest a chunk -- extrach working file name and revisions""" """Digest a chunk -- extract working file name and revisions"""
lines = chunk[0] lines = chunk[0]
key = 'Working file:' key = 'Working file:'
keylen = len(key) keylen = len(key)
@ -88,6 +100,26 @@ def digest_chunk(chunk):
break break
else: else:
working_file = None working_file = None
if branch and branch != "HEAD":
revisions = {}
key = 'symbolic names:\n'
found = 0
for line in lines:
if line == key:
found = 1
elif found:
if line[0] in '\t ':
tag, rev = line.split()
if tag[-1] == ':':
tag = tag[:-1]
revisions[tag] = rev
else:
found = 0
rev = revisions.get(branch)
if rev:
if rev.find('.0.') >= 0:
rev = rev.replace('.0.', '.') + '.'
branch = rev or "<>" # <> to force a mismatch
records = [] records = []
for lines in chunk[1:]: for lines in chunk[1:]:
revline = lines[0] revline = lines[0]
@ -114,6 +146,12 @@ def digest_chunk(chunk):
else: else:
rev = None rev = None
text.insert(0, revline) text.insert(0, revline)
if branch:
if branch == "HEAD":
if rev is not None and rev.count('.') > 1:
continue
elif rev is None or not rev.startswith(branch):
continue
records.append((date, working_file, rev, author, text)) records.append((date, working_file, rev, author, text))
return records return records