|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import absolute_import |
|
from __future__ import print_function |
|
from __future__ import unicode_literals |
|
|
|
import argparse |
|
import io |
|
import re |
|
import sys |
|
import os |
|
import datetime |
|
|
|
COPYRIGHT = '''Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. |
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); |
|
you may not use this file except in compliance with the License. |
|
You may obtain a copy of the License at |
|
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
Unless required by applicable law or agreed to in writing, software |
|
distributed under the License is distributed on an "AS IS" BASIS, |
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
See the License for the specific language governing permissions and |
|
limitations under the License.''' |
|
|
|
def _generate_copyright(comment_mark): |
|
copyright=COPYRIGHT.split(os.linesep) |
|
header = copyright[0].rstrip() |
|
|
|
p = re.search('(\d{4})', header).group(0) |
|
now = datetime.datetime.now() |
|
|
|
header = header.replace(p,str(now.year)) |
|
|
|
ans=[comment_mark + " " + header + os.linesep] |
|
for idx, line in enumerate(copyright[1:]): |
|
ans.append(comment_mark + " " + line.rstrip() + os.linesep) |
|
|
|
return ans |
|
|
|
def _get_comment_mark(path): |
|
lang_type=re.compile(r"\.(py|sh)$") |
|
if lang_type.search(path) is not None: |
|
return "#" |
|
|
|
lang_type=re.compile(r"\.(h|c|hpp|cc|cpp|cu|go|cuh|proto)$") |
|
if lang_type.search(path) is not None: |
|
return "//" |
|
|
|
return None |
|
|
|
|
|
RE_ENCODE = re.compile(r"^[ \t\v]*#.*?coding[:=]", re.IGNORECASE) |
|
RE_COPYRIGHT = re.compile(r".*Copyright( \(c\))* \d{4}", re.IGNORECASE) |
|
RE_SHEBANG = re.compile(r"^[ \t\v]*#[ \t]?\!") |
|
|
|
def _check_copyright(path): |
|
head=[] |
|
try: |
|
with open(path) as f: |
|
head = [next(f) for x in range(4)] |
|
except StopIteration: |
|
pass |
|
|
|
for idx, line in enumerate(head): |
|
if RE_COPYRIGHT.search(line) is not None: |
|
return True |
|
|
|
return False |
|
|
|
def generate_copyright(path, comment_mark): |
|
original_contents = io.open(path, encoding="utf-8").readlines() |
|
head = original_contents[0:4] |
|
|
|
insert_line_no=0 |
|
for i, line in enumerate(head): |
|
if RE_ENCODE.search(line) or RE_SHEBANG.search(line): |
|
insert_line_no=i+1 |
|
|
|
copyright = _generate_copyright(comment_mark) |
|
if insert_line_no == 0: |
|
new_contents = copyright |
|
if len(original_contents) > 0 and len(original_contents[0].strip()) != 0: |
|
new_contents.append(os.linesep) |
|
new_contents.extend(original_contents) |
|
else: |
|
new_contents=original_contents[0:insert_line_no] |
|
new_contents.append(os.linesep) |
|
new_contents.extend(copyright) |
|
if len(original_contents) > insert_line_no and len(original_contents[insert_line_no].strip()) != 0: |
|
new_contents.append(os.linesep) |
|
new_contents.extend(original_contents[insert_line_no:]) |
|
new_contents="".join(new_contents) |
|
|
|
with io.open(path, 'w') as output_file: |
|
output_file.write(new_contents) |
|
|
|
|
|
|
|
def main(argv=None): |
|
parser = argparse.ArgumentParser( |
|
description='Checker for copyright declaration.') |
|
parser.add_argument('filenames', nargs='*', help='Filenames to check') |
|
args = parser.parse_args(argv) |
|
|
|
retv = 0 |
|
for path in args.filenames: |
|
comment_mark = _get_comment_mark(path) |
|
if comment_mark is None: |
|
print("warning:Unsupported file", path, file=sys.stderr) |
|
continue |
|
|
|
if _check_copyright(path): |
|
continue |
|
|
|
generate_copyright(path, comment_mark) |
|
|
|
|
|
if __name__ == '__main__': |
|
exit(main()) |