blob: 2cb1eadcc0a0cbd2c166ba01034d573d085e916d [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
9import posix
Guido van Rossumbff5bb31992-03-02 16:13:27 +000010from stat import *
Guido van Rossumec758ea1991-06-04 20:36:54 +000011import path
12import commands
Guido van Rossumbff5bb31992-03-02 16:13:27 +000013import fnmatch
14import string
Guido van Rossumec758ea1991-06-04 20:36:54 +000015
Guido van Rossum97dddba1991-12-18 13:39:16 +000016EXECMAGIC = '\001\140\000\010'
17
Guido van Rossumec758ea1991-06-04 20:36:54 +000018MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.
19
20def getargs():
21 args = sys.argv[1:]
22 if args:
23 return args
Guido van Rossumbff5bb31992-03-02 16:13:27 +000024 print 'No arguments, checking almost *, in "ls -t" order'
25 list = []
Guido van Rossumec758ea1991-06-04 20:36:54 +000026 for file in posix.listdir('.'):
27 if not skipfile(file):
Guido van Rossumbff5bb31992-03-02 16:13:27 +000028 list.append((getmtime(file), file))
29 list.sort()
30 if not list:
Guido van Rossumec758ea1991-06-04 20:36:54 +000031 print 'Nothing to do -- exit 1'
32 sys.exit(1)
Guido van Rossumbff5bb31992-03-02 16:13:27 +000033 list.sort()
34 list.reverse()
35 for mtime, file in list: args.append(file)
Guido van Rossumec758ea1991-06-04 20:36:54 +000036 return args
37
Guido van Rossumbff5bb31992-03-02 16:13:27 +000038def getmtime(file):
39 try:
40 st = posix.stat(file)
41 return st[ST_MTIME]
42 except posix.error:
43 return -1
44
Guido van Rossum185d06e1991-06-04 20:44:11 +000045badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
Guido van Rossumec758ea1991-06-04 20:36:54 +000046badprefixes = ['.', ',', '@', '#', 'o.']
47badsuffixes = \
Guido van Rossum97dddba1991-12-18 13:39:16 +000048 ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
49 '.pyc', '.elc']
Guido van Rossumbff5bb31992-03-02 16:13:27 +000050
51def setup():
52 global ignore
53 ignore = badnames[:]
54 for p in badprefixes:
55 ignore.append(p + '*')
56 for p in badsuffixes:
57 ignore.append('*' + p)
58 try:
59 f = open('.xxcign', 'r')
60 except IOError:
61 return
62 ignore = ignore + string.split(f.read())
Guido van Rossumec758ea1991-06-04 20:36:54 +000063
64def skipfile(file):
Guido van Rossumbff5bb31992-03-02 16:13:27 +000065 for p in ignore:
66 if fnmatch.fnmatch(file, p): return 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000067 try:
Guido van Rossumbff5bb31992-03-02 16:13:27 +000068 st = posix.lstat(file)
Guido van Rossumec758ea1991-06-04 20:36:54 +000069 except posix.error:
70 return 1 # Doesn't exist -- skip it
Guido van Rossumbff5bb31992-03-02 16:13:27 +000071 # Skip non-plain files.
72 if not S_ISREG(st[ST_MODE]): return 1
73 # Skip huge files -- probably binaries.
74 if st[ST_SIZE] >= MAXSIZE: return 1
Guido van Rossum97dddba1991-12-18 13:39:16 +000075 # Skip executables
76 try:
77 data = open(file, 'r').read(len(EXECMAGIC))
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000078 if data == EXECMAGIC: return 1
Guido van Rossum97dddba1991-12-18 13:39:16 +000079 except:
80 pass
81 return 0
Guido van Rossumec758ea1991-06-04 20:36:54 +000082
83def badprefix(file):
84 for bad in badprefixes:
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000085 if file[:len(bad)] == bad: return 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000086 return 0
87
88def badsuffix(file):
89 for bad in badsuffixes:
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000090 if file[-len(bad):] == bad: return 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000091 return 0
92
93def go(args):
94 for file in args:
95 print file + ':'
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +000096 if differing(file):
97 sts = posix.system('rcsdiff ' + file) # ignored
Guido van Rossumec758ea1991-06-04 20:36:54 +000098 if askyesno('Check in ' + file + ' ? '):
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +000099 sts = posix.system('rcs -l ' + file) # ignored
Guido van Rossumec758ea1991-06-04 20:36:54 +0000100 sts = posix.system('ci -l ' + file)
101
Guido van Rossum2fa5a7f1991-07-01 18:23:06 +0000102def differing(file):
103 try:
104 this = open(file, 'r').read()
105 that = posix.popen('co -p '+file+' 2>/dev/null', 'r').read()
106 return this <> that
107 except:
108 return 1
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())