未验证 提交 4237fefe 编写于 作者: G gongweibao 提交者: GitHub

Add shellcheck tools and modify copyright hook (#27722)

上级 af57537e
...@@ -48,5 +48,12 @@ repos: ...@@ -48,5 +48,12 @@ repos:
name: copyright_checker name: copyright_checker
entry: python ./tools/codestyle/copyright.hook entry: python ./tools/codestyle/copyright.hook
language: system language: system
files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|proto|py)$ files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|proto|py|sh)$
exclude: (?!.*third_party)^.*$ | (?!.*book)^.*$ exclude: (?!.*third_party)^.*$ | (?!.*book)^.*$
- repo: local
hooks:
- id: shellcheck
name: shellcheck
entry: shellcheck
language: system
files: .sh$
#!/bin/bash
# Copyright (c) 2020 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.
set -x set -x
cd `dirname $0` cd "$(dirname "$0")"
rm -rf build/ rm -rf build/
set +x set +x
# Copyright (c) 2020 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.
from __future__ import absolute_import from __future__ import absolute_import
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
import argparse import argparse
import io, re import io
import sys, os import re
import subprocess import sys
import platform import os
import datetime
COPYRIGHT = ''' COPYRIGHT = '''Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
...@@ -21,74 +35,80 @@ Unless required by applicable law or agreed to in writing, software ...@@ -21,74 +35,80 @@ Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.'''
'''
LANG_COMMENT_MARK = None def _generate_copyright(comment_mark):
copyright=COPYRIGHT.split(os.linesep)
header = copyright[0].rstrip()
NEW_LINE_MARK = None p = re.search('(\d{4})', header).group(0)
now = datetime.datetime.now()
COPYRIGHT_HEADER = None header = header.replace(p,str(now.year))
if platform.system() == "Windows": ans=[comment_mark + " " + header + os.linesep]
NEW_LINE_MARK = "\r\n" for idx, line in enumerate(copyright[1:]):
else: ans.append(comment_mark + " " + line.rstrip() + os.linesep)
NEW_LINE_MARK = '\n'
COPYRIGHT_HEADER = COPYRIGHT.split(NEW_LINE_MARK)[1]
p = re.search('(\d{4})', COPYRIGHT_HEADER).group(0)
process = subprocess.Popen(["date", "+%Y"], stdout=subprocess.PIPE)
date, err = process.communicate()
date = date.decode("utf-8").rstrip("\n")
COPYRIGHT_HEADER = COPYRIGHT_HEADER.replace(p, date)
return ans
def generate_copyright(template, lang='C'): def _get_comment_mark(path):
if lang == 'Python': lang_type=re.compile(r"\.(py|sh)$")
LANG_COMMENT_MARK = '#' if lang_type.search(path) is not None:
else: return "#"
LANG_COMMENT_MARK = "//"
lang_type=re.compile(r"\.(h|c|hpp|cc|cpp|cu|go|cuh|proto)$")
lines = template.split(NEW_LINE_MARK) if lang_type.search(path) is not None:
BLANK = " " return "//"
ans = LANG_COMMENT_MARK + BLANK + COPYRIGHT_HEADER + NEW_LINE_MARK
for lino, line in enumerate(lines): return None
if lino == 0 or lino == 1 or lino == len(lines) - 1: continue
if len(line) == 0:
BLANK = "" RE_ENCODE = re.compile(r"^[ \t\v]*#.*?coding[:=]", re.IGNORECASE)
else: RE_COPYRIGHT = re.compile(r".*Copyright \(c\) \d{4}", re.IGNORECASE)
BLANK = " " RE_SHEBANG = re.compile(r"^[ \t\v]*#[ \t]?\!")
ans += LANG_COMMENT_MARK + BLANK + line + NEW_LINE_MARK
def _check_copyright(path):
return ans + "\n" head=[]
try:
with open(path) as f:
def lang_type(filename): head = [next(f) for x in range(4)]
if filename.endswith(".py"): except StopIteration:
return "Python" pass
elif filename.endswith(".h"):
return "C" for idx, line in enumerate(head):
elif filename.endswith(".c"): if RE_COPYRIGHT.search(line) is not None:
return "C" return True
elif filename.endswith(".hpp"):
return "C" return False
elif filename.endswith(".cc"):
return "C" def generate_copyright(path, comment_mark):
elif filename.endswith(".cpp"): original_contents = io.open(path, encoding="utf-8").readlines()
return "C" head = original_contents[0:4]
elif filename.endswith(".cu"):
return "C" insert_line_no=0
elif filename.endswith(".cuh"): for i, line in enumerate(head):
return "C" if RE_ENCODE.search(line) or RE_SHEBANG.search(line):
elif filename.endswith(".go"): insert_line_no=i+1
return "C"
elif filename.endswith(".proto"): copyright = _generate_copyright(comment_mark)
return "C" 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: else:
print("Unsupported filetype %s", filename) new_contents=original_contents[0:insert_line_no]
exit(0) 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)
PYTHON_ENCODE = re.compile("^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)")
def main(argv=None): def main(argv=None):
...@@ -98,23 +118,16 @@ def main(argv=None): ...@@ -98,23 +118,16 @@ def main(argv=None):
args = parser.parse_args(argv) args = parser.parse_args(argv)
retv = 0 retv = 0
for filename in args.filenames: for path in args.filenames:
fd = io.open(filename, encoding="utf-8") comment_mark = _get_comment_mark(path)
first_line = fd.readline() if comment_mark is None:
second_line = fd.readline() print("warning:Unsupported file", path, file=sys.stderr)
if "COPYRIGHT (C)" in first_line.upper(): continue
if first_line.startswith("#!") or PYTHON_ENCODE.match(
second_line) != None or PYTHON_ENCODE.match(first_line) != None:
continue continue
original_contents = io.open(filename, encoding="utf-8").read()
new_contents = generate_copyright( if _check_copyright(path):
COPYRIGHT, lang_type(filename)) + original_contents continue
print('Auto Insert Copyright Header {}'.format(filename))
retv = 1 generate_copyright(path, comment_mark)
with io.open(filename, 'w') as output_file:
output_file.write(new_contents)
return retv
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -29,7 +29,7 @@ RUN apt-get update && \ ...@@ -29,7 +29,7 @@ RUN apt-get update && \
python-matplotlib \ python-matplotlib \
automake locales clang-format swig \ automake locales clang-format swig \
liblapack-dev liblapacke-dev \ liblapack-dev liblapacke-dev \
net-tools libtool module-init-tools && \ net-tools libtool module-init-tools shellcheck && \
apt-get clean -y apt-get clean -y
# Downgrade gcc&&g++ # Downgrade gcc&&g++
......
...@@ -26,7 +26,7 @@ RUN rm -rf /temp_gcc82 && rm -rf /gcc-8.2.0.tar.xz && rm -rf /gcc-8.2.0 ...@@ -26,7 +26,7 @@ RUN rm -rf /temp_gcc82 && rm -rf /gcc-8.2.0.tar.xz && rm -rf /gcc-8.2.0
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \ apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev openmpi-bin openmpi-doc libopenmpi-dev xz-utils tk-dev libffi-dev liblzma-dev openmpi-bin openmpi-doc libopenmpi-dev shellcheck
# gcc8.2 # gcc8.2
RUN wget -q https://paddle-docker-tar.bj.bcebos.com/home/users/tianshuo/bce-python-sdk-0.8.27/gcc-8.2.0.tar.xz && \ RUN wget -q https://paddle-docker-tar.bj.bcebos.com/home/users/tianshuo/bce-python-sdk-0.8.27/gcc-8.2.0.tar.xz && \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册