'''
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, _, 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])
