#!/usr/bin/python # ========================================================================== # # Copyright NumFOCUS # # Licensed 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 # # https://www.apache.org/licenses/LICENSE-2.0.txt # # 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. # # ==========================================================================*/ # # \author Hans J. Johnson # # This script is designed to help change the copyright notices in all ITK files to a common format. # For files that are .h, .cxx, .hxx, .c, if there is no other copyright information, add the itkCopyright. import re import sys import os ## New license as specified on: https://itk.org/Wiki/ITK_Release_4/Licensing NewITKCopyrightNotice = """/*========================================================================= * * Copyright NumFOCUS * * Licensed 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 * * https://www.apache.org/licenses/LICENSE-2.0.txt * * 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. * *=========================================================================*/ """ NewVTKDependantCopyrightNotice = """/*========================================================================= * * Portions of this file are subject to the VTK Toolkit Version 3 copyright. * * Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen * * For complete copyright, license and disclaimer of warranty information * please refer to the NOTICE file at the top of the ITK source tree. * *=========================================================================*/ """ ## Patterns that match the old copyright notice sections ## ITK only copyright ITKOnlyOldHeader = """ */\\* *==.*Program:.*Insight Segmentation & Registration Toolkit.*Copyright .* Insight.*Consortium. All rights reserved.*See ITKCopyright.txt or https://www.itk.org/HTML/Copyright.htm for details.[\n\r ]*This software is distributed WITHOUT ANY WARRANTY; without even.*the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR.*PURPOSE. See the above copyright notices for more information.*=== *\\*/[\n\r ]*""" ITKOnlyOldRE = re.compile(ITKOnlyOldHeader, re.MULTILINE | re.DOTALL | re.IGNORECASE) ## Files that originated in VTK, and now have ITK also ITKVTKOldHeader = """ */\\* *==.*Program:.*Insight Segmentation & Registration Toolkit.*Copyright .* Insight Software Consortium. All rights reserved.*See ITKCopyright.txt or https://www.itk.org/HTML/Copyright.htm for details.[\n\r ]*.*VTKCopyright.txt.*This software is distributed WITHOUT ANY WARRANTY; without even.*the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR.*PURPOSE. See the above copyright notices for more information.*=== *\\*/[\n\r ]*""" ITKVTKOldRE = re.compile(ITKVTKOldHeader, re.MULTILINE | re.DOTALL | re.IGNORECASE) ## Looking for new files. NewITKHeader = ( r""" */\* *==.*https://www.apache.org/licenses/LICENSE-2.0.txt.*=== *\*/""" ) NewITKHeaderRE = re.compile(NewITKHeader, re.MULTILINE | re.DOTALL | re.IGNORECASE) eolSpaceRemove = re.compile(r" *$", re.MULTILINE) ## The exception list contains files that should not have the ITK copyright notices added. ExclusionList = ["Utilities", ".git"] ExtensionsThatNeedCopyright = [".cxx", ".c", ".h", ".hxx"] ############ ############ ############ ############ ############ ############ ############ if len(sys.argv) != 2: print(f"USAGE: {sys.argv[0]} ") sys.exit(-1) HeadOfITKTree = sys.argv[1] for top, directory, files in os.walk(HeadOfITKTree): ## First remove Excluded directories for dd in directory: if dd[0] == ".": # Skip all directories that begin with '.' directory.remove(dd) continue if dd in ExclusionList: directory.remove(dd) continue ## Now process each file for ff in files: if ff in ExclusionList: files.remove(ff) continue if ff[0] == ".": # Skip all files that begin with '.' files.remove(ff) # print("@@@@@@@",ff) continue currFile = os.path.join(top, ff) print(currFile) infile = open(currFile) file_text = infile.read() newstring = ( file_text # default output to input, just in case all search patterns fail ) infile.close() substitutionMade = 0 testITKOnlySearch = ITKOnlyOldRE.search(file_text) if testITKOnlySearch: print(f"{currFile} is ITKOnlyHeader") newstring = ITKOnlyOldRE.sub(NewITKCopyrightNotice, file_text) newstring = eolSpaceRemove.sub( "", newstring ) ## a few files still have eol spaces substitutionMade = 1 testITKVTKSearch = ITKVTKOldRE.search(file_text) if testITKVTKSearch: print(f"{currFile} is VTKITKHeader") newstring = ITKVTKOldRE.sub( NewITKCopyrightNotice + NewVTKDependantCopyrightNotice, file_text ) newstring = eolSpaceRemove.sub( "", newstring ) ## a few files still have eol spaces substitutionMade = 1 ##Add new copyright if it had not already existed. root, ext = os.path.splitext(currFile) if ext in ExtensionsThatNeedCopyright: testNewITKHeaderRE = NewITKHeaderRE.search( file_text ) # see if new CopyRight notice already exists. if testNewITKHeaderRE: print(f"Already Processed {currFile}") elif substitutionMade == 0: print(f"{currFile} needed copyright header.") newstring = NewITKCopyrightNotice + file_text newstring = eolSpaceRemove.sub( "", newstring ) ## a few files still have eol spaces outfile = open(currFile, "w") outfile.write(newstring) outfile.close()