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 |
| 9 | import posix |
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 path |
| 12 | import commands |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 13 | import fnmatch |
| 14 | import string |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 15 | |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 16 | EXECMAGIC = '\001\140\000\010' |
| 17 | |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 18 | MAXSIZE = 200*1024 # Files this big must be binaries and are skipped. |
| 19 | |
| 20 | def getargs(): |
| 21 | args = sys.argv[1:] |
| 22 | if args: |
| 23 | return args |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 24 | print 'No arguments, checking almost *, in "ls -t" order' |
| 25 | list = [] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 26 | for file in posix.listdir('.'): |
| 27 | if not skipfile(file): |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 28 | list.append((getmtime(file), file)) |
| 29 | list.sort() |
| 30 | if not list: |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 31 | print 'Nothing to do -- exit 1' |
| 32 | sys.exit(1) |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 33 | list.sort() |
| 34 | list.reverse() |
| 35 | for mtime, file in list: args.append(file) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 36 | return args |
| 37 | |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 38 | def getmtime(file): |
| 39 | try: |
| 40 | st = posix.stat(file) |
| 41 | return st[ST_MTIME] |
| 42 | except posix.error: |
| 43 | return -1 |
| 44 | |
Guido van Rossum | 185d06e | 1991-06-04 20:44:11 +0000 | [diff] [blame] | 45 | badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core'] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 46 | badprefixes = ['.', ',', '@', '#', 'o.'] |
| 47 | badsuffixes = \ |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 48 | ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \ |
| 49 | '.pyc', '.elc'] |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 50 | |
| 51 | def 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 Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 63 | |
| 64 | def skipfile(file): |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 65 | for p in ignore: |
| 66 | if fnmatch.fnmatch(file, p): return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 67 | try: |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 68 | st = posix.lstat(file) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 69 | except posix.error: |
| 70 | return 1 # Doesn't exist -- skip it |
Guido van Rossum | bff5bb3 | 1992-03-02 16:13:27 +0000 | [diff] [blame^] | 71 | # 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 Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 75 | # Skip executables |
| 76 | try: |
| 77 | data = open(file, 'r').read(len(EXECMAGIC)) |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 78 | if data == EXECMAGIC: return 1 |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 79 | except: |
| 80 | pass |
| 81 | return 0 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 82 | |
| 83 | def badprefix(file): |
| 84 | for bad in badprefixes: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 85 | if file[:len(bad)] == bad: return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 86 | return 0 |
| 87 | |
| 88 | def badsuffix(file): |
| 89 | for bad in badsuffixes: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 90 | if file[-len(bad):] == bad: return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 91 | return 0 |
| 92 | |
| 93 | def go(args): |
| 94 | for file in args: |
| 95 | print file + ':' |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 96 | if differing(file): |
| 97 | sts = posix.system('rcsdiff ' + file) # ignored |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 98 | if askyesno('Check in ' + file + ' ? '): |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 99 | sts = posix.system('rcs -l ' + file) # ignored |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 100 | sts = posix.system('ci -l ' + file) |
| 101 | |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 102 | def 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 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()) |