1*c8dee2aaSAndroid Build Coastguard Worker''' 2*c8dee2aaSAndroid Build Coastguard WorkerCopyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard WorkerUse of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Workerfound in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker''' 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker''' 9*c8dee2aaSAndroid Build Coastguard WorkerUpdates all copyright headers within our code: 10*c8dee2aaSAndroid Build Coastguard Worker- For files that already have a copyright header, the header is modified 11*c8dee2aaSAndroid Build Coastguard Worker while keeping the year and holder intact. 12*c8dee2aaSAndroid Build Coastguard Worker- For files that don't have a copyright header, we add one with the current 13*c8dee2aaSAndroid Build Coastguard Worker year and default holder. 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker@author: [email protected] 16*c8dee2aaSAndroid Build Coastguard Worker''' 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Workerfrom __future__ import print_function 20*c8dee2aaSAndroid Build Coastguard Workerimport os 21*c8dee2aaSAndroid Build Coastguard Workerimport sys 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Workerimport fileparser 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker# Only modify copyright stanzas if the copyright holder is one of these. 27*c8dee2aaSAndroid Build Coastguard WorkerALLOWED_COPYRIGHT_HOLDERS = [ 28*c8dee2aaSAndroid Build Coastguard Worker 'Google Inc.', 29*c8dee2aaSAndroid Build Coastguard Worker 'Skia', 30*c8dee2aaSAndroid Build Coastguard Worker 'The Android Open Source Project', 31*c8dee2aaSAndroid Build Coastguard Worker] 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Workerdef Main(root_directory): 34*c8dee2aaSAndroid Build Coastguard Worker """Run everything. 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker @param root_directory root directory within which to modify all files 37*c8dee2aaSAndroid Build Coastguard Worker """ 38*c8dee2aaSAndroid Build Coastguard Worker filepaths = GetAllFilepaths(root_directory) 39*c8dee2aaSAndroid Build Coastguard Worker for filepath in filepaths: 40*c8dee2aaSAndroid Build Coastguard Worker parser = fileparser.CreateParser(filepath) 41*c8dee2aaSAndroid Build Coastguard Worker if not parser: 42*c8dee2aaSAndroid Build Coastguard Worker ReportWarning('cannot find a parser for file %s, skipping...' % 43*c8dee2aaSAndroid Build Coastguard Worker filepath) 44*c8dee2aaSAndroid Build Coastguard Worker continue 45*c8dee2aaSAndroid Build Coastguard Worker old_file_contents = ReadFileIntoString(filepath) 46*c8dee2aaSAndroid Build Coastguard Worker comment_blocks = parser.FindAllCommentBlocks(old_file_contents) 47*c8dee2aaSAndroid Build Coastguard Worker if not comment_blocks: 48*c8dee2aaSAndroid Build Coastguard Worker ReportWarning('cannot find any comment blocks in file %s' % 49*c8dee2aaSAndroid Build Coastguard Worker filepath) 50*c8dee2aaSAndroid Build Coastguard Worker old_copyright_block = parser.FindCopyrightBlock(comment_blocks) 51*c8dee2aaSAndroid Build Coastguard Worker if not old_copyright_block: 52*c8dee2aaSAndroid Build Coastguard Worker ReportWarning('cannot find copyright block in file %s' % filepath) 53*c8dee2aaSAndroid Build Coastguard Worker (year, holder) = parser.GetCopyrightBlockAttributes(old_copyright_block) 54*c8dee2aaSAndroid Build Coastguard Worker if holder and not ConfirmAllowedCopyrightHolder(holder): 55*c8dee2aaSAndroid Build Coastguard Worker ReportWarning( 56*c8dee2aaSAndroid Build Coastguard Worker 'unrecognized copyright holder "%s" in file %s, skipping...' % ( 57*c8dee2aaSAndroid Build Coastguard Worker holder, filepath)) 58*c8dee2aaSAndroid Build Coastguard Worker continue 59*c8dee2aaSAndroid Build Coastguard Worker new_copyright_block = parser.CreateCopyrightBlock(year, holder) 60*c8dee2aaSAndroid Build Coastguard Worker if old_copyright_block: 61*c8dee2aaSAndroid Build Coastguard Worker new_file_contents = old_file_contents.replace( 62*c8dee2aaSAndroid Build Coastguard Worker old_copyright_block, new_copyright_block, 1) 63*c8dee2aaSAndroid Build Coastguard Worker else: 64*c8dee2aaSAndroid Build Coastguard Worker new_file_contents = new_copyright_block + old_file_contents 65*c8dee2aaSAndroid Build Coastguard Worker WriteStringToFile(new_file_contents, filepath) 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Workerdef GetAllFilepaths(root_directory): 69*c8dee2aaSAndroid Build Coastguard Worker """Return a list of all files (absolute path for each one) within a tree. 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker @param root_directory root directory within which to find all files 72*c8dee2aaSAndroid Build Coastguard Worker """ 73*c8dee2aaSAndroid Build Coastguard Worker path_list = [] 74*c8dee2aaSAndroid Build Coastguard Worker for dirpath, _, filenames in os.walk(root_directory): 75*c8dee2aaSAndroid Build Coastguard Worker for filename in filenames: 76*c8dee2aaSAndroid Build Coastguard Worker path_list.append(os.path.abspath(os.path.join(dirpath, filename))) 77*c8dee2aaSAndroid Build Coastguard Worker return path_list 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Workerdef ReportWarning(text): 81*c8dee2aaSAndroid Build Coastguard Worker """Report a warning, but continue. 82*c8dee2aaSAndroid Build Coastguard Worker """ 83*c8dee2aaSAndroid Build Coastguard Worker print('warning: %s' % text) 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Workerdef ReportError(text): 87*c8dee2aaSAndroid Build Coastguard Worker """Report an error and raise an exception. 88*c8dee2aaSAndroid Build Coastguard Worker """ 89*c8dee2aaSAndroid Build Coastguard Worker raise IOError(text) 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Workerdef ReadFileIntoString(filepath): 93*c8dee2aaSAndroid Build Coastguard Worker """Returns the full contents of this file as a string. 94*c8dee2aaSAndroid Build Coastguard Worker """ 95*c8dee2aaSAndroid Build Coastguard Worker with open(filepath, 'r') as file_handle: 96*c8dee2aaSAndroid Build Coastguard Worker contents = file_handle.read() 97*c8dee2aaSAndroid Build Coastguard Worker return contents 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Workerdef WriteStringToFile(string, filepath): 101*c8dee2aaSAndroid Build Coastguard Worker """Writes this string out to filepath, replacing the file if it already 102*c8dee2aaSAndroid Build Coastguard Worker exists. 103*c8dee2aaSAndroid Build Coastguard Worker """ 104*c8dee2aaSAndroid Build Coastguard Worker with open(filepath, 'w') as file_handle: 105*c8dee2aaSAndroid Build Coastguard Worker file_handle.write(string) 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Workerdef ConfirmAllowedCopyrightHolder(holder): 109*c8dee2aaSAndroid Build Coastguard Worker """Returns True if this is one of our allowed copyright holders. 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker @param holder copyright holder as a string 112*c8dee2aaSAndroid Build Coastguard Worker """ 113*c8dee2aaSAndroid Build Coastguard Worker return holder in ALLOWED_COPYRIGHT_HOLDERS 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard WorkerMain(sys.argv[1]) 117