blob: 681ce0b88eaf7c4a4b002c9da976a333cdb80c0b [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 Rossumec758ea1991-06-04 20:36:54 +000010import commands
Guido van Rossumbff5bb31992-03-02 16:13:27 +000011import fnmatch
Guido van Rossumec758ea1991-06-04 20:36:54 +000012
Guido van Rossum97dddba1991-12-18 13:39:16 +000013EXECMAGIC = '\001\140\000\010'
14
Guido van Rossumec758ea1991-06-04 20:36:54 +000015MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.
16
17def getargs():
Tim Peters70c43782001-01-17 08:48:39 +000018 args = sys.argv[1:]
19 if args:
20 return args
21 print 'No arguments, checking almost *, in "ls -t" order'
22 list = []
23 for file in os.listdir(os.curdir):
24 if not skipfile(file):
25 list.append((getmtime(file), file))
26 list.sort()
27 if not list:
28 print 'Nothing to do -- exit 1'
29 sys.exit(1)
30 list.sort()
31 list.reverse()
32 for mtime, file in list: args.append(file)
33 return args
Guido van Rossumec758ea1991-06-04 20:36:54 +000034
Guido van Rossumbff5bb31992-03-02 16:13:27 +000035def getmtime(file):
Tim Peters70c43782001-01-17 08:48:39 +000036 try:
37 st = os.stat(file)
38 return st[ST_MTIME]
39 except os.error:
40 return -1
Guido van Rossumbff5bb31992-03-02 16:13:27 +000041
Guido van Rossum185d06e1991-06-04 20:44:11 +000042badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
Guido van Rossumec758ea1991-06-04 20:36:54 +000043badprefixes = ['.', ',', '@', '#', 'o.']
44badsuffixes = \
Tim Peters70c43782001-01-17 08:48:39 +000045 ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
46 '.pyc', '.fdc', '.rgb', '.elc', ',v']
Guido van Rossumceb86da1992-05-19 13:49:16 +000047ignore = []
Guido van Rossumbff5bb31992-03-02 16:13:27 +000048
49def setup():
Tim Peters70c43782001-01-17 08:48:39 +000050 ignore[:] = badnames
51 for p in badprefixes:
52 ignore.append(p + '*')
53 for p in badsuffixes:
54 ignore.append('*' + p)
55 try:
56 f = open('.xxcign', 'r')
57 except IOError:
58 return
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000059 ignore[:] = ignore + f.read().split()
Guido van Rossumec758ea1991-06-04 20:36:54 +000060
61def skipfile(file):
Tim Peters70c43782001-01-17 08:48:39 +000062 for p in ignore:
63 if fnmatch.fnmatch(file, p): return 1
64 try:
65 st = os.lstat(file)
66 except os.error:
67 return 1 # Doesn't exist -- skip it
68 # Skip non-plain files.
69 if not S_ISREG(st[ST_MODE]): return 1
70 # Skip huge files -- probably binaries.
71 if st[ST_SIZE] >= MAXSIZE: return 1
72 # Skip executables
73 try:
74 data = open(file, 'r').read(len(EXECMAGIC))
75 if data == EXECMAGIC: return 1
76 except:
77 pass
78 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000079
80def badprefix(file):
Tim Peters70c43782001-01-17 08:48:39 +000081 for bad in badprefixes:
82 if file[:len(bad)] == bad: return 1
83 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000084
85def badsuffix(file):
Tim Peters70c43782001-01-17 08:48:39 +000086 for bad in badsuffixes:
87 if file[-len(bad):] == bad: return 1
88 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000089
90def go(args):
Tim Peters70c43782001-01-17 08:48:39 +000091 for file in args:
92 print file + ':'
93 if differing(file):
94 showdiffs(file)
95 if askyesno('Check in ' + file + ' ? '):
96 sts = os.system('rcs -l ' + file) # ignored
97 sts = os.system('ci -l ' + file)
Guido van Rossumec758ea1991-06-04 20:36:54 +000098
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +000099def differing(file):
Tim Peters70c43782001-01-17 08:48:39 +0000100 cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file
101 sts = os.system(cmd)
102 return sts != 0
Guido van Rossume7b88e71992-03-30 11:13:59 +0000103
104def showdiffs(file):
Tim Peters70c43782001-01-17 08:48:39 +0000105 cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}'
106 sts = os.system(cmd)
Guido van Rossumec758ea1991-06-04 20:36:54 +0000107
108def askyesno(prompt):
Tim Peters70c43782001-01-17 08:48:39 +0000109 s = raw_input(prompt)
110 return s in ['y', 'yes']
Guido van Rossumec758ea1991-06-04 20:36:54 +0000111
Guido van Rossumd3592481992-12-09 23:12:59 +0000112try:
Tim Peters70c43782001-01-17 08:48:39 +0000113 setup()
114 go(getargs())
Guido van Rossumd3592481992-12-09 23:12:59 +0000115except KeyboardInterrupt:
Tim Peters70c43782001-01-17 08:48:39 +0000116 print '[Intr]'