#!/bin/bash # shellcheck source=kzcommon.sh # ----------------------------------------------------------------------------- # Scripts controleren. # # Geschreven door Karel Zimmer . # # Auteursrecht (c) 2015-2020 Karel Zimmer. # GNU Algemene Publieke Licentie . # # RelNum=13.02.00 # RelDat=2021-01-18 # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Global constants # ----------------------------------------------------------------------------- source "$(dirname "$0")"/kzcommon.sh readonly THIS_YEAR=$(date +%Y) readonly LAST_YEAR=$((THIS_YEAR - 1)) # Bij aanpassingen ook .completion aanpassen! readonly OPTIONS_SHORT=$OPTIONS_SHORT_COMMON readonly OPTIONS_LONG=$OPTIONS_LONG_COMMON readonly USAGE="Gebruik: $PROGNAME $OPTIONS_USAGE_COMMON" readonly HELP="Gebruik: $PROGNAME [OPTIE...] Scripts controleren. Opties: $OPTIONS_HELP_COMMON" # ----------------------------------------------------------------------------- # Globale variabelen # ----------------------------------------------------------------------------- declare -i MAXRC=0 # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- check_input() { local -i getopt_rc=0 local parsed='' parsed=$( getopt --alternative \ --options "$OPTIONS_SHORT" \ --longoptions "$OPTIONS_LONG" \ --name "$PROGNAME" \ -- "$@" ) || getopt_rc=$? if [[ $getopt_rc -ne 0 ]]; then printf '%s\n' "$USAGELINE" >&2 exit $ERROR fi eval set -- "$parsed" process_general_options "$@" while true; do case $1 in --) shift break ;; *) shift ;; esac done if [[ "$*" ]]; then printf "$PROGNAME: %s\n%s\n" 'geen argumenten opgeven' "$USAGELINE" >&2 exit $ERROR fi # Een non-gui script gestart met optie gui. if $OPTION_GUI; then OPTION_GUI=false TERMINAL=true fi check_user } process_input() { local script='' local scriptsdir=$HOME/kzscripts # Te controleren scripts staan in scriptsdir. cd "$scriptsdir" for script in *; do if ! [[ -f $script ]]; then continue fi case $script in CHANGELOG*) continue ;; *.1|*.desktop|*.policy) check_tags check_lines check_fields check_trailing_spaces ;; *.completion|*.sh) check_tags check_lines check_fields check_trailing_spaces check_script_shellcheck ;; *) check_tags check_lines check_fields check_trailing_spaces check_script check_usage ;; esac done } check_tags() { if grep --quiet \ --word-regexp \ --regexp='#''XXX' \ --regexp='#''TODO' \ --regexp='#''FIXME' \ "$script"; then info " ${BOLD}In $script:${NORMAL} Gedit-tags gevonden. $( grep --line-number \ --word-regexp \ --regexp='#''XXX' \ --regexp='#''TODO' \ --regexp='#''FIXME' \ "$script" | nl --number-width=4 \ --number-separator='' \ --body-numbering=n ) " fi } check_lines() { local -i max_line_length=79 case $script in *.sh) max_line_length=465 ;; *.policy) max_line_length=106 ;; *) max_line_length=79 ;; esac if [[ $(wc --max-line-length "$script" | awk '{print $1}') -gt $max_line_length ]]; then info " ${BOLD}In $script:${NORMAL} Regel is te lang \ ($(wc --max-line-length "$script" | awk '{print $1}')/$max_line_length). " if [[ $WARNING -gt $MAXRC ]]; then MAXRC=$WARNING fi fi if [[ $(wc --lines "$script" | awk '{print $1}') -gt 1000 ]]; then info " ${BOLD}In $script:${NORMAL} Meer dan duizend regels. " if [[ $WARNING -gt $MAXRC ]]; then MAXRC=$WARNING fi fi } check_fields() { local age='' local copyright_line='' local rel_dat='' local releaseday='' local rel_num='' local today='' copyright_line=$( grep --word-regexp \ --regexp='# ''Auteursrecht ' \ "$script" || true ) if [[ -z $copyright_line ]]; then info " ${BOLD}In $script:${NORMAL} Auteursrecht ontbreekt. " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi # Jaarwisseling. if ! grep --quiet --regexp="$THIS_YEAR" "$script"; then update_fields fi rel_num=$( awk -F'RelNum''=' \ '/''RelNum''=/{print $2;exit}' \ "$script" ) if [[ -z $rel_num ]]; then info " ${BOLD}In $script:${NORMAL} RelNum ontbreekst. " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi rel_dat=$( awk -F'RelDat''=' \ '/''RelDat''=/{print $2;exit}' \ "$script" ) if [[ -z $rel_dat ]]; then info " ${BOLD}In $script:${NORMAL} RelDat ontbreekt. " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi if ! date --date="$rel_dat" &> /dev/null; then info " ${BOLD}In $script:${NORMAL} Vrijgavedatum $rel_dat is niet geldig. " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi today=$(date +%Y%m%d) releaseday=$(date +%Y%m%d --date="$rel_dat") if [[ $releaseday -gt $today ]]; then info " ${BOLD}In $script:${NORMAL} Vrijgavedatum $rel_dat ligt in de toekomst. " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi age=$((today - releaseday)) if [[ $age -gt 10000 ]]; then info " ${BOLD}In $script:${NORMAL} Vrijgavedatum $rel_dat is meer dan een jaar oud. " fi if ! grep --quiet \ --word-regexp \ --regexp='# ''EOF' \ "$script"; then info " ${BOLD}In $script:${NORMAL} EOF ontbreekt. " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi } update_fields() { local copyright_line_new='' local copyright_line_first_part='' local pgm_copyright_line='' local pgm_copyright_line_new='' # Man-pagina. if [[ $copyright_line = .* ]]; then # get rid of ./" in copyright line. copyright_line=${copyright_line:4} # Change program's copyright year in the man page. # Auteursrecht (c) 2020 Karel Zimmer. # -> # Auteursrecht (c) 2020-2021 Karel Zimmer. pgm_copyright_line=" $LAST_YEAR Karel Zimmer." pgm_copyright_line_new=" $LAST_YEAR-$THIS_YEAR Karel Zimmer." sed --in-place \ --expression="s/$pgm_copyright_line/$pgm_copyright_line_new/g" \ "$script" # Auteursrecht (c) 2013-2020 Karel Zimmer. # -> # Auteursrecht (c) 2013-2021 Karel Zimmer. pgm_copyright_line="-$LAST_YEAR Karel Zimmer." pgm_copyright_line_new="-$THIS_YEAR Karel Zimmer." sed --in-place \ --expression="s/$pgm_copyright_line/$pgm_copyright_line_new/g" \ "$script" else info " ${BOLD}In $script:${NORMAL} Auteursrechtregel is aangepast voor de jaarwisseling. Maak zelf een PDF aan. Gebruik script edsha. " fi copyright_line_first_part=${copyright_line:0:23} copyright_line_new=$copyright_line_first_part"-$THIS_YEAR Karel Zimmer." sed --in-place \ --expression="s/$copyright_line/$copyright_line_new/g" \ "$script" } check_trailing_spaces() { if grep --quiet \ --regexp=' ''$' \ "$script"; then info " ${BOLD}In $script:${NORMAL} Eindspaties gevonden. $( grep --line-number \ --regexp=' ''$' \ "$script" | nl --number-width=4 \ --number-separator='' \ --body-numbering=n ) " if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi } check_script() { if grep --quiet \ --line-regexp \ --regexp='#!''/bin/bash' \ "$script"; then check_script_shellcheck elif grep --quiet \ --line-regexp \ --regexp='#!''/usr/bin/python3' \ "$script"; then check_script_pep8 else info " ${BOLD}In $script:${NORMAL} Onbekend script. Functie check_script() kan script niet controleren." if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi } check_script_shellcheck() { local -i check_rc=0 shellcheck --external-sources \ "$script" || check_rc=$? if [[ $check_rc -gt $MAXRC ]]; then MAXRC=$check_rc fi } check_script_pep8() { local -i check_rc=0 pep8 "$script" || check_rc=$? if [[ $check_rc -gt $MAXRC ]]; then MAXRC=$check_rc fi } check_usage() { local -i checkrc=0 "$scriptsdir/$script" --usage |& $LOGCMD || check_rc=$? if [[ $checkrc -gt 0 ]]; then info " ${BOLD}In $script:${NORMAL} $script --usage gaat fout." if [[ $ERROR -gt $MAXRC ]]; then MAXRC=$ERROR fi fi } term_script() { exit $MAXRC } # ----------------------------------------------------------------------------- # Main line # ----------------------------------------------------------------------------- main() { init_script check_input "$@" process_input term_script } main "$@" # EOF