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

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

import sys
import os
from stat import *
import commands
import fnmatch
import string

EXECMAGIC = '\001\140\000\010'

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 *, in "ls -t" order'
	list = []
	for file in os.listdir(os.curdir):
		if not skipfile(file):
			list.append((getmtime(file), file))
	list.sort()
	if not list:
		print 'Nothing to do -- exit 1'
		sys.exit(1)
	list.sort()
	list.reverse()
	for mtime, file in list: args.append(file)
	return args

def getmtime(file):
	try:
		st = os.stat(file)
		return st[ST_MTIME]
	except os.error:
		return -1

badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
badprefixes = ['.', ',', '@', '#', 'o.']
badsuffixes = \
	['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
	 '.pyc', '.fdc', '.rgb', '.elc']
ignore = []

def setup():
	ignore[:] = badnames
	for p in badprefixes:
		ignore.append(p + '*')
	for p in badsuffixes:
		ignore.append('*' + p)
	try:
		f = open('.xxcign', 'r')
	except IOError:
		return
	ignore[:] = ignore + string.split(f.read())

def skipfile(file):
	for p in ignore:
		if fnmatch.fnmatch(file, p): return 1
	try:
		st = os.lstat(file)
	except os.error:
		return 1 # Doesn't exist -- skip it
	# Skip non-plain files.
	if not S_ISREG(st[ST_MODE]): return 1
	# Skip huge files -- probably binaries.
	if st[ST_SIZE] >= MAXSIZE: return 1
	# Skip executables
	try:
		data = open(file, 'r').read(len(EXECMAGIC))
		if data == EXECMAGIC: return 1
	except:
		pass
	return 0

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):
			showdiffs(file)
			if askyesno('Check in ' + file + ' ? '):
				sts = os.system('rcs -l ' + file) # ignored
				sts = os.system('ci -l ' + file)

def differing(file):
	cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file
	sts = os.system(cmd)
	return sts != 0

def showdiffs(file):
	cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}'
	sts = os.system(cmd)

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

setup()
go(getargs())
