#!/usr/bin/env bash # Copyright (C) 2022-2023 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. # For compatibility with sysexits.h (see man 3 sysexits.h for more details) EX_USAGE=64 tarball="" usage() { progname="$1" printf "Examples:\n" printf "\t%s %s %s\n" \ "${progname}" \ "--website-prefix software/gnuboot" \ "--directory site" printf "\t%s %s %s\n" \ "${progname}" \ "--website-prefix software/gnuboot" \ "--tarball website.tar.gz" printf "\n" printf "Usage:\n" printf "\t%s %s\n" "${progname}" "<-h|--help>" printf "\t%s %s %s\n" "${progname}" \ "--website-prefix PREFIX" "<COMMAND [ARGUMENT]>" printf "\n" printf "Main commands:\n" printf "\t-d, --directory DIRECTORY\n" printf "\t\tCheck DIRECTORY\n" printf "\t-t, --tarball TARBALL\n" printf "\t\tCheck TARBALL\n" printf "\n" printf "Other options:\n" printf "\t-h, --help\n" printf "\t\tDisplay this help and exit.\n" printf "\n" } test_directory_pattern() { name="$1" directory="$2" pattern="$3" find "${directory}" -print0 | sed "s#^${directory}/##" | grep -q "${pattern}" result=$? if [ ${result} -eq 0 ] ; then echo "[ OK ] ${name}" else echo "[ !! ] ${name} failed" exit 1 fi } test_tarball_pattern() { name="$1" tarball="$2" pattern="$3" tar tf "${tarball}" | grep -q "${pattern}" result=$? if [ ${result} -eq 0 ] ; then echo "[ OK ] ${name}" else echo "[ !! ] ${name} failed" exit 1 fi } test_tarball_savannah_cvs_constraints() { name="$1" tarball="$2" nr_files=$(tar tf "${tarball}" | grep -c -v '/') if [ "${nr_files}" = "1" ] ; then echo "[ OK ] ${name}" else echo "[ !! ] ${name} failed" exit 1 fi } run_directory_tests() { directory="$1" prefix="$2" directory_name="$(basename "${directory}")" test_directory_pattern "${directory_name}: index.html present test" \ "${directory}" \ "${prefix}/index.html" test_directory_pattern "${directory_name}: html test" \ "${directory}" \ "${prefix}/web/.*\.html$" } run_tarball_tests() { tarball="$1" prefix="$2" filename="$(basename "${tarball}")" test_tarball_pattern "${filename}: html test" "${tarball}" '\.html$' test_tarball_pattern "${filename}: jpg test" "${tarball}" '\.jpg$' test_tarball_savannah_cvs_constraints \ "${filename}: Savannah CVS: Only /index.html in root directory" \ "${tarball}" } # shellcheck disable=SC2166 # We want to make operator precedence # clear. if [ $# -eq 1 ] && [ "$1" = "-h" -o "$1" == "--help" ] ; then usage "check.sh" exit 0 elif [ $# -eq 4 ] && [ "$1" = "--website-prefix" ] ; then prefix="$2" if [ "$3" = "-d" -o "$3" = "--directory" ] ; then directory="$(realpath "$4")" run_directory_tests "${directory}" "${prefix}" elif [ "$3" = "-t" -o "$3" = "--tarball" ] ; then tarball="$(realpath "$4")" run_tarball_tests "${tarball}" "${prefix}" else usage "check.sh" exit ${EX_USAGE} fi else usage "check.sh" exit ${EX_USAGE} fi