utils/check-package: check all shell scripts

Currently only SysV init scripts are checked using shellcheck and a few
other rules (e.g. variable naming, file naming).

Extend the check using shellcheck to all shell scripts in the tree.
This is actually limited to the list of directories that check-package
knows that can check, but that list can be expanded later.

In order to apply the check to all shell scripts, use python3-magic to
determine the file type. Unfortunately, there are two different python
modules called "magic". Support both by detecting which one is installed
and defining get_filetype accordingly.

Keep testing first for name pattern, and only in the case there is no
match, check the file type. This ensures, for instance, that SysV
init scripts follow specific rules.

Apply these checks for shell scripts:
 - shellcheck;
 - trailing space;
 - consecutive empty lines;
 - empty last line on file;
 - newline at end of file.

Update the list of ignored warnings.

Do not add unit tests since no function was added, they were just
reused.
But expand the runtime test for check-package using as fixture a file
that generates a shellcheck warning.

Signed-off-by: Ricardo Martincoski <ricardo.martincoski@gmail.com>
[Arnout: support both variants of the "magic" module]
Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
This commit is contained in:
Ricardo Martincoski
2022-07-31 16:35:14 -03:00
committed by Arnout Vandecappelle
parent 30624cf777
commit c5a3dfb9a4
5 changed files with 72 additions and 1 deletions

View File

@@ -3,6 +3,7 @@
import argparse
import inspect
import magic
import os
import re
import six
@@ -13,11 +14,27 @@ import checkpackagelib.lib_config
import checkpackagelib.lib_hash
import checkpackagelib.lib_mk
import checkpackagelib.lib_patch
import checkpackagelib.lib_shellscript
import checkpackagelib.lib_sysv
VERBOSE_LEVEL_TO_SHOW_IGNORED_FILES = 3
flags = None # Command line arguments.
# There are two Python packages called 'magic':
# https://pypi.org/project/file-magic/
# https://pypi.org/project/python-magic/
# Both allow to return a MIME file type, but with a slightly different
# interface. Detect which one of the two we have based on one of the
# attributes.
if hasattr(magic, 'FileMagic'):
# https://pypi.org/project/file-magic/
def get_filetype(fname):
return magic.detect_from_filename(fname).mime_type
else:
# https://pypi.org/project/python-magic/
def get_filetype(fname):
return magic.from_file(fname, mime=True)
def get_ignored_parsers_per_file(intree_only, ignore_filename):
ignored = dict()
@@ -77,6 +94,15 @@ def parse_args():
return flags
def get_lib_from_filetype(fname):
if not os.path.isfile(fname):
return None
filetype = get_filetype(fname)
if filetype == "text/x-shellscript":
return checkpackagelib.lib_shellscript
return None
CONFIG_IN_FILENAME = re.compile(r"Config\.\S*$")
DO_CHECK_INTREE = re.compile(r"|".join([
r"Config.in",
@@ -120,7 +146,7 @@ def get_lib_from_filename(fname):
return checkpackagelib.lib_patch
if SYSV_INIT_SCRIPT_FILENAME.search(fname):
return checkpackagelib.lib_sysv
return None
return get_lib_from_filetype(fname)
def common_inspect_rules(m):