| #!/usr/bin/env bash | |
| set -e | |
| # Copyright (c) 2019-2024 Cosmin Truta. | |
| # | |
| # Use, modification and distribution are subject to the MIT License. | |
| # Please see the accompanying file LICENSE_MIT.txt | |
| # | |
| # SPDX-License-Identifier: MIT | |
| # shellcheck source="ci/lib/ci.lib.sh" | |
| source "$(dirname "$0")/lib/ci.lib.sh" | |
| cd "$CI_TOPLEVEL_DIR" | |
| CI_SHELLCHECK="$(command -v shellcheck || true)" | |
| CI_YAMLLINT="$(command -v yamllint || true)" | |
| CI_LINT_COUNTER=0 | |
| function ci_lint_ci_config_files { | |
| ci_info "linting: CI config files" | |
| local MY_FILE | |
| if [[ -x $CI_YAMLLINT ]] | |
| then | |
| ci_spawn "$CI_YAMLLINT" --version | |
| for MY_FILE in "$CI_TOPLEVEL_DIR"/.*.yml | |
| do | |
| ci_spawn "$CI_YAMLLINT" --strict "$MY_FILE" || | |
| CI_LINT_COUNTER=$((CI_LINT_COUNTER + 1)) | |
| done | |
| else | |
| ci_warn "program not found: 'yamllint'; skipping checks" | |
| fi | |
| } | |
| function ci_lint_ci_scripts { | |
| ci_info "linting: CI scripts" | |
| local MY_FILE | |
| if [[ -x $CI_SHELLCHECK ]] | |
| then | |
| ci_spawn "$CI_SHELLCHECK" --version | |
| for MY_FILE in "$CI_SCRIPT_DIR"/*.sh | |
| do | |
| ci_spawn "$CI_SHELLCHECK" -x "$MY_FILE" || | |
| CI_LINT_COUNTER=$((CI_LINT_COUNTER + 1)) | |
| done | |
| else | |
| ci_warn "program not found: 'shellcheck'; skipping checks" | |
| fi | |
| } | |
| function ci_lint_ci_scripts_license { | |
| ci_info "linting: CI scripts license" | |
| ci_spawn grep -F "MIT License" ci/LICENSE_MIT.txt || { | |
| ci_warn "bad or missing CI license file: '$CI_SCRIPT_DIR/LICENSE_MIT.txt'" | |
| CI_LINT_COUNTER=$((CI_LINT_COUNTER + 1)) | |
| } | |
| } | |
| function usage { | |
| echo "usage: $CI_SCRIPT_NAME" | |
| exit 0 | |
| } | |
| function main { | |
| local opt | |
| while getopts ":" opt | |
| do | |
| # This ain't a while-loop. It only pretends to be. | |
| [[ $1 == -[?h]* || $1 == --help ]] && usage | |
| ci_err "unknown option: '$1'" | |
| done | |
| shift $((OPTIND - 1)) | |
| # And... go! | |
| [[ $# -eq 0 ]] || ci_err "unexpected argument: '$1'" | |
| ci_lint_ci_config_files | |
| ci_lint_ci_scripts | |
| ci_lint_ci_scripts_license | |
| if [[ $CI_LINT_COUNTER -eq 0 ]] | |
| then | |
| ci_info "success!" | |
| exit 0 | |
| else | |
| ci_info "failed on $CI_LINT_COUNTER file(s)" | |
| exit 1 | |
| fi | |
| } | |
| main "$@" |