| #! /usr/bin/env python | |
| """(Ostensibly) fix copyright notices in files. | |
| Actually, this sript will simply replace a block of text in a file from one | |
| string to another. It will only do this once though, i.e. not globally | |
| throughout the file. It writes a backup file and then does an os.rename() | |
| dance for atomicity. | |
| Usage: fixnotices.py [options] [filenames] | |
| Options: | |
| -h / --help | |
| Print this message and exit | |
| --oldnotice=file | |
| Use the notice in the file as the old (to be replaced) string, instead | |
| of the hard coded value in the script. | |
| --newnotice=file | |
| Use the notice in the file as the new (replacement) string, instead of | |
| the hard coded value in the script. | |
| --dry-run | |
| Don't actually make the changes, but print out the list of files that | |
| would change. When used with -v, a status will be printed for every | |
| file. | |
| -v / --verbose | |
| Print a message for every file looked at, indicating whether the file | |
| is changed or not. | |
| """ | |
| OLD_NOTICE = """/*********************************************************** | |
| Copyright (c) 2000, BeOpen.com. | |
| Copyright (c) 1995-2000, Corporation for National Research Initiatives. | |
| Copyright (c) 1990-1995, Stichting Mathematisch Centrum. | |
| All rights reserved. | |
| See the file "Misc/COPYRIGHT" for information on usage and | |
| redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. | |
| ******************************************************************/ | |
| """ | |
| import os | |
| import sys | |
| import getopt | |
| NEW_NOTICE = "" | |
| DRYRUN = 0 | |
| VERBOSE = 0 | |
| def usage(code, msg=''): | |
| print __doc__ % globals() | |
| if msg: | |
| print msg | |
| sys.exit(code) | |
| def main(): | |
| global DRYRUN, OLD_NOTICE, NEW_NOTICE, VERBOSE | |
| try: | |
| opts, args = getopt.getopt(sys.argv[1:], 'hv', | |
| ['help', 'oldnotice=', 'newnotice=', | |
| 'dry-run', 'verbose']) | |
| except getopt.error, msg: | |
| usage(1, msg) | |
| for opt, arg in opts: | |
| if opt in ('-h', '--help'): | |
| usage(0) | |
| elif opt in ('-v', '--verbose'): | |
| VERBOSE = 1 | |
| elif opt == '--dry-run': | |
| DRYRUN = 1 | |
| elif opt == '--oldnotice': | |
| fp = open(arg) | |
| OLD_NOTICE = fp.read() | |
| fp.close() | |
| elif opt == '--newnotice': | |
| fp = open(arg) | |
| NEW_NOTICE = fp.read() | |
| fp.close() | |
| for arg in args: | |
| process(arg) | |
| def process(file): | |
| f = open(file) | |
| data = f.read() | |
| f.close() | |
| i = data.find(OLD_NOTICE) | |
| if i < 0: | |
| if VERBOSE: | |
| print 'no change:', file | |
| return | |
| elif DRYRUN or VERBOSE: | |
| print ' change:', file | |
| if DRYRUN: | |
| # Don't actually change the file | |
| return | |
| data = data[:i] + NEW_NOTICE + data[i+len(OLD_NOTICE):] | |
| new = file + ".new" | |
| backup = file + ".bak" | |
| f = open(new, "w") | |
| f.write(data) | |
| f.close() | |
| os.rename(file, backup) | |
| os.rename(new, file) | |
| if __name__ == '__main__': | |
| main() |