merge bitcoin#24840: port lint-shell.sh to python

This commit is contained in:
Kittywhiskers Van Gogh 2022-04-30 15:35:57 -05:00
parent 973ca7b46f
commit b054a0d894
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD
3 changed files with 96 additions and 41 deletions

View File

@ -314,7 +314,7 @@ Use the `-v` option for verbose output.
| [`lint-python.py`](lint/lint-python.py) | [mypy](https://github.com/python/mypy) | [`lint-python.py`](lint/lint-python.py) | [mypy](https://github.com/python/mypy)
| [`lint-python.py`](lint/lint-python.py) | [pyzmq](https://github.com/zeromq/pyzmq) | [`lint-python.py`](lint/lint-python.py) | [pyzmq](https://github.com/zeromq/pyzmq)
| [`lint-python-dead-code.py`](lint/lint-python-dead-code.py) | [vulture](https://github.com/jendrikseipp/vulture) | [`lint-python-dead-code.py`](lint/lint-python-dead-code.py) | [vulture](https://github.com/jendrikseipp/vulture)
| [`lint-shell.sh`](lint/lint-shell.sh) | [ShellCheck](https://github.com/koalaman/shellcheck) | [`lint-shell.py`](lint/lint-shell.py) | [ShellCheck](https://github.com/koalaman/shellcheck)
| [`lint-spelling.py`](lint/lint-spelling.py) | [codespell](https://github.com/codespell-project/codespell) | [`lint-spelling.py`](lint/lint-spelling.py) | [codespell](https://github.com/codespell-project/codespell)
In use versions and install instructions are available in the [CI setup](../ci/lint/04_install.sh). In use versions and install instructions are available in the [CI setup](../ci/lint/04_install.sh).

95
test/lint/lint-shell.py Executable file
View File

@ -0,0 +1,95 @@
#!/usr/bin/env python3
#
# Copyright (c) 2018-2022 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""
Check for shellcheck warnings in shell scripts.
"""
import subprocess
import re
import sys
# Disabled warnings:
DISABLED = [
'SC2046', # Quote this to prevent word splitting.
'SC2086', # Double quote to prevent globbing and word splitting.
'SC2162', # read without -r will mangle backslashes.
]
def check_shellcheck_install():
try:
subprocess.run(['shellcheck', '--version'], stdout=subprocess.DEVNULL, check=True)
except FileNotFoundError:
print('Skipping shell linting since shellcheck is not installed.')
sys.exit(0)
def get_files(command):
output = subprocess.run(command, stdout=subprocess.PIPE, universal_newlines=True)
files = output.stdout.split('\n')
# remove whitespace element
files = list(filter(None, files))
return files
def main():
check_shellcheck_install()
# build the `exclude` flag
exclude = '--exclude=' + ','.join(DISABLED)
# build the `sourced files` list
sourced_files_cmd = [
'git',
'grep',
'-El',
r'^# shellcheck shell=',
]
sourced_files = get_files(sourced_files_cmd)
# build the `guix files` list
guix_files_cmd = [
'git',
'grep',
'-El',
r'^#!\/usr\/bin\/env bash',
'--',
'contrib/guix',
'contrib/shell',
]
guix_files = get_files(guix_files_cmd)
# build the other script files list
files_cmd = [
'git',
'ls-files',
'--',
'*.sh',
]
files = get_files(files_cmd)
# remove everything that doesn't match this regex
reg = re.compile(r'src/[dashbls,immer,leveldb,secp256k1,minisketch,univalue]')
files[:] = [file for file in files if not reg.match(file)]
# build the `shellcheck` command
shellcheck_cmd = [
'shellcheck',
'--external-sources',
'--check-sourced',
'--source-path=SCRIPTDIR',
]
shellcheck_cmd.append(exclude)
shellcheck_cmd.extend(sourced_files)
shellcheck_cmd.extend(guix_files)
shellcheck_cmd.extend(files)
# run the `shellcheck` command
try:
subprocess.check_call(shellcheck_cmd)
except subprocess.CalledProcessError:
sys.exit(1)
if __name__ == '__main__':
main()

View File

@ -1,40 +0,0 @@
#!/usr/bin/env bash
#
# Copyright (c) 2018-2020 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
# Check for shellcheck warnings in shell scripts.
export LC_ALL=C
# Disabled warnings:
disabled=(
SC2046 # Quote this to prevent word splitting.
SC2086 # Double quote to prevent globbing and word splitting.
SC2162 # read without -r will mangle backslashes.
)
EXIT_CODE=0
if ! command -v shellcheck > /dev/null; then
echo "Skipping shell linting since shellcheck is not installed."
exit $EXIT_CODE
fi
if ! command -v gawk > /dev/null; then
echo "Skipping shell linting since gawk is not installed."
exit $EXIT_CODE
fi
SHELLCHECK_CMD=(shellcheck --external-sources --check-sourced --source-path=SCRIPTDIR)
EXCLUDE="--exclude=$(IFS=','; echo "${disabled[*]}")"
# Check shellcheck directive used for sourced files
mapfile -t SOURCED_FILES < <(git ls-files | xargs gawk '/^# shellcheck shell=/ {print FILENAME} {nextfile}')
mapfile -t GUIX_FILES < <(git ls-files contrib/guix contrib/shell | xargs gawk '/^#!\/usr\/bin\/env bash/ {print FILENAME} {nextfile}')
mapfile -t FILES < <(git ls-files -- '*.sh' | grep -vE 'src/(dashbls|immer|leveldb|secp256k1|minisketch|univalue)/')
if ! "${SHELLCHECK_CMD[@]}" "$EXCLUDE" "${SOURCED_FILES[@]}" "${GUIX_FILES[@]}" "${FILES[@]}"; then
EXIT_CODE=1
fi
exit $EXIT_CODE