| ''' |
| Copyright 2011 Google Inc. |
| |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| ''' |
| |
| ''' |
| Updates all copyright headers within our code: |
| - For files that already have a copyright header, the header is modified |
| while keeping the year and holder intact. |
| - For files that don't have a copyright header, we add one with the current |
| year and default holder. |
| |
| @author: epoger@google.com |
| ''' |
| |
| import os |
| import sys |
| |
| import fileparser |
| |
| # Only modify copyright stanzas if the copyright holder is one of these. |
| ALLOWED_COPYRIGHT_HOLDERS = [ |
| 'Google Inc.', |
| 'Skia', |
| 'The Android Open Source Project', |
| ] |
| |
| def Main(root_directory): |
| """Run everything. |
| |
| @param root_directory root directory within which to modify all files |
| """ |
| filepaths = GetAllFilepaths(root_directory) |
| for filepath in filepaths: |
| parser = fileparser.CreateParser(filepath) |
| if not parser: |
| ReportWarning('cannot find a parser for file %s, skipping...' % |
| filepath) |
| continue |
| old_file_contents = ReadFileIntoString(filepath) |
| comment_blocks = parser.FindAllCommentBlocks(old_file_contents) |
| if not comment_blocks: |
| ReportWarning('cannot find any comment blocks in file %s' % |
| filepath) |
| old_copyright_block = parser.FindCopyrightBlock(comment_blocks) |
| if not old_copyright_block: |
| ReportWarning('cannot find copyright block in file %s' % filepath) |
| (year, holder) = parser.GetCopyrightBlockAttributes(old_copyright_block) |
| if holder and not ConfirmAllowedCopyrightHolder(holder): |
| ReportWarning( |
| 'unrecognized copyright holder "%s" in file %s, skipping...' % ( |
| holder, filepath)) |
| continue |
| new_copyright_block = parser.CreateCopyrightBlock(year, holder) |
| if old_copyright_block: |
| new_file_contents = old_file_contents.replace( |
| old_copyright_block, new_copyright_block, 1) |
| else: |
| new_file_contents = new_copyright_block + old_file_contents |
| WriteStringToFile(new_file_contents, filepath) |
| |
| def GetAllFilepaths(root_directory): |
| """Return a list of all files (absolute path for each one) within a tree. |
| |
| @param root_directory root directory within which to find all files |
| """ |
| path_list = [] |
| for dirpath, dirnames, filenames in os.walk(root_directory): |
| for filename in filenames: |
| path_list.append(os.path.abspath(os.path.join(dirpath, filename))) |
| return path_list |
| |
| def ReportWarning(text): |
| """Report a warning, but continue. |
| """ |
| print 'warning: %s' % text |
| |
| def ReportError(text): |
| """Report an error and raise an exception. |
| """ |
| raise IOError(text) |
| |
| def ReadFileIntoString(filepath): |
| """Returns the full contents of this file as a string. |
| """ |
| with open(filepath, 'r') as file_handle: |
| contents = file_handle.read() |
| return contents |
| |
| def WriteStringToFile(string, filepath): |
| """Writes this string out to filepath, replacing the file if it already |
| exists. |
| """ |
| with open(filepath, 'w') as file_handle: |
| file_handle.write(string) |
| |
| def ConfirmAllowedCopyrightHolder(holder): |
| """Returns True if this is one of our allowed copyright holders. |
| |
| @param holder copyright holder as a string |
| """ |
| return holder in ALLOWED_COPYRIGHT_HOLDERS |
| |
| |
| Main(sys.argv[1]) |