blob: aef3234e802b0b62c77aa83bf95e47409b4d97c2 [file] [log] [blame]
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +00001#! /ufs/guido/bin/sgi/python
Guido van Rossumec758ea1991-06-04 20:36:54 +00002#! /usr/local/python
3
4# xxci
5#
6# check in files for which rcsdiff returns nonzero exit status
7
8import sys
Guido van Rossume7b88e71992-03-30 11:13:59 +00009import os
Guido van Rossumbff5bb31992-03-02 16:13:27 +000010from stat import *
Guido van Rossumec758ea1991-06-04 20:36:54 +000011import commands
Guido van Rossumbff5bb31992-03-02 16:13:27 +000012import fnmatch
13import string
Guido van Rossumec758ea1991-06-04 20:36:54 +000014
Guido van Rossum97dddba1991-12-18 13:39:16 +000015EXECMAGIC = '\001\140\000\010'
16
Guido van Rossumec758ea1991-06-04 20:36:54 +000017MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.
18
19def getargs():
20 args = sys.argv[1:]
21 if args:
22 return args
Guido van Rossumbff5bb31992-03-02 16:13:27 +000023 print 'No arguments, checking almost *, in "ls -t" order'
24 list = []
Guido van Rossume7b88e71992-03-30 11:13:59 +000025 for file in os.listdir(os.curdir):
Guido van Rossumec758ea1991-06-04 20:36:54 +000026 if not skipfile(file):
Guido van Rossumbff5bb31992-03-02 16:13:27 +000027 list.append((getmtime(file), file))
28 list.sort()
29 if not list:
Guido van Rossumec758ea1991-06-04 20:36:54 +000030 print 'Nothing to do -- exit 1'
31 sys.exit(1)
Guido van Rossumbff5bb31992-03-02 16:13:27 +000032 list.sort()
33 list.reverse()
34 for mtime, file in list: args.append(file)
Guido van Rossumec758ea1991-06-04 20:36:54 +000035 return args
36
Guido van Rossumbff5bb31992-03-02 16:13:27 +000037def getmtime(file):
38 try:
Guido van Rossume7b88e71992-03-30 11:13:59 +000039 st = os.stat(file)
Guido van Rossumbff5bb31992-03-02 16:13:27 +000040 return st[ST_MTIME]
Guido van Rossume7b88e71992-03-30 11:13:59 +000041 except os.error:
Guido van Rossumbff5bb31992-03-02 16:13:27 +000042 return -1
43
Guido van Rossum185d06e1991-06-04 20:44:11 +000044badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
Guido van Rossumec758ea1991-06-04 20:36:54 +000045badprefixes = ['.', ',', '@', '#', 'o.']
46badsuffixes = \
Guido van Rossum97dddba1991-12-18 13:39:16 +000047 ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
48 '.pyc', '.elc']
Guido van Rossumbff5bb31992-03-02 16:13:27 +000049
50def setup():
51 global ignore
52 ignore = badnames[:]
53 for p in badprefixes:
54 ignore.append(p + '*')
55 for p in badsuffixes:
56 ignore.append('*' + p)
57 try:
58 f = open('.xxcign', 'r')
59 except IOError:
60 return
61 ignore = ignore + string.split(f.read())
Guido van Rossumec758ea1991-06-04 20:36:54 +000062
63def skipfile(file):
Guido van Rossumbff5bb31992-03-02 16:13:27 +000064 for p in ignore:
65 if fnmatch.fnmatch(file, p): return 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000066 try:
Guido van Rossume7b88e71992-03-30 11:13:59 +000067 st = os.lstat(file)
68 except os.error:
Guido van Rossumec758ea1991-06-04 20:36:54 +000069 return 1 # Doesn't exist -- skip it
Guido van Rossumbff5bb31992-03-02 16:13:27 +000070 # Skip non-plain files.
71 if not S_ISREG(st[ST_MODE]): return 1
72 # Skip huge files -- probably binaries.
73 if st[ST_SIZE] >= MAXSIZE: return 1
Guido van Rossum97dddba1991-12-18 13:39:16 +000074 # Skip executables
75 try:
76 data = open(file, 'r').read(len(EXECMAGIC))
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000077 if data == EXECMAGIC: return 1
Guido van Rossum97dddba1991-12-18 13:39:16 +000078 except:
79 pass
80 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000081
82def badprefix(file):
83 for bad in badprefixes:
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000084 if file[:len(bad)] == bad: return 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000085 return 0
86
87def badsuffix(file):
88 for bad in badsuffixes:
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000089 if file[-len(bad):] == bad: return 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000090 return 0
91
92def go(args):
93 for file in args:
94 print file + ':'
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +000095 if differing(file):
Guido van Rossume7b88e71992-03-30 11:13:59 +000096 showdiffs(file)
Guido van Rossumec758ea1991-06-04 20:36:54 +000097 if askyesno('Check in ' + file + ' ? '):
Guido van Rossume7b88e71992-03-30 11:13:59 +000098 sts = os.system('rcs -l ' + file) # ignored
99 sts = os.system('ci -l ' + file)
Guido van Rossumec758ea1991-06-04 20:36:54 +0000100
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +0000101def differing(file):
Guido van Rossume7b88e71992-03-30 11:13:59 +0000102 cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file
103 sts = os.system(cmd)
104 return sts != 0
105
106def showdiffs(file):
107 cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}'
108 sts = os.system(cmd)
Guido van Rossumec758ea1991-06-04 20:36:54 +0000109
110def askyesno(prompt):
111 s = raw_input(prompt)
112 return s in ['y', 'yes']
113
Guido van Rossumbff5bb31992-03-02 16:13:27 +0000114setup()
Guido van Rossumec758ea1991-06-04 20:36:54 +0000115go(getargs())