Update to 2.7.3
[profile/ivi/python.git] / Tools / scripts / fixnotice.py
1 #! /usr/bin/env python
2
3 """(Ostensibly) fix copyright notices in files.
4
5 Actually, this sript 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, 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()