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 |
| 10 | import stat |
| 11 | import path |
| 12 | import commands |
| 13 | |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 14 | EXECMAGIC = '\001\140\000\010' |
| 15 | |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 16 | MAXSIZE = 200*1024 # Files this big must be binaries and are skipped. |
| 17 | |
| 18 | def getargs(): |
| 19 | args = sys.argv[1:] |
| 20 | if args: |
| 21 | return args |
| 22 | print 'No arguments, checking almost *' |
| 23 | for file in posix.listdir('.'): |
| 24 | if not skipfile(file): |
| 25 | args.append(file) |
| 26 | if not args: |
| 27 | print 'Nothing to do -- exit 1' |
| 28 | sys.exit(1) |
| 29 | args.sort() |
| 30 | return args |
| 31 | |
Guido van Rossum | 185d06e | 1991-06-04 20:44:11 +0000 | [diff] [blame] | 32 | badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core'] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 33 | badprefixes = ['.', ',', '@', '#', 'o.'] |
| 34 | badsuffixes = \ |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 35 | ['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \ |
| 36 | '.pyc', '.elc'] |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 37 | # XXX Should generalize even more to use fnmatch! |
| 38 | |
| 39 | def skipfile(file): |
| 40 | if file in badnames or \ |
| 41 | badprefix(file) or badsuffix(file) or \ |
| 42 | path.islink(file) or path.isdir(file): |
| 43 | return 1 |
| 44 | # Skip huge files -- probably binaries. |
| 45 | try: |
| 46 | st = posix.stat(file) |
| 47 | except posix.error: |
| 48 | return 1 # Doesn't exist -- skip it |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 49 | if st[stat.ST_SIZE] >= MAXSIZE: return 1 |
| 50 | # Skip executables |
| 51 | try: |
| 52 | data = open(file, 'r').read(len(EXECMAGIC)) |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 53 | if data == EXECMAGIC: return 1 |
Guido van Rossum | 97dddba | 1991-12-18 13:39:16 +0000 | [diff] [blame] | 54 | except: |
| 55 | pass |
| 56 | return 0 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 57 | |
| 58 | def badprefix(file): |
| 59 | for bad in badprefixes: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 60 | if file[:len(bad)] == bad: return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 61 | return 0 |
| 62 | |
| 63 | def badsuffix(file): |
| 64 | for bad in badsuffixes: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 65 | if file[-len(bad):] == bad: return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 66 | return 0 |
| 67 | |
| 68 | def go(args): |
| 69 | for file in args: |
| 70 | print file + ':' |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 71 | if differing(file): |
| 72 | sts = posix.system('rcsdiff ' + file) # ignored |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 73 | if askyesno('Check in ' + file + ' ? '): |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 74 | sts = posix.system('rcs -l ' + file) # ignored |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 75 | sts = posix.system('ci -l ' + file) |
| 76 | |
Guido van Rossum | 2fa5a7f | 1991-07-01 18:23:06 +0000 | [diff] [blame] | 77 | def differing(file): |
| 78 | try: |
| 79 | this = open(file, 'r').read() |
| 80 | that = posix.popen('co -p '+file+' 2>/dev/null', 'r').read() |
| 81 | return this <> that |
| 82 | except: |
| 83 | return 1 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 84 | |
| 85 | def askyesno(prompt): |
| 86 | s = raw_input(prompt) |
| 87 | return s in ['y', 'yes'] |
| 88 | |
| 89 | go(getargs()) |