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