blob: d82ea746c66b941477c770a12f6fe2e8574e2ade [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 () {
52 # Just check that mypy is present and looks sane. I don't know what
53 # minimum version is required. The check is not just "type mypy"
Gilles Peskine2991b5f2021-01-19 21:19:02 +010054 # because that passes if a mypy exists but is not installed for the current
Gilles Peskine1cc6a8e2021-01-06 17:02:33 +010055 # python version.
56 mypy --version 2>/dev/null >/dev/null
57}
58
59# With just a --can-xxx option, check whether the tool for xxx is available
60# with an acceptable version, and exit without running any checks. The exit
61# status is true if the tool is available and acceptable and false otherwise.
62if [ "$1" = "--can-pylint" ]; then
63 can_pylint
64 exit
65elif [ "$1" = "--can-mypy" ]; then
66 can_mypy
67 exit
68fi
69
Gilles Peskine6d82a7e2021-01-19 21:19:25 +010070echo 'Running pylint ...'
Gilles Peskineb13ed702020-12-11 00:58:48 +010071$PYTHON -m pylint -j 2 scripts/mbedtls_dev/*.py scripts/*.py tests/scripts/*.py || {
Gilles Peskine7be45512020-08-12 02:31:02 +020072 echo >&2 "pylint reported errors"
73 ret=1
74}
75
76# Check types if mypy is available
77if type mypy >/dev/null 2>/dev/null; then
78 echo
79 echo 'Running mypy ...'
80 mypy scripts/*.py tests/scripts/*.py ||
81 ret=1
82fi
83
84exit $ret