blob: 8cffc9e11b8ced09d80347afd27e0bfc7bdd87ac [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
Collin Winter6afaeb72007-08-03 17:06:41 +000020 print('No arguments, checking almost *, in "ls -t" order')
Tim Peters70c43782001-01-17 08:48:39 +000021 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:
Collin Winter6afaeb72007-08-03 17:06:41 +000027 print('Nothing to do -- exit 1')
Tim Peters70c43782001-01-17 08:48:39 +000028 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:
Collin Winter6afaeb72007-08-03 17:06:41 +000091 print(file + ':')
Tim Peters70c43782001-01-17 08:48:39 +000092 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
Neal Norwitzce96f692006-03-17 06:49:51 +0000107def raw_input(prompt):
108 sys.stdout.write(prompt)
109 sys.stdout.flush()
110 return sys.stdin.readline()
111
Guido van Rossumec758ea1991-06-04 20:36:54 +0000112def askyesno(prompt):
Georg Brandl8efadf52008-05-16 15:23:30 +0000113 s = input(prompt)
Tim Peters70c43782001-01-17 08:48:39 +0000114 return s in ['y', 'yes']
Guido van Rossumec758ea1991-06-04 20:36:54 +0000115
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +0000116if __name__ == '__main__':
117 try:
118 setup()
119 go(getargs())
120 except KeyboardInterrupt:
Collin Winter6afaeb72007-08-03 17:06:41 +0000121 print('[Intr]')