Home | History | Annotate | Download | only in scripts
      1 #! /usr/bin/env python3
      2 
      3 """(Ostensibly) fix copyright notices in files.
      4 
      5 Actually, this script will simply replace a block of text in a file from one
      6 string to another.  It will only do this once though, i.e. not globally
      7 throughout the file.  It writes a backup file and then does an os.rename()
      8 dance for atomicity.
      9 
     10 Usage: fixnotices.py [options] [filenames]
     11 Options:
     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 
     33 OLD_NOTICE = """/***********************************************************
     34 Copyright (c) 2000, BeOpen.com.
     35 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
     36 Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
     37 All rights reserved.
     38 
     39 See the file "Misc/COPYRIGHT" for information on usage and
     40 redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
     41 ******************************************************************/
     42 """
     43 import os
     44 import sys
     45 import getopt
     46 
     47 NEW_NOTICE = ""
     48 DRYRUN = 0
     49 VERBOSE = 0
     50 
     51 
     52 def usage(code, msg=''):
     53     print(__doc__ % globals())
     54     if msg:
     55         print(msg)
     56     sys.exit(code)
     57 
     58 
     59 def 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 as 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 
     88 def 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 
    112 if __name__ == '__main__':
    113     main()
    114