tools/check-license-header.py (43 lines of code) (raw):

# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import os import sys ignored_chars = '#\n \t:/**/' license_header = ' '.join( [ line.strip(ignored_chars) for line in """ # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # """.splitlines() ] ).strip(ignored_chars) comment_leading_chars = ('#', '::', '/*', '*', ' ') exclude_dirs = ('.git', 'lib', 'node_modules', 'release', '.idea', 'license') exclude_files = ('.md', '.DS_Store', 'NOTICE', 'LICENSE', '.gitignore', 'package.json', 'package-lock.json', '.prettierrc') def walk_through_dir(d) -> bool: checked = True for root, sub_dirs, files in os.walk(d): ignore = False for exclude_dir in exclude_dirs: if exclude_dir in root: ignore = True break if ignore: continue for filename in files: file_path = os.path.join(root, filename) ignore = False for exclude_file in exclude_files: if filename.endswith(exclude_file): ignore = True if ignore: continue with open(file_path, 'r') as f: header = ' '.join([ line.strip(ignored_chars) for line in f.readlines() if line.startswith(comment_leading_chars) ]).strip() print('%s license header in file: %s' % ('✅' if license_header in header else '❌', file_path)) checked &= license_header in header return checked if __name__ == "__main__": checked = True for _, directory in enumerate(sys.argv): checked &= walk_through_dir(directory) if not checked: sys.exit(1)