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