xref: /btstack/tool/misc/update_copyright.py (revision 41e404d30d48c72a8bde6c1112532dc3034f209f)
15c544019SMatthias Ringwald#!/usr/bin/env python3
2070c8da6SMatthias Ringwaldimport os
3070c8da6SMatthias Ringwaldimport re
4070c8da6SMatthias Ringwald
5070c8da6SMatthias Ringwaldcopyright = """/*
6070c8da6SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH
7070c8da6SMatthias Ringwald *
8070c8da6SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
9070c8da6SMatthias Ringwald * modification, are permitted provided that the following conditions
10070c8da6SMatthias Ringwald * are met:
11070c8da6SMatthias Ringwald *
12070c8da6SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
13070c8da6SMatthias Ringwald *    notice, this list of conditions and the following disclaimer.
14070c8da6SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
15070c8da6SMatthias Ringwald *    notice, this list of conditions and the following disclaimer in the
16070c8da6SMatthias Ringwald *    documentation and/or other materials provided with the distribution.
17070c8da6SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
18070c8da6SMatthias Ringwald *    contributors may be used to endorse or promote products derived
19070c8da6SMatthias Ringwald *    from this software without specific prior written permission.
20070c8da6SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
21070c8da6SMatthias Ringwald *    personal benefit and not for any commercial purpose or for
22070c8da6SMatthias Ringwald *    monetary gain.
23070c8da6SMatthias Ringwald *
24070c8da6SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
25070c8da6SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26070c8da6SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27070c8da6SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
28070c8da6SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29070c8da6SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30070c8da6SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
31070c8da6SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
32070c8da6SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33070c8da6SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
34070c8da6SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35070c8da6SMatthias Ringwald * SUCH DAMAGE.
36070c8da6SMatthias Ringwald *
37070c8da6SMatthias Ringwald * Please inquire about commercial licensing options at
38070c8da6SMatthias Ringwald * [email protected]
39070c8da6SMatthias Ringwald *
40070c8da6SMatthias Ringwald */
41070c8da6SMatthias Ringwald"""
42070c8da6SMatthias Ringwald
43070c8da6SMatthias RingwaldonlyDumpDifferentCopyright = False
44070c8da6SMatthias RingwaldcopyrightString = "Copyright \(C\) 2014 BlueKitchen GmbH"
45070c8da6SMatthias Ringwaldcopyrighters = ["BlueKitchen", "Matthias Ringwald"]
46070c8da6SMatthias Ringwald
47070c8da6SMatthias RingwaldignoreFolders = ["cpputest", "test", "msp-exp430f5438-cc2564b", "msp430f5229lp-cc2564b", "ez430-rf2560", "ios", "chipset/cc256x", "docs", "mtk"]
48070c8da6SMatthias RingwaldignoreFiles = ["ant_cmds.h", "rijndael.c", "btstack_config.h", "btstack_version.h", "profile.h", "bluetoothdrv.h",
49070c8da6SMatthias Ringwald	"ancs_client_demo.h", "spp_and_le_counter.h", "bluetoothdrv-stub.c", "minimal_peripheral.c", "BTstackDaemonRespawn.c"]
50070c8da6SMatthias Ringwald
51070c8da6SMatthias Ringwaldclass State:
52070c8da6SMatthias Ringwald	SearchStartComment = 0
53070c8da6SMatthias Ringwald	SearchCopyrighter = 1
54070c8da6SMatthias Ringwald	SearchEndComment = 2
55070c8da6SMatthias Ringwald	SkipCopyright = 3
56070c8da6SMatthias Ringwald
57070c8da6SMatthias Ringwalddef updateCopyright(dir_name, file_name):
58070c8da6SMatthias Ringwald	infile = dir_name + "/" + file_name
59070c8da6SMatthias Ringwald	outfile = dir_name + "/tmp_" + file_name
60070c8da6SMatthias Ringwald
61070c8da6SMatthias Ringwald	#print "Update copyright: ", infile
62070c8da6SMatthias Ringwald
63070c8da6SMatthias Ringwald	with open(outfile, 'wt') as fout:
64070c8da6SMatthias Ringwald		fout.write(copyright)
65070c8da6SMatthias Ringwald
66070c8da6SMatthias Ringwald		bufferComment = ""
67070c8da6SMatthias Ringwald		state = State.SearchStartComment
68070c8da6SMatthias Ringwald
69070c8da6SMatthias Ringwald		with open(infile, 'rt') as fin:
70070c8da6SMatthias Ringwald			for line in fin:
71070c8da6SMatthias Ringwald				if state == State.SearchStartComment:
72070c8da6SMatthias Ringwald					parts = re.match('\s*(/\*).*(\*/)',line)
73070c8da6SMatthias Ringwald					if parts:
74070c8da6SMatthias Ringwald						if len(parts.groups()) == 2:
75070c8da6SMatthias Ringwald							# one line comment
76070c8da6SMatthias Ringwald							fout.write(line)
77070c8da6SMatthias Ringwald							continue
78070c8da6SMatthias Ringwald
79070c8da6SMatthias Ringwald					parts = re.match('\s*(/\*).*',line)
80070c8da6SMatthias Ringwald					if parts:
81070c8da6SMatthias Ringwald						# beginning of comment
82070c8da6SMatthias Ringwald						state = State.SearchCopyrighter
83070c8da6SMatthias Ringwald					else:
84070c8da6SMatthias Ringwald						# command line
85070c8da6SMatthias Ringwald						fout.write(line)
86070c8da6SMatthias Ringwald						continue
87070c8da6SMatthias Ringwald
88070c8da6SMatthias Ringwald				if state == State.SearchCopyrighter:
89070c8da6SMatthias Ringwald					parts = re.match('.*(Copyright).*',line)
90070c8da6SMatthias Ringwald					if parts:
91070c8da6SMatthias Ringwald						# ignore Copyright
92070c8da6SMatthias Ringwald						# drop buffer
93070c8da6SMatthias Ringwald						bufferComment = ""
94070c8da6SMatthias Ringwald						state = State.SkipCopyright
95070c8da6SMatthias Ringwald					else:
96070c8da6SMatthias Ringwald						bufferComment = bufferComment + line
97070c8da6SMatthias Ringwald						parts = re.match('.*(\*/)',line)
98070c8da6SMatthias Ringwald						if parts:
99070c8da6SMatthias Ringwald							# end of comment
100070c8da6SMatthias Ringwald							fout.write(bufferComment)
101070c8da6SMatthias Ringwald							bufferComment = ""
102070c8da6SMatthias Ringwald							state = State.SearchStartComment
103070c8da6SMatthias Ringwald
104070c8da6SMatthias Ringwald				if state == State.SkipCopyright:
105070c8da6SMatthias Ringwald					parts = re.match('.*(\*/)',line)
106070c8da6SMatthias Ringwald					if parts:
107070c8da6SMatthias Ringwald						state = State.SearchStartComment
108070c8da6SMatthias Ringwald
109070c8da6SMatthias Ringwald	os.rename(outfile, infile)
110070c8da6SMatthias Ringwald
111070c8da6SMatthias Ringwald
112070c8da6SMatthias Ringwalddef requiresCopyrightUpdate(file_name):
113070c8da6SMatthias Ringwald	global copyrightString, onlyDumpDifferentCopyright
114070c8da6SMatthias Ringwald	exactCopyrightFound = False
115070c8da6SMatthias Ringwald
1165c544019SMatthias Ringwald	with open(file_name, "rt") as fin:
1175c544019SMatthias Ringwald		print("File: " + file_name)
118070c8da6SMatthias Ringwald		for line in fin:
1195c544019SMatthias Ringwald			print("Line: " + line)
120070c8da6SMatthias Ringwald			parts = re.match('.*('+copyrightString+').*',line)
121070c8da6SMatthias Ringwald			if parts:
122070c8da6SMatthias Ringwald				exactCopyrightFound = True
123070c8da6SMatthias Ringwald				continue
124070c8da6SMatthias Ringwald
125070c8da6SMatthias Ringwald			parts = re.match('.*(Copyright).*',line)
126070c8da6SMatthias Ringwald			if not parts:
127070c8da6SMatthias Ringwald				continue
128070c8da6SMatthias Ringwald			for name in copyrighters:
129070c8da6SMatthias Ringwald				allowedCopyrighters = re.match('.*('+name+').*',line, re.I)
130070c8da6SMatthias Ringwald				if allowedCopyrighters:
131070c8da6SMatthias Ringwald					return True
132070c8da6SMatthias Ringwald
133070c8da6SMatthias Ringwald			if onlyDumpDifferentCopyright:
134070c8da6SMatthias Ringwald				print(file_name, ": Copyrighter not allowed > ", parts.group())
135070c8da6SMatthias Ringwald			return False
136070c8da6SMatthias Ringwald
137070c8da6SMatthias Ringwald	if not exactCopyrightFound:
138070c8da6SMatthias Ringwald		print(file_name, ": File has no copyright")
139070c8da6SMatthias Ringwald
140070c8da6SMatthias Ringwald	return False
141070c8da6SMatthias Ringwald
142070c8da6SMatthias Ringwald
143070c8da6SMatthias Ringwald# if requiresCopyrightUpdate("../example/panu_demo.c"):
144070c8da6SMatthias Ringwald# 	print "UPdate"
145070c8da6SMatthias Ringwald# 	updateCopyright("../example", "panu_demo.c")
146070c8da6SMatthias Ringwald
147*41e404d3SMilanka Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../..')
148070c8da6SMatthias Ringwald
149*41e404d3SMilanka Ringwaldfor root, dirs, files in os.walk(btstack_root, topdown=True):
150070c8da6SMatthias Ringwald	dirs[:] = [d for d in dirs if d not in ignoreFolders]
151070c8da6SMatthias Ringwald	files[:] = [f for f in files if f not in ignoreFiles]
152070c8da6SMatthias Ringwald	for f in files:
153070c8da6SMatthias Ringwald		if f.endswith(".h") or f.endswith(".c"):
154070c8da6SMatthias Ringwald			file_name = root + "/" + f
155070c8da6SMatthias Ringwald			if requiresCopyrightUpdate(file_name):
156070c8da6SMatthias Ringwald				updateCopyright(root, f)
157070c8da6SMatthias Ringwald
158070c8da6SMatthias Ringwald
159070c8da6SMatthias Ringwald