1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#!/usr/bin/env python
#coding=utf-8
import os, re, datetime, sys, subprocess
DEFAULT_LICENSE = "gpl3"
CONTRIBUTOR_LICENSE = "mit"
LICENSE_DIR = "Documentation/Licenses"
class License :
def __init__(self, name, file) :
self.name = name
self.file = file
licenses = {
"gpl3" : License("GNU General Public License v3", "GPLv3.txt"),
"mit" : License("MIT License", "MIT.txt"),
}
class Copyright :
def __init__(self, author, year, license) :
self.author = author
self.year = year
self.license = license
def to_string(self, comment_chars) :
return "\n".join([
comment_chars[0],
comment_chars[1] + " Copyright (c) %(year)s %(name)s" % {"year" : self.year, "name" : self.author },
comment_chars[1] + " Licensed under the " + licenses[self.license].name + ".",
comment_chars[1] + " See " + LICENSE_DIR + "/" + licenses[self.license].file + " for more information.",
comment_chars[2],
"\n"])
def get_comment_chars_for_filename(filename) :
return ("/*", " *", " */")
def get_comment_chars_re_for_filename(filename) :
comment_chars = get_comment_chars_for_filename(filename)
return "|".join(comment_chars).replace("*", "\\*")
def parse_file(filename) :
file = open(filename)
copyright_text = []
prolog = ""
epilog = ""
inProlog = True
inCopyright = False
inEpilog = False
for line in file.readlines() :
if inProlog :
if line.startswith("#!") or len(line.strip()) == 0 :
prolog += line
continue
else :
inProlog = False
inCopyright = True
if inCopyright :
if re.match(get_comment_chars_re_for_filename(filename), line) != None :
copyright_text.append(line.rstrip())
continue
else :
inCopyright = False
inEpilog = True
if len(line.strip()) == 0 :
continue
if inEpilog :
epilog += line
continue
file.close()
# Parse the copyright
copyright = None
if len(copyright_text) == 5 :
comment_chars = get_comment_chars_for_filename(filename)
if copyright_text[0] == comment_chars[0] and copyright_text[4] == comment_chars[2] :
matchstring = "(" + get_comment_chars_re_for_filename(filename) + ") Copyright \(c\) (?P<startYear>\d\d\d\d)(-(?P<endYear>\d\d\d\d))? (?P<author>.*)"
m = re.match(matchstring, copyright_text[1])
if m != None :
# FIXME: Do better copyright reconstruction here
copyright = True
if not copyright :
epilog = "\n".join(copyright_text) + epilog
return (prolog, copyright, epilog)
def get_userinfo() :
p = subprocess.Popen("git config user.name", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt"))
username = p.stdout.read().rstrip()
p.stdin.close()
if p.wait() != 0 :
return None
p = subprocess.Popen("git config user.email", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt"))
email = p.stdout.read().rstrip()
p.stdin.close()
if p.wait() != 0 :
return None
return (username, email)
def get_copyright(username, email) :
if email in ["git@el-tramo.be", "git@kismith.co.uk"] :
license = DEFAULT_LICENSE
else :
license = CONTRIBUTOR_LICENSE
return Copyright(username, datetime.date.today().strftime("%Y"), license)
def check_copyright(filename) :
(prolog, copyright, epilog) = parse_file(filename)
if copyright == None :
print "No copyright found in: " + filename
print "Please run '" + sys.argv[0] + " set-copyright " + filename + "'"
return False
else :
return True
def set_copyright(filename, copyright) :
(prolog, c, epilog) = parse_file(filename)
comment_chars = get_comment_chars_for_filename(filename)
copyright_text = copyright.to_string(comment_chars)
file = open(filename, "w")
if prolog != "":
file.write(prolog)
file.write(copyright_text)
if epilog != "" :
file.write(epilog)
file.close()
if sys.argv[1] == "check-copyright" :
if not check_copyright(sys.argv[2]) :
sys.exit(-1)
elif sys.argv[1] == "check-all-copyrights" :
ok = True
for (path, dirs, files) in os.walk(".") :
if "3rdParty" in path or ".sconf" in path :
continue
for filename in [os.path.join(path, file) for file in files if (file.endswith(".cpp") or file.endswith(".h")) and not "ui_" in file and not "moc_" in file and not "qrc_" in file] :
ok &= check_copyright(filename)
if not ok :
sys.exit(-1)
elif sys.argv[1] == "set-copyright" :
(username, email) = get_userinfo()
copyright = get_copyright(username, email)
set_copyright(sys.argv[2], copyright)
elif sys.argv[1] == "set-all-copyrights" :
(username, email) = get_userinfo()
copyright = get_copyright(username, email)
for (path, dirs, files) in os.walk(".") :
if "3rdParty" in path or ".sconf" in path :
continue
for filename in [os.path.join(path, file) for file in files if (file.endswith(".cpp") or file.endswith(".h")) and not "ui_" in file and not "moc_" in file and not "qrc_" in file] :
set_copyright(filename, copyright)
else :
print "Unknown command: " + sys.argv[1]
sys.exit(-1)
|