xref: /aosp_15_r20/external/skia/tools/copyright/main.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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