1+ # Copyright (C) 2024 Intel Corporation
2+ #
3+ # Licensed under the Apache License, Version 2.0 (the "License");
4+ # you may not use this file except in compliance with the License.
5+ # You may obtain a copy of the License at
6+ #
7+ # http://www.apache.org/licenses/LICENSE-2.0
8+ #
9+ # Unless required by applicable law or agreed to in writing,
10+ # software distributed under the License is distributed on an "AS IS" BASIS,
11+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ # See the License for the specific language governing permissions
13+ # and limitations under the License.
14+ #
15+ # SPDX-License-Identifier: Apache-2.0
16+
17+ import datetime , sys , re , argparse
18+ from typing import Dict , Set
19+
20+ WIDTH : int = 80
21+ intel_license : list [str ] = [
22+ 'Copyright \\ (C\\ ) (\\ d\\ d\\ d\\ d-)?$YEAR Intel Corporation' ,
23+ '' ,
24+ 'Licensed under the Apache License, Version 2.0 (the "License");' ,
25+ 'you may not use this file except in compliance with the License.' ,
26+ 'You may obtain a copy of the License at' ,
27+ '' ,
28+ 'http://www.apache.org/licenses/LICENSE-2.0' ,
29+ '' ,
30+ 'Unless required by applicable law or agreed to in writing,' ,
31+ 'software distributed under the License is distributed on an "AS IS" BASIS,' ,
32+ 'WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.' ,
33+ 'See the License for the specific language governing permissions' ,
34+ 'and limitations under the License.' ,
35+ 'SPDX-License-Identifier: Apache-2.0' ,
36+ ]
37+
38+ llvm_license : list [str ] = [
39+ "===-{1,2} $FILE - .* -*\\ *- $LANG -\\ *-===" ,
40+ '' ,
41+ 'This file is licensed under the Apache License v2.0 with LLVM Exceptions.' ,
42+ 'See https://llvm.org/LICENSE.txt for license information.' ,
43+ 'SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception' ,
44+ '' ,
45+ "===-*===" ,
46+ ]
47+
48+ def check_license (filepath : str , license : list [str ], var : Dict [str , str ], re_line : Set [int ]):
49+ with open (filepath , 'r' ) as f :
50+ idx : int = 0
51+ for line in f .readlines ():
52+ lic : str = license [idx ]
53+ # replace the variable defined in license
54+ for k , v in var .items ():
55+ lic = lic .replace (k , v )
56+ if idx in re_line :
57+ if re .search (lic , line ) is not None and ("RE_WIDTH" not in var or int (var ["RE_WIDTH" ]) + 1 == len (line )):
58+ idx += 1
59+ elif line .find (lic ) != - 1 :
60+ idx += 1
61+ if idx == len (license ):
62+ return True
63+ return False
64+
65+ def fix_intel_license (var : Dict [str , str ]):
66+ lang : str = var ['$LANG' ]
67+ cmt : str = "" # comment char
68+ if lang == "C\\ +\\ +" :
69+ print ("/*" )
70+ cmt = " *"
71+ elif lang == "cmake" or lang == "Python" :
72+ print ("#" * WIDTH )
73+ cmt = "#"
74+ print ('%s Copyright (C) %s Intel Corporation' % (cmt , var ['$YEAR' ]))
75+ for i in range (1 , len (intel_license )):
76+ print ('%s %s' % (cmt , intel_license [i ]))
77+ if var ['$LANG' ] == "C\\ +\\ +" :
78+ print (" */" )
79+ elif lang == "cmake" or lang == "Python" :
80+ print ("#" * WIDTH )
81+
82+ def fix_llvm_license (var : Dict [str , str ]):
83+ lang : str = var ['$LANG' ]
84+ cmt : str = "//" # comment char
85+ if lang == "Python" :
86+ cmt = "#"
87+ elif lang == "C\\ +\\ +" :
88+ lang = "C++"
89+
90+ part1 = "%s===-- %s - DESC " % (cmt , var ['$FILE' ])
91+ part3 = "-*- %s -*-===%s" % (lang , cmt )
92+ part2 = "-" * (WIDTH - len (part1 ) - len (part3 ))
93+
94+ print (part1 + part2 + part3 )
95+ for i in range (1 , len (llvm_license ) - 1 ):
96+ print (cmt + " " + llvm_license [i ])
97+ part1 = cmt + "==="
98+ part3 = "===" + cmt
99+ part2 = "-" * (WIDTH - len (part1 ) - len (part3 ))
100+ print (part1 + part2 + part3 )
101+
102+ def use_llvm_license (path : str ) -> bool :
103+ for folder in ["lib/gc/" , 'include/gc/' , 'unittests/' ]:
104+ if path .startswith (folder ) or path .startswith ('./' + folder ):
105+ return True
106+ return False
107+
108+ year : int = datetime .datetime .now ().year
109+ success : bool = True
110+
111+ parser = argparse .ArgumentParser (prog = "benchgc license checker" )
112+ parser .add_argument ("--files" , required = True , type = str , help = "comma seperated file list" )
113+ args = parser .parse_args ()
114+
115+ for filepath in args .files .split (',' ):
116+ name : str = filepath .split ('/' )[- 1 ]
117+ var : Dict [str , str ] = {}
118+ re_line : Set [int ] = set ()
119+
120+ lic = list [str ]
121+
122+ if filepath .startswith ("test/" ) or filepath .startswith ("./test/" ):
123+ continue
124+
125+ if name .endswith (".py" ):
126+ var ['$LANG' ] = "Python"
127+ else :
128+ for suffix in [".c" , ".cpp" , ".h" , ".hpp" ]:
129+ if name .endswith (suffix ):
130+ var ['$LANG' ] = "C\\ +\\ +"
131+
132+ is_llvm_license = use_llvm_license (filepath )
133+ if is_llvm_license :
134+ # llvm license, only check python/cpp now
135+ lic = llvm_license
136+ re_line .add (0 )
137+ re_line .add (6 )
138+ var ['$FILE' ] = name
139+ # the line we read contains a '\n' character, so the expected length should be 81
140+ var ['RE_WIDTH' ] = str (WIDTH )
141+ if name .endswith (".td" ):
142+ var ['$LANG' ] = "tablegen"
143+ else :
144+ # intel license
145+ lic = intel_license
146+ re_line .add (0 )
147+ var ['$YEAR' ] = str (year )
148+ if name == "CMakeLists.txt" :
149+ var ['$LANG' ] = "cmake"
150+
151+ if "$LANG" not in var :
152+ continue
153+ if not check_license (filepath , lic , var , re_line ):
154+ success = False
155+ print ("Fail : %s" % filepath )
156+ print ("Fix license :" )
157+ if is_llvm_license :
158+ fix_llvm_license (var )
159+ else :
160+ fix_intel_license (var )
161+ else :
162+ print ("Success : %s" % filepath )
163+
164+ sys .exit (0 if success else 1 )
0 commit comments