#! /ufs/guido/bin/sgi/python
#! /usr/local/python

# xxci
#
# check in files for which rcsdiff returns nonzero exit status

import sys
import posix
import stat
import path
import commands

MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.

def getargs():
	args = sys.argv[1:]
	if args:
		return args
	print 'No arguments, checking almost *'
	for file in posix.listdir('.'):
		if not skipfile(file):
			args.append(file)
	if not args:
		print 'Nothing to do -- exit 1'
		sys.exit(1)
	args.sort()
	return args

badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
badprefixes = ['.', ',', '@', '#', 'o.']
badsuffixes = \
	['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not']
# XXX Should generalize even more to use fnmatch!

def skipfile(file):
	if file in badnames or \
		badprefix(file) or badsuffix(file) or \
		path.islink(file) or path.isdir(file):
		return 1
	# Skip huge files -- probably binaries.
	try:
		st = posix.stat(file)
	except posix.error:
		return 1 # Doesn't exist -- skip it
	return st[stat.ST_SIZE] >= MAXSIZE

def badprefix(file):
	for bad in badprefixes:
		if file[:len(bad)] = bad: return 1
	return 0

def badsuffix(file):
	for bad in badsuffixes:
		if file[-len(bad):] = bad: return 1
	return 0

def go(args):
	for file in args:
		print file + ':'
		if differing(file):
			sts = posix.system('rcsdiff ' + file) # ignored
			if askyesno('Check in ' + file + ' ? '):
				sts = posix.system('rcs -l ' + file) # ignored
				sts = posix.system('ci -l ' + file)

def differing(file):
	try:
		this = open(file, 'r').read()
		that = posix.popen('co -p '+file+' 2>/dev/null', 'r').read()
		return this <> that
	except:
		return 1

def askyesno(prompt):
	s = raw_input(prompt)
	return s in ['y', 'yes']

go(getargs())
