summaryrefslogtreecommitdiffstats
blob: 8673c2267153f11bd403bef74e31ad8cd5513ab5 (plain)
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)