#! /usr/bin/env python

"""Print a list of files that are mentioned in CVS directories.

Usage: cvsfiles.py [-n file] [directory] ...

If the '-n file' option is given, only files under CVS that are newer
than the given file are printed; by default, all files under CVS are
printed.  As a special case, if a file does not exist, it is always
printed.
"""

import os
import sys
import stat
import getopt
import string

cutofftime = 0

def main():
    try:
	opts, args = getopt.getopt(sys.argv[1:], "n:")
    except getopt.error, msg:
	print msg
	print __doc__,
	return 1
    global cutofftime
    newerfile = None
    for o, a in opts:
	if o == '-n':
	    cutofftime = getmtime(a)
    if args:
	for arg in args:
	    process(arg)
    else:
	process(".")

def process(dir):
    cvsdir = 0
    subdirs = []
    names = os.listdir(dir)
    for name in names:
	fullname = os.path.join(dir, name)
	if name == "CVS":
	    cvsdir = fullname
	else:
	    if os.path.isdir(fullname):
		if not os.path.islink(fullname):
		    subdirs.append(fullname)
    if cvsdir:
	entries = os.path.join(cvsdir, "Entries")
	for e in open(entries).readlines():
	    words = string.split(e, '/')
	    if words[0] == '' and words[1:]:
		name = words[1]
		fullname = os.path.join(dir, name)
		if cutofftime and getmtime(fullname) <= cutofftime:
		    pass
		else:
		    print fullname
    for sub in subdirs:
	process(sub)

def getmtime(filename):
    try:
	st = os.stat(filename)
    except os.error:
	return 0
    return st[stat.ST_MTIME]

sys.exit(main())
