xref: /btstack/tool/misc/update_copyright.py (revision 5b2fa894af896032f61c895f0b073b5de1a0f6a0)
15c544019SMatthias Ringwald#!/usr/bin/env python3
2070c8da6SMatthias Ringwaldimport os
3070c8da6SMatthias Ringwaldimport re
4*5b2fa894SMilanka Ringwaldimport sys
5070c8da6SMatthias Ringwald
6*5b2fa894SMilanka RingwaldcopyrightTitle = ".*(Copyright).*(BlueKitchen GmbH)"
7*5b2fa894SMilanka RingwaldcopyrightSubtitle = ".*All rights reserved.*"
8070c8da6SMatthias Ringwald
9*5b2fa894SMilanka RingwaldfindAndReplace = {
10*5b2fa894SMilanka Ringwald	"MATTHIAS" : "BLUEKITCHEN",
11*5b2fa894SMilanka Ringwald	"RINGWALD" : "GMBH"
12*5b2fa894SMilanka Ringwald}
13070c8da6SMatthias Ringwald
14*5b2fa894SMilanka RingwaldignoreFolders = ["cpputest", "test", "docs", "3rd-party"]
15*5b2fa894SMilanka RingwaldignoreFiles = ["ant_cmds.h", "btstack_config.h", "bluetoothdrv.h", "bluetoothdrv-stub.c", "BTstackDaemonRespawn.c"]
16*5b2fa894SMilanka Ringwald
17070c8da6SMatthias Ringwald
18070c8da6SMatthias Ringwaldclass State:
19*5b2fa894SMilanka Ringwald	SearchStartCopyright = 0
20*5b2fa894SMilanka Ringwald	SearchEndCopyright = 1
21*5b2fa894SMilanka Ringwald	CopyrightEnd = 2
22070c8da6SMatthias Ringwald
23070c8da6SMatthias Ringwalddef updateCopyright(dir_name, file_name):
24*5b2fa894SMilanka Ringwald	global copyrightTitle, copyrightSubtitle
25*5b2fa894SMilanka Ringwald
26070c8da6SMatthias Ringwald	infile = dir_name + "/" + file_name
27070c8da6SMatthias Ringwald	outfile = dir_name + "/tmp_" + file_name
28070c8da6SMatthias Ringwald
29070c8da6SMatthias Ringwald	with open(outfile, 'wt') as fout:
30070c8da6SMatthias Ringwald		bufferComment = ""
31*5b2fa894SMilanka Ringwald		state = State.SearchStartCopyright
32070c8da6SMatthias Ringwald
33070c8da6SMatthias Ringwald		with open(infile, 'rt') as fin:
34070c8da6SMatthias Ringwald			for line in fin:
35*5b2fa894SMilanka Ringwald				# search Copyright start
36*5b2fa894SMilanka Ringwald				if state == State.SearchStartCopyright:
37*5b2fa894SMilanka Ringwald					fout.write(line)
38*5b2fa894SMilanka Ringwald					parts = re.match(copyrightTitle, line)
39070c8da6SMatthias Ringwald					if parts:
40*5b2fa894SMilanka Ringwald						fout.write(" * All rights reserved\n")
41*5b2fa894SMilanka Ringwald						state = State.SearchEndCopyright
42*5b2fa894SMilanka Ringwald						continue
43*5b2fa894SMilanka Ringwald
44*5b2fa894SMilanka Ringwald				if state == State.SearchEndCopyright:
45*5b2fa894SMilanka Ringwald					parts = re.match(copyrightSubtitle, line)
46*5b2fa894SMilanka Ringwald					if parts:
47*5b2fa894SMilanka Ringwald						continue
48*5b2fa894SMilanka Ringwald
49*5b2fa894SMilanka Ringwald					# search end of Copyright
50*5b2fa894SMilanka Ringwald					parts = re.match('\s*(\*\/)\s*',line)
51*5b2fa894SMilanka Ringwald					if parts:
52*5b2fa894SMilanka Ringwald						state = State.CopyrightEnd
53*5b2fa894SMilanka Ringwald					else:
54*5b2fa894SMilanka Ringwald						for key, value in findAndReplace.items():
55*5b2fa894SMilanka Ringwald							line = line.replace(key, value)
56*5b2fa894SMilanka Ringwald
57070c8da6SMatthias Ringwald					fout.write(line)
58070c8da6SMatthias Ringwald					continue
59070c8da6SMatthias Ringwald
60*5b2fa894SMilanka Ringwald				# write rest of the file
61*5b2fa894SMilanka Ringwald				if state == State.CopyrightEnd:
62070c8da6SMatthias Ringwald					fout.write(line)
63070c8da6SMatthias Ringwald
64070c8da6SMatthias Ringwald	os.rename(outfile, infile)
65070c8da6SMatthias Ringwald
66070c8da6SMatthias Ringwald
67070c8da6SMatthias Ringwalddef requiresCopyrightUpdate(file_name):
68*5b2fa894SMilanka Ringwald	global copyrightTitle, copyrightSubtitle
69070c8da6SMatthias Ringwald
70*5b2fa894SMilanka Ringwald	state = State.SearchStartCopyright
715c544019SMatthias Ringwald	with open(file_name, "rt") as fin:
72*5b2fa894SMilanka Ringwald		try:
73070c8da6SMatthias Ringwald			for line in fin:
74*5b2fa894SMilanka Ringwald				if state == State.SearchStartCopyright:
75*5b2fa894SMilanka Ringwald					parts = re.match(copyrightTitle, line)
76070c8da6SMatthias Ringwald					if parts:
77*5b2fa894SMilanka Ringwald						state = State.SearchEndCopyright
78070c8da6SMatthias Ringwald						continue
79*5b2fa894SMilanka Ringwald				if state == State.SearchEndCopyright:
80*5b2fa894SMilanka Ringwald					parts = re.match(copyrightSubtitle, line)
81*5b2fa894SMilanka Ringwald					if parts:
82*5b2fa894SMilanka Ringwald						return False
83070c8da6SMatthias Ringwald					return True
84070c8da6SMatthias Ringwald
85*5b2fa894SMilanka Ringwald		except UnicodeDecodeError:
86070c8da6SMatthias Ringwald			return False
87070c8da6SMatthias Ringwald
88070c8da6SMatthias Ringwald	return False
89070c8da6SMatthias Ringwald
90070c8da6SMatthias Ringwald
9141e404d3SMilanka Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../..')
92070c8da6SMatthias Ringwald
93*5b2fa894SMilanka Ringwald# file_name = btstack_root + "/example/panu_demo.c"
94*5b2fa894SMilanka Ringwald# if requiresCopyrightUpdate(file_name):
95*5b2fa894SMilanka Ringwald# 	print(file_name, ": update")
96*5b2fa894SMilanka Ringwald	# updateCopyright(btstack_root + "/example", "panu_demo.c")
97*5b2fa894SMilanka Ringwald
98*5b2fa894SMilanka Ringwald
9941e404d3SMilanka Ringwaldfor root, dirs, files in os.walk(btstack_root, topdown=True):
100070c8da6SMatthias Ringwald	dirs[:] = [d for d in dirs if d not in ignoreFolders]
101070c8da6SMatthias Ringwald	files[:] = [f for f in files if f not in ignoreFiles]
102070c8da6SMatthias Ringwald	for f in files:
103070c8da6SMatthias Ringwald		if f.endswith(".h") or f.endswith(".c"):
104070c8da6SMatthias Ringwald			file_name = root + "/" + f
105070c8da6SMatthias Ringwald			if requiresCopyrightUpdate(file_name):
106*5b2fa894SMilanka Ringwald				print(file_name)
107070c8da6SMatthias Ringwald    			updateCopyright(root, f)
108070c8da6SMatthias Ringwald