1#! /usr/bin/env sh 2 3# Copyright The Mbed TLS Contributors 4# SPDX-License-Identifier: Apache-2.0 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); you may 7# not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17 18# Purpose: check Python files for potential programming errors or maintenance 19# hurdles. Run pylint to detect some potential mistakes and enforce PEP8 20# coding standards. If available, run mypy to perform static type checking. 21 22# We'll keep going on errors and report the status at the end. 23ret=0 24 25if type python3 >/dev/null 2>/dev/null; then 26 PYTHON=python3 27else 28 PYTHON=python 29fi 30 31check_version () { 32 $PYTHON - "$2" <<EOF 33import packaging.version 34import sys 35import $1 as package 36actual = package.__version__ 37wanted = sys.argv[1] 38if packaging.version.parse(actual) < packaging.version.parse(wanted): 39 sys.stderr.write("$1: version %s is too old (want %s)\n" % (actual, wanted)) 40 exit(1) 41EOF 42} 43 44can_pylint () { 45 # Pylint 1.5.2 from Ubuntu 16.04 is too old: 46 # E: 34, 0: Unable to import 'mbedtls_dev' (import-error) 47 # Pylint 1.8.3 from Ubuntu 18.04 passed on the first commit containing this line. 48 check_version pylint 1.8.3 49} 50 51can_mypy () { 52 # mypy 0.770 is too old: 53 # tests/scripts/test_psa_constant_names.py:34: error: Cannot find implementation or library stub for module named 'mbedtls_dev' 54 # mypy 0.780 from pip passed on the first commit containing this line. 55 check_version mypy.version 0.780 56} 57 58# With just a --can-xxx option, check whether the tool for xxx is available 59# with an acceptable version, and exit without running any checks. The exit 60# status is true if the tool is available and acceptable and false otherwise. 61if [ "$1" = "--can-pylint" ]; then 62 can_pylint 63 exit 64elif [ "$1" = "--can-mypy" ]; then 65 can_mypy 66 exit 67fi 68 69echo 'Running pylint ...' 70$PYTHON -m pylint -j 2 scripts/mbedtls_dev/*.py scripts/*.py tests/scripts/*.py || { 71 echo >&2 "pylint reported errors" 72 ret=1 73} 74 75# Check types if mypy is available 76if can_mypy; then 77 echo 78 echo 'Running mypy ...' 79 $PYTHON -m mypy scripts/*.py tests/scripts/*.py || 80 ret=1 81fi 82 83exit $ret 84