1#! /usr/bin/env python 2 3"""(Ostensibly) fix copyright notices in files. 4 5Actually, this sript will simply replace a block of text in a file from one 6string to another. It will only do this once though, i.e. not globally 7throughout the file. It writes a backup file and then does an os.rename() 8dance for atomicity. 9 10Usage: fixnotices.py [options] [filenames] 11Options: 12 -h / --help 13 Print this message and exit 14 15 --oldnotice=file 16 Use the notice in the file as the old (to be replaced) string, instead 17 of the hard coded value in the script. 18 19 --newnotice=file 20 Use the notice in the file as the new (replacement) string, instead of 21 the hard coded value in the script. 22 23 --dry-run 24 Don't actually make the changes, but print out the list of files that 25 would change. When used with -v, a status will be printed for every 26 file. 27 28 -v / --verbose 29 Print a message for every file looked at, indicating whether the file 30 is changed or not. 31""" 32 33OLD_NOTICE = """/*********************************************************** 34Copyright (c) 2000, BeOpen.com. 35Copyright (c) 1995-2000, Corporation for National Research Initiatives. 36Copyright (c) 1990-1995, Stichting Mathematisch Centrum. 37All rights reserved. 38 39See the file "Misc/COPYRIGHT" for information on usage and 40redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. 41******************************************************************/ 42""" 43import os 44import sys 45import getopt 46 47NEW_NOTICE = "" 48DRYRUN = 0 49VERBOSE = 0 50 51 52def usage(code, msg=''): 53 print __doc__ % globals() 54 if msg: 55 print msg 56 sys.exit(code) 57 58 59def main(): 60 global DRYRUN, OLD_NOTICE, NEW_NOTICE, VERBOSE 61 try: 62 opts, args = getopt.getopt(sys.argv[1:], 'hv', 63 ['help', 'oldnotice=', 'newnotice=', 64 'dry-run', 'verbose']) 65 except getopt.error, msg: 66 usage(1, msg) 67 68 for opt, arg in opts: 69 if opt in ('-h', '--help'): 70 usage(0) 71 elif opt in ('-v', '--verbose'): 72 VERBOSE = 1 73 elif opt == '--dry-run': 74 DRYRUN = 1 75 elif opt == '--oldnotice': 76 fp = open(arg) 77 OLD_NOTICE = fp.read() 78 fp.close() 79 elif opt == '--newnotice': 80 fp = open(arg) 81 NEW_NOTICE = fp.read() 82 fp.close() 83 84 for arg in args: 85 process(arg) 86 87 88def process(file): 89 f = open(file) 90 data = f.read() 91 f.close() 92 i = data.find(OLD_NOTICE) 93 if i < 0: 94 if VERBOSE: 95 print 'no change:', file 96 return 97 elif DRYRUN or VERBOSE: 98 print ' change:', file 99 if DRYRUN: 100 # Don't actually change the file 101 return 102 data = data[:i] + NEW_NOTICE + data[i+len(OLD_NOTICE):] 103 new = file + ".new" 104 backup = file + ".bak" 105 f = open(new, "w") 106 f.write(data) 107 f.close() 108 os.rename(file, backup) 109 os.rename(new, file) 110 111 112if __name__ == '__main__': 113 main() 114