trunk merge
[mailman.git] / copybump.py
blob87fa5dfb98ef749493e0e15116c734c3167a354d
1 #! /usr/bin/env python3
3 import os
4 import re
5 import sys
6 import stat
7 import datetime
10 FSF = 'by the Free Software Foundation, Inc.'
11 this_year = datetime.date.today().year
12 pyre = re.compile(r'# Copyright \(C\) ((?P<start>\d{4})-)?(?P<end>\d{4})')
14 MODE = (stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
17 def do_file(path, owner):
18 print('=>', path)
19 permissions = os.stat(path).st_mode & MODE
20 with open(path) as in_file, open(path + '.out', 'w') as out_file:
21 try:
22 for line in in_file:
23 mo = pyre.match(line)
24 if mo is None:
25 out_file.write(line)
26 continue
27 start = (mo.group('end')
28 if mo.group('start') is None
29 else mo.group('start'))
30 if int(start) == this_year:
31 out_file.write(line)
32 continue
33 print('# Copyright (C) {}-{} {}'.format(
34 start, this_year, owner), file=out_file)
35 for line in in_file:
36 out_file.write(line)
37 except UnicodeDecodeError:
38 print('Cannot convert path:', path)
39 os.remove(path + '.out')
40 return
41 os.rename(path + '.out', path)
42 os.chmod(path, permissions)
45 def remove(dirs, path):
46 try:
47 dirs.remove(path)
48 except ValueError:
49 pass
52 def do_walk():
53 try:
54 owner = sys.argv[1]
55 except IndexError:
56 owner = FSF
57 for root, dirs, files in os.walk('.'):
58 if root == '.':
59 remove(dirs, '.bzr')
60 remove(dirs, 'bin')
61 remove(dirs, 'contrib')
62 remove(dirs, 'develop-eggs')
63 remove(dirs, 'eggs')
64 remove(dirs, 'parts')
65 remove(dirs, 'gnu-COPYING-GPL')
66 remove(dirs, '.installed.cfg')
67 remove(dirs, '.bzrignore')
68 remove(dirs, 'distribute_setup.py')
69 if root == './src':
70 remove(dirs, 'mailman.egg-info')
71 if root == './src/mailman':
72 remove(dirs, 'messages')
73 for file_name in files:
74 if os.path.splitext(file_name)[1] in ('.pyc', '.gz', '.egg'):
75 continue
76 path = os.path.join(root, file_name)
77 if os.path.isfile(path):
78 do_file(path, owner)
81 if __name__ == '__main__':
82 do_walk()