blob: ebb044d9096ac3407e3304c2e51d15c4470b22c9 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
3# xxci
4#
5# check in files for which rcsdiff returns nonzero exit status
6
7import sys
Guido van Rossume7b88e71992-03-30 11:13:59 +00008import os
Guido van Rossumbff5bb31992-03-02 16:13:27 +00009from stat import *
Guido van Rossumbff5bb31992-03-02 16:13:27 +000010import fnmatch
Guido van Rossumec758ea1991-06-04 20:36:54 +000011
Guido van Rossum97dddba1991-12-18 13:39:16 +000012EXECMAGIC = '\001\140\000\010'
13
Guido van Rossumec758ea1991-06-04 20:36:54 +000014MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.
15
16def getargs():
Tim Peters70c43782001-01-17 08:48:39 +000017 args = sys.argv[1:]
18 if args:
19 return args
20 print 'No arguments, checking almost *, in "ls -t" order'
21 list = []
22 for file in os.listdir(os.curdir):
23 if not skipfile(file):
24 list.append((getmtime(file), file))
25 list.sort()
26 if not list:
27 print 'Nothing to do -- exit 1'
28 sys.exit(1)
29 list.sort()
30 list.reverse()
31 for mtime, file in list: args.append(file)
32 return args
Guido van Rossumec758ea1991-06-04 20:36:54 +000033
Guido van Rossumbff5bb31992-03-02 16:13:27 +000034def getmtime(file):
Tim Peters70c43782001-01-17 08:48:39 +000035 try:
36 st = os.stat(file)
37 return st[ST_MTIME]
38 except os.error:
39 return -1
Guido van Rossumbff5bb31992-03-02 16:13:27 +000040
Guido van Rossum185d06e1991-06-04 20:44:11 +000041badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
Guido van Rossumec758ea1991-06-04 20:36:54 +000042badprefixes = ['.', ',', '@', '#', 'o.']
43badsuffixes = \
Tim Peters70c43782001-01-17 08:48:39 +000044 ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
45 '.pyc', '.fdc', '.rgb', '.elc', ',v']
Guido van Rossumceb86da1992-05-19 13:49:16 +000046ignore = []
Guido van Rossumbff5bb31992-03-02 16:13:27 +000047
48def setup():
Tim Peters70c43782001-01-17 08:48:39 +000049 ignore[:] = badnames
50 for p in badprefixes:
51 ignore.append(p + '*')
52 for p in badsuffixes:
53 ignore.append('*' + p)
54 try:
55 f = open('.xxcign', 'r')
56 except IOError:
57 return
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000058 ignore[:] = ignore + f.read().split()
Guido van Rossumec758ea1991-06-04 20:36:54 +000059
60def skipfile(file):
Tim Peters70c43782001-01-17 08:48:39 +000061 for p in ignore:
62 if fnmatch.fnmatch(file, p): return 1
63 try:
64 st = os.lstat(file)
65 except os.error:
66 return 1 # Doesn't exist -- skip it
67 # Skip non-plain files.
68 if not S_ISREG(st[ST_MODE]): return 1
69 # Skip huge files -- probably binaries.
70 if st[ST_SIZE] >= MAXSIZE: return 1
71 # Skip executables
72 try:
73 data = open(file, 'r').read(len(EXECMAGIC))
74 if data == EXECMAGIC: return 1
75 except:
76 pass
77 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000078
79def badprefix(file):
Tim Peters70c43782001-01-17 08:48:39 +000080 for bad in badprefixes:
81 if file[:len(bad)] == bad: return 1
82 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000083
84def badsuffix(file):
Tim Peters70c43782001-01-17 08:48:39 +000085 for bad in badsuffixes:
86 if file[-len(bad):] == bad: return 1
87 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000088
89def go(args):
Tim Peters70c43782001-01-17 08:48:39 +000090 for file in args:
91 print file + ':'
92 if differing(file):
93 showdiffs(file)
94 if askyesno('Check in ' + file + ' ? '):
95 sts = os.system('rcs -l ' + file) # ignored
96 sts = os.system('ci -l ' + file)
Guido van Rossumec758ea1991-06-04 20:36:54 +000097
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +000098def differing(file):
Tim Peters70c43782001-01-17 08:48:39 +000099 cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file
100 sts = os.system(cmd)
101 return sts != 0
Guido van Rossume7b88e71992-03-30 11:13:59 +0000102
103def showdiffs(file):
Tim Peters70c43782001-01-17 08:48:39 +0000104 cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}'
105 sts = os.system(cmd)
Guido van Rossumec758ea1991-06-04 20:36:54 +0000106
107def askyesno(prompt):
Tim Peters70c43782001-01-17 08:48:39 +0000108 s = raw_input(prompt)
109 return s in ['y', 'yes']
Guido van Rossumec758ea1991-06-04 20:36:54 +0000110
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +0000111if __name__ == '__main__':
112 try:
113 setup()
114 go(getargs())
115 except KeyboardInterrupt:
116 print '[Intr]'