1 *62c56f98SSadaf Ebrahimi#! /usr/bin/env sh 2 *62c56f98SSadaf Ebrahimi 3 *62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 4 *62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 5 *62c56f98SSadaf Ebrahimi 6 *62c56f98SSadaf Ebrahimi# Purpose: check Python files for potential programming errors or maintenance 7 *62c56f98SSadaf Ebrahimi# hurdles. Run pylint to detect some potential mistakes and enforce PEP8 8 *62c56f98SSadaf Ebrahimi# coding standards. Run mypy to perform static type checking. 9 *62c56f98SSadaf Ebrahimi 10 *62c56f98SSadaf Ebrahimi# We'll keep going on errors and report the status at the end. 11 *62c56f98SSadaf Ebrahimiret=0 12 *62c56f98SSadaf Ebrahimi 13 *62c56f98SSadaf Ebrahimiif type python3 >/dev/null 2>/dev/null; then 14 *62c56f98SSadaf Ebrahimi PYTHON=python3 15 *62c56f98SSadaf Ebrahimielse 16 *62c56f98SSadaf Ebrahimi PYTHON=python 17 *62c56f98SSadaf Ebrahimifi 18 *62c56f98SSadaf Ebrahimi 19 *62c56f98SSadaf Ebrahimicheck_version () { 20 *62c56f98SSadaf Ebrahimi $PYTHON - "$2" <<EOF 21 *62c56f98SSadaf Ebrahimiimport packaging.version 22 *62c56f98SSadaf Ebrahimiimport sys 23 *62c56f98SSadaf Ebrahimiimport $1 as package 24 *62c56f98SSadaf Ebrahimiactual = package.__version__ 25 *62c56f98SSadaf Ebrahimiwanted = sys.argv[1] 26 *62c56f98SSadaf Ebrahimiif packaging.version.parse(actual) < packaging.version.parse(wanted): 27 *62c56f98SSadaf Ebrahimi sys.stderr.write("$1: version %s is too old (want %s)\n" % (actual, wanted)) 28 *62c56f98SSadaf Ebrahimi exit(1) 29 *62c56f98SSadaf EbrahimiEOF 30 *62c56f98SSadaf Ebrahimi} 31 *62c56f98SSadaf Ebrahimi 32 *62c56f98SSadaf Ebrahimican_pylint () { 33 *62c56f98SSadaf Ebrahimi # Pylint 1.5.2 from Ubuntu 16.04 is too old: 34 *62c56f98SSadaf Ebrahimi # E: 34, 0: Unable to import 'mbedtls_dev' (import-error) 35 *62c56f98SSadaf Ebrahimi # Pylint 1.8.3 from Ubuntu 18.04 passed on the first commit containing this line. 36 *62c56f98SSadaf Ebrahimi check_version pylint 1.8.3 37 *62c56f98SSadaf Ebrahimi} 38 *62c56f98SSadaf Ebrahimi 39 *62c56f98SSadaf Ebrahimican_mypy () { 40 *62c56f98SSadaf Ebrahimi # mypy 0.770 is too old: 41 *62c56f98SSadaf Ebrahimi # tests/scripts/test_psa_constant_names.py:34: error: Cannot find implementation or library stub for module named 'mbedtls_dev' 42 *62c56f98SSadaf Ebrahimi # mypy 0.780 from pip passed on the first commit containing this line. 43 *62c56f98SSadaf Ebrahimi check_version mypy.version 0.780 44 *62c56f98SSadaf Ebrahimi} 45 *62c56f98SSadaf Ebrahimi 46 *62c56f98SSadaf Ebrahimi# With just a --can-xxx option, check whether the tool for xxx is available 47 *62c56f98SSadaf Ebrahimi# with an acceptable version, and exit without running any checks. The exit 48 *62c56f98SSadaf Ebrahimi# status is true if the tool is available and acceptable and false otherwise. 49 *62c56f98SSadaf Ebrahimiif [ "$1" = "--can-pylint" ]; then 50 *62c56f98SSadaf Ebrahimi can_pylint 51 *62c56f98SSadaf Ebrahimi exit 52 *62c56f98SSadaf Ebrahimielif [ "$1" = "--can-mypy" ]; then 53 *62c56f98SSadaf Ebrahimi can_mypy 54 *62c56f98SSadaf Ebrahimi exit 55 *62c56f98SSadaf Ebrahimifi 56 *62c56f98SSadaf Ebrahimi 57 *62c56f98SSadaf Ebrahimiecho 'Running pylint ...' 58 *62c56f98SSadaf Ebrahimi$PYTHON -m pylint scripts/mbedtls_dev/*.py scripts/*.py tests/scripts/*.py || { 59 *62c56f98SSadaf Ebrahimi echo >&2 "pylint reported errors" 60 *62c56f98SSadaf Ebrahimi ret=1 61 *62c56f98SSadaf Ebrahimi} 62 *62c56f98SSadaf Ebrahimi 63 *62c56f98SSadaf Ebrahimiecho 64 *62c56f98SSadaf Ebrahimiecho 'Running mypy ...' 65 *62c56f98SSadaf Ebrahimi$PYTHON -m mypy scripts/*.py tests/scripts/*.py || 66 *62c56f98SSadaf Ebrahimi ret=1 67 *62c56f98SSadaf Ebrahimi 68 *62c56f98SSadaf Ebrahimiexit $ret 69