blob: 449803a543010b3de14d1195a14f4f3ff06f1a54 [file] [log] [blame]
Mohammad Azim Khan21798102018-07-06 00:41:08 +01001#! /usr/bin/env sh
2
Bence Szépkúti1e148272020-08-07 13:07:28 +02003# Copyright The Mbed TLS Contributors
Bence Szépkútic7da1fe2020-05-26 01:54:15 +02004# 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.
Gilles Peskine7be45512020-08-12 02:31:02 +020017
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
Mohammad Azim Khan21798102018-07-06 00:41:08 +010024
Gilles Peskine56e99d62020-03-24 15:07:57 +010025if type python3 >/dev/null 2>/dev/null; then
26 PYTHON=python3
Simon Butchere30d03e2020-03-16 11:30:46 +000027else
Gilles Peskine56e99d62020-03-24 15:07:57 +010028 PYTHON=python
Simon Butchere30d03e2020-03-16 11:30:46 +000029fi
30
Gilles Peskinebdde5d02021-01-19 21:42:05 +010031check_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
Gilles Peskine1cc6a8e2021-01-06 17:02:33 +010044can_pylint () {
Gilles Peskine2991b5f2021-01-19 21:19:02 +010045 # Pylint 1.5.2 from Ubuntu 16.04 is too old:
46 # E: 34, 0: Unable to import 'mbedtls_dev' (import-error)
Gilles Peskine1cc6a8e2021-01-06 17:02:33 +010047 # Pylint 1.8.3 from Ubuntu 18.04 passed on the first commit containing this line.
Gilles Peskinebdde5d02021-01-19 21:42:05 +010048 check_version pylint 1.8.3
Gilles Peskine1cc6a8e2021-01-06 17:02:33 +010049}
50
51can_mypy () {
Gilles Peskine0370c172021-01-19 21:58:09 +010052 # 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
Gilles Peskine1cc6a8e2021-01-06 17:02:33 +010056}
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
Gilles Peskine6d82a7e2021-01-19 21:19:25 +010069echo 'Running pylint ...'
Gilles Peskineb13ed702020-12-11 00:58:48 +010070$PYTHON -m pylint -j 2 scripts/mbedtls_dev/*.py scripts/*.py tests/scripts/*.py || {
Gilles Peskine7be45512020-08-12 02:31:02 +020071 echo >&2 "pylint reported errors"
72 ret=1
73}
74
75# Check types if mypy is available
Gilles Peskinec3b17872021-01-19 21:43:24 +010076if can_mypy; then
Gilles Peskine7be45512020-08-12 02:31:02 +020077 echo
78 echo 'Running mypy ...'
Gilles Peskine4738b962021-01-19 21:45:32 +010079 $PYTHON -m mypy scripts/*.py tests/scripts/*.py ||
Gilles Peskine7be45512020-08-12 02:31:02 +020080 ret=1
81fi
82
83exit $ret