tools/license/insert_license.py (79 lines of code) (raw):

#!/usr/bin/env python3 import os import argparse import re new_header = """/* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. 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. */ """ licensed_to_pattern = re.compile(r'Licensed to Elasticsearch B\.V\.', re.IGNORECASE) header_start_pattern = re.compile(r'^(/\*|//)') header_end_pattern = re.compile(r'\*/') php_tag_pattern = re.compile(r'<\?php') def find_header_end(lines): for i, line in enumerate(lines): if header_end_pattern.search(line): return i return -1 def find_header_start(lines): for i, line in enumerate(lines): if header_start_pattern.search(line): return i return -1 def find_php_tag(lines): for i, line in enumerate(lines): if php_tag_pattern.search(line): return i return -1 def replace_header(content, php_file): lines = content.splitlines(True) header_end_index = find_header_end(lines) header_start_index = find_header_start(lines) if header_start_index != -1: content = "".join(lines[0:header_start_index]) # if len(content) > 0: # content += "\n" content += new_header if header_end_index != -1: content += "".join(lines[header_end_index + 1:]) return content def file_contains_license(filepath): with open(filepath, 'r') as file: in_comment_block = False for line in file: stripped_line = line.strip() if not stripped_line: continue if header_start_pattern.match(stripped_line): in_comment_block = True if in_comment_block: if licensed_to_pattern.search(stripped_line): return True if header_end_pattern.search(stripped_line): in_comment_block = False return False def insert_license(content, php_file): if php_file: lines = content.splitlines() tag_start = find_php_tag(lines) print(tag_start) content = "\n".join(lines[0:tag_start + 1]) content += "\n\n" + new_header content += "\n".join(lines[tag_start + 1:]) return content else: return new_header + "\n" + content def add_header_to_files(directory, extensions): for root, _, files in os.walk(directory): for filename in files: if any(filename.endswith("." + ext) for ext in extensions): filepath = os.path.join(root, filename) with open(filepath, 'r') as file: content = file.read() php_file = filepath.endswith(".php") if file_contains_license(filepath): content = replace_header(content, php_file) else: content = insert_license(content, php_file) with open(filepath, 'w') as file: file.write(content) if __name__ == "__main__": parser = argparse.ArgumentParser(description='Add or replace header in files.') parser.add_argument('directory', type=str, help='The directory to process.') parser.add_argument('extensions', type=str, nargs='+', help='List of file extensions to process, e.g., cpp h hpp') args = parser.parse_args() add_header_to_files(args.directory, args.extensions)