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
|
#!/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" :
file = sys.argv[2]
if (file.endswith(".cpp") or file.endswith(".h")) and not "3rdParty" in file :
if not check_copyright(file) :
sys.exit(-1)
elif sys.argv[1] == "set-copyright" :
(username, email) = get_userinfo()
copyright = get_copyright(username, email)
set_copyright(sys.argv[2], copyright)
else :
print "Unknown command: " + sys.argv[1]
sys.exit(-1)
|