Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 1 | #! /ufs/guido/bin/sgi/python |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 2 | #! /usr/local/python |
| 3 | |
| 4 | # xxci |
| 5 | # |
| 6 | # check in files for which rcsdiff returns nonzero exit status |
| 7 | |
| 8 | import sys |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 9 | import os |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 10 | from stat import * |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 11 | import commands |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 12 | import fnmatch |
| 13 | import string |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 14 | |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 15 | EXECMAGIC = '\001\140\000\010' |
| 16 | |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 17 | MAXSIZE = 200*1024 # Files this big must be binaries and are skipped. |
| 18 | |
| 19 | def getargs(): |
| 20 | args = sys.argv[1:] |
| 21 | if args: |
| 22 | return args |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 23 | print 'No arguments, checking almost *, in "ls -t" order' |
| 24 | list = [] |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 25 | for file in os.listdir(os.curdir): |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 26 | if not skipfile(file): |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 27 | list.append((getmtime(file), file)) |
| 28 | list.sort() |
| 29 | if not list: |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 30 | print 'Nothing to do -- exit 1' |
| 31 | sys.exit(1) |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 32 | list.sort() |
| 33 | list.reverse() |
| 34 | for mtime, file in list: args.append(file) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 35 | return args |
| 36 | |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 37 | def getmtime(file): |
| 38 | try: |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 39 | st = os.stat(file) |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 40 | return st[ST_MTIME] |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 41 | except os.error: |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 42 | return -1 |
| 43 | |
Guido van Rossum | 185d06e | 1991-06-04 20:44:11 +0000 | [diff] [blame] | 44 | badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core'] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 45 | badprefixes = ['.', ',', '@', '#', 'o.'] |
| 46 | badsuffixes = \ |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 47 | ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \ |
| 48 | '.pyc', '.elc'] |
Guido van Rossum | ceb86da | 1992-05-19 13:49:16 +0000 | [diff] [blame] | 49 | ignore = [] |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 50 | |
| 51 | def setup(): |
Guido van Rossum | ceb86da | 1992-05-19 13:49:16 +0000 | [diff] [blame] | 52 | ignore[:] = badnames |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 53 | for p in badprefixes: |
| 54 | ignore.append(p + '*') |
| 55 | for p in badsuffixes: |
| 56 | ignore.append('*' + p) |
| 57 | try: |
| 58 | f = open('.xxcign', 'r') |
| 59 | except IOError: |
| 60 | return |
Guido van Rossum | ceb86da | 1992-05-19 13:49:16 +0000 | [diff] [blame] | 61 | ignore[:] = ignore + string.split(f.read()) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 62 | |
| 63 | def skipfile(file): |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 64 | for p in ignore: |
| 65 | if fnmatch.fnmatch(file, p): return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 66 | try: |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 67 | st = os.lstat(file) |
| 68 | except os.error: |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 69 | return 1 # Doesn't exist -- skip it |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 70 | # Skip non-plain files. |
| 71 | if not S_ISREG(st[ST_MODE]): return 1 |
| 72 | # Skip huge files -- probably binaries. |
| 73 | if st[ST_SIZE] >= MAXSIZE: return 1 |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 74 | # Skip executables |
| 75 | try: |
| 76 | data = open(file, 'r').read(len(EXECMAGIC)) |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 77 | if data == EXECMAGIC: return 1 |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 78 | except: |
| 79 | pass |
| 80 | return 0 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 81 | |
| 82 | def badprefix(file): |
| 83 | for bad in badprefixes: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 84 | if file[:len(bad)] == bad: return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 85 | return 0 |
| 86 | |
| 87 | def badsuffix(file): |
| 88 | for bad in badsuffixes: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 89 | if file[-len(bad):] == bad: return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 90 | return 0 |
| 91 | |
| 92 | def go(args): |
| 93 | for file in args: |
| 94 | print file + ':' |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 95 | if differing(file): |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 96 | showdiffs(file) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 97 | if askyesno('Check in ' + file + ' ? '): |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 98 | sts = os.system('rcs -l ' + file) # ignored |
| 99 | sts = os.system('ci -l ' + file) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 100 | |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 101 | def differing(file): |
Guido van Rossum | e7b88e7 | 1992-03-30 11:13:59 +0000 | [diff] [blame] | 102 | cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file |
| 103 | sts = os.system(cmd) |
| 104 | return sts != 0 |
| 105 | |
| 106 | def showdiffs(file): |
| 107 | cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}' |
| 108 | sts = os.system(cmd) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 109 | |
| 110 | def askyesno(prompt): |
| 111 | s = raw_input(prompt) |
| 112 | return s in ['y', 'yes'] |
| 113 | |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame] | 114 | setup() |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 115 | go(getargs()) |