Guido van Rossum | f06ee5f | 1996-11-27 19:52:01 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 2 | |
| 3 | # xxci |
| 4 | # |
| 5 | # check in files for which rcsdiff returns nonzero exit status |
| 6 | |
| 7 | import sys |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 8 | import os |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 9 | from stat import * |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 10 | import commands |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 11 | import fnmatch |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 12 | |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 13 | EXECMAGIC = '\001\140\000\010' |
| 14 | |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 15 | MAXSIZE = 200*1024 # Files this big must be binaries and are skipped. |
| 16 | |
| 17 | def getargs(): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 18 | 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 Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 34 | |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 35 | def getmtime(file): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 36 | try: |
| 37 | st = os.stat(file) |
| 38 | return st[ST_MTIME] |
| 39 | except os.error: |
| 40 | return -1 |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 41 | |
Guido van Rossum | 185d06e | 1991-06-04 20:44:11 +0000 | [diff] [blame] | 42 | badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core'] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 43 | badprefixes = ['.', ',', '@', '#', 'o.'] |
| 44 | badsuffixes = \ |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 45 | ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \ |
| 46 | '.pyc', '.fdc', '.rgb', '.elc', ',v'] |
Guido van Rossum | ceb86da | 1992-05-19 13:49:16 +0000 | [diff] [blame] | 47 | ignore = [] |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 48 | |
| 49 | def setup(): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 50 | 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örwald | aaab30e | 2002-09-11 20:36:02 +0000 | [diff] [blame] | 59 | ignore[:] = ignore + f.read().split() |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 60 | |
| 61 | def skipfile(file): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 62 | 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 Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 79 | |
| 80 | def badprefix(file): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 81 | for bad in badprefixes: |
| 82 | if file[:len(bad)] == bad: return 1 |
| 83 | return 0 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 84 | |
| 85 | def badsuffix(file): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 86 | for bad in badsuffixes: |
| 87 | if file[-len(bad):] == bad: return 1 |
| 88 | return 0 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 89 | |
| 90 | def go(args): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 91 | 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 Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 98 | |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 99 | def differing(file): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 100 | cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file |
| 101 | sts = os.system(cmd) |
| 102 | return sts != 0 |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 103 | |
| 104 | def showdiffs(file): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 105 | cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}' |
| 106 | sts = os.system(cmd) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 107 | |
| 108 | def askyesno(prompt): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 109 | s = raw_input(prompt) |
| 110 | return s in ['y', 'yes'] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 111 | |
Andrew M. Kuchling | e236b38 | 2004-08-09 17:27:55 +0000 | [diff] [blame] | 112 | if __name__ == '__main__': |
| 113 | try: |
| 114 | setup() |
| 115 | go(getargs()) |
| 116 | except KeyboardInterrupt: |
| 117 | print '[Intr]' |