935d94500d
Created to implement http://codereview.appspot.com/4816058/ ('Automatic update of all copyright notices to reflect new license terms.') We can also use this to periodically clean up our code headers. Review URL: http://codereview.appspot.com/4800055 git-svn-id: http://skia.googlecode.com/svn/trunk@1983 2bbb7eff-a529-9590-31e7-b0007b416f81
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
'''
|
|
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])
|