tests hinzugefügt, suche nach rechnung.sty überarbeitet

- kpsewhich sucht nach rechnung.sty
- prinf_failed kann optional ein string übergeben werden
- neue funktionen fail_and_exit, get_link_target, check_rechnungsdaten
- check_readable und check_binarys testen auf symbolische links
- einige funktionen mit kommentaren versehen
This commit is contained in:
+++ 2021-06-03 18:45:41 +02:00
parent c43c2cb7a1
commit 98a3abd1ee

View file

@ -33,13 +33,14 @@ CUT_BIN=$(which cut 2>/dev/null || echo "cut")
DATE_BIN=$(which date 2>/dev/null || echo "date") DATE_BIN=$(which date 2>/dev/null || echo "date")
TPUT_BIN=$(which tput 2>/dev/null || echo "tput") TPUT_BIN=$(which tput 2>/dev/null || echo "tput")
PDFLATEX_BIN=$(which pdflatex 2>/dev/null || echo "pdflatex") PDFLATEX_BIN=$(which pdflatex 2>/dev/null || echo "pdflatex")
KPSEWHICH_BIN=$(which kpsewhich 2>/dev/null || echo "kpsewhich")
GIT_BIN=$(which git 2>/dev/null || echo "git") GIT_BIN=$(which git 2>/dev/null || echo "git")
LATEX_BIN=$(which latex 2>/dev/null || echo "latex") LATEX_BIN=$(which latex 2>/dev/null || echo "latex")
RUBBER_BIN=$(which rubber 2>/dev/null || echo "rubber") RUBBER_BIN=$(which rubber 2>/dev/null || echo "rubber")
# Nicht auf rubber prüfen; Programm ist optional # Nicht auf rubber prüfen; Programm ist optional
# Nicht auf git prüfen; wird nur benötigt, wenn rechnung.sty nicht existiert. # Nicht auf git prüfen; wird nur benötigt, wenn rechnung.sty nicht existiert.
# Nicht auf latex prüfen; wird nur benötigt, wenn rechnung.sty nicht texistiert. # Nicht auf latex prüfen; wird nur benötigt, wenn rechnung.sty nicht texistiert.
EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDFLATEX_BIN" EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDFLATEX_BIN $KPSEWHICH_BIN"
GENPDF="" GENPDF=""
if [ -x "$RUBBER_BIN" ]; then if [ -x "$RUBBER_BIN" ]; then
@ -52,7 +53,7 @@ fi
# Variablen definieren # Variablen definieren
# -------------------- # --------------------
PROGRAMM_NAME=`basename $0` PROGRAMM_NAME=$(basename $0)
PROGRAMM_VERSION="0.0.1" PROGRAMM_VERSION="0.0.1"
VERBOSITY=1 VERBOSITY=1
STY_HOME="$HOME/texmf/tex/latex" STY_HOME="$HOME/texmf/tex/latex"
@ -67,7 +68,6 @@ SEDFILE="sed.txt"
LINE_BUFFER="" LINE_BUFFER=""
KEY_BUFFER="" KEY_BUFFER=""
VALUE_BUFFER="" VALUE_BUFFER=""
ERROR=0
KUNDE="" KUNDE=""
ADRESSE="" ADRESSE=""
ANREDE="" ANREDE=""
@ -109,6 +109,8 @@ print_start() {
print_failed() { print_failed() {
msg=$*
if [ "$VERBOSITY" -eq 0 ]; then if [ "$VERBOSITY" -eq 0 ]; then
return return
else else
@ -117,6 +119,9 @@ print_failed() {
else else
printf " Failed\n" printf " Failed\n"
fi fi
if [ ! -z "$msg" ]; then
print_error "$msg"
fi
fi fi
} }
@ -189,52 +194,96 @@ print_error() {
fi fi
} }
failed_and_exit() {
print_failed
exit $*
}
# Diverse Checks # Diverse Checks
# -------------- # --------------
check_readable() { check_readable() {
# testet, ob die übergebene datei kein symlink ist, existiert und lesbar
# ist. schlägt einer der tests fehl, wird das programm beendet.
print_start "Datei $1 ist lesbar ..." print_start "Datei $1 ist lesbar ..."
if test -h "$1"; then
target=$(get_link_target "$1")
print_failed "$1 ist ein symbolischer Link auf $target"
exit 1
fi
if test -f "$1" && test -r "$1"; then if test -f "$1" && test -r "$1"; then
print_ok print_ok
else else
print_failed failed_and_exit 1
quit 1
fi fi
} }
check_sty() ( check_sty() (
# sucht in einer subshell nach dem paket rechnung.sty. gibt true oder
# false zurück.
print_start "Suche nach $STY_RECHNUNG ..." print_start "Suche nach $STY_RECHNUNG ..."
rechnung=$(find "$STY_HOME" -type f -name "$STY_RECHNUNG") kpsewhich "$STY_RECHNUNG" 2>&1 >/dev/null
if test ! -f "$rechnung"; then if [ $? -eq 0 ]; then
print_failed
return 1
else
print_ok print_ok
return 0 return 0
else
print_failed
return 1
fi fi
) )
check_binaries() { check_binaries() (
program="" # die funktion prüft in einer subshell, ob alle benötigten binaries
# installiert sind. sollte das binary ein symlink auf eine ander datei
# sein, wird geprüft, ob sich diese im PATH befindet und nicht ebenfalls
# ein symlink ist. schlägt eine der prüfungen fehl, wird das programm
# beendet.
program=
binaries=$* binaries=$*
for program in $binaries; do for program in $binaries; do
print_start "Suche nach $program ..." print_start "Suche nach $program ..."
if test ! -x "$program"; then if test ! -x "$program"; then
print_failed print_failed "Das Programm $program wird benötigt, aber nicht gefunden."
print_error "Das Programm $program wird benötigt, aber nicht gefunden."
quit 3 quit 3
else else
if [ -h "$program" ]; then
program=$(get_link_target $program)
fi
if ! which "$program" 2>&1 >/dev/null; then
print_failed "$program ist nicht im Pfad"
fi
print_ok print_ok
fi fi
done done
} )
get_link_target() (
# die funktion bekommt einen symbolischen link und folgt ihm bis zum
# ende. mit dem echo-befehl wird das ziel an die aufrufende funktion
# zurück gegeben.
program=$1
while [ -h "$program" ]; do
program=$(readlink $program)
done
echo "$program"
)
is_option() ( is_option() (
# die funktion überprüft in einer subshell, ob die übergebene zeile ein
# = als trennzeichen enthält. gibt ja oder falsch zurück.
line="$*" line="$*"
if [ "${line#*=}" != "$line" ]; then if [ "${line#*=}" != "$line" ]; then
@ -244,6 +293,43 @@ is_option() (
fi fi
) )
check_rechnunsdaten() (
# die funktion überprüft in einer subshell, ob alle variablen belegt
# sind. ist eine variable leer, wird der name der variablen ausgegeben
# und ein fehler (1) zurück gegeben.
print_start "Prüfe Rechnungsdaten ..."
if test -z "$KUNDE"; then
print_failed "Das Feld Kunde ist leer"
return 1
elif test -z "$ADRESSE"; then
print_failed "Das Feld Adresse ist leer"
return 1
elif test -z "$ANREDE"; then
print_failed "Das Feld Anrede ist leer"
return 1
elif test -z "$ANZAHL"; then
print_failed "Das Feld Anzahl ist leer"
return 1
elif test -z "$POSITION"; then
print_failed "Das Feld Position ist leer"
return 1
elif test -z "$SHORT"; then
print_failed "Das Feld Short ist leer"
return 1
elif test -z "$BETRAG"; then
print_failed "Das Feld Betrag ist leer"
return 1
elif test -z "$LFDNR"; then
print_failed "Das Feld LfdNr ist leer"
return 1
else
print_ok
return 0
fi
)
# Whitespaces entfernen # Whitespaces entfernen
# in Buffer speichern # in Buffer speichern
# --------------------- # ---------------------
@ -282,7 +368,7 @@ install_sty() (
check_binaries "$GIT_BIN $LATEX_BIN" check_binaries "$GIT_BIN $LATEX_BIN"
print_start "Hole Repo von $STY_URL ..." print_start "Hole Repo von $STY_URL ..."
if git clone $STY_URL >/dev/null 2>&1; then if $GIT_BIN clone $STY_URL >/dev/null 2>&1; then
print_ok print_ok
cd rechnung cd rechnung
mkdir -p "$STY_HOME/rechnung/" mkdir -p "$STY_HOME/rechnung/"
@ -295,19 +381,18 @@ install_sty() (
if cp rechnung.sty "$STY_HOME/rechnung/"; then if cp rechnung.sty "$STY_HOME/rechnung/"; then
print_ok print_ok
else else
print_failed failed_and_exit 3
exit 1
fi fi
cd "$old_pwd" cd "$old_pwd"
rm -rf rechnung/ rm -rf rechnung/
print_info "Paket $STY_RECHNUNG erfolgreich installiert" print_info "Paket $STY_RECHNUNG erfolgreich installiert"
else else
print_error "Installation fehlgeschlagen" print_error "Installation fehlgeschlagen"
exit 5 exit 4
fi fi
else else
print_error "Klonen des Repos fehlgeschlagen" print_error "Klonen des Repos fehlgeschlagen"
exit 6 exit 5
fi fi
) )
@ -316,11 +401,10 @@ install_sty() (
reset_values() { reset_values() {
print_info "Initialisiere Felder für Rechnung neu." print_info "Beginne neue Rechnung"
LINE_BUFFER="" LINE_BUFFER=""
KEY_BUFFER="" KEY_BUFFER=""
VALUE_BUFFER="" VALUE_BUFFER=""
ERROR=0
KUNDE="" KUNDE=""
ADRESSE="" ADRESSE=""
ANREDE="" ANREDE=""
@ -349,11 +433,22 @@ set_value() {
betrag) BETRAG="$VALUE_BUFFER";; betrag) BETRAG="$VALUE_BUFFER";;
lfdnr) LFDNR="$VALUE_BUFFER";; lfdnr) LFDNR="$VALUE_BUFFER";;
short) SHORT="$VALUE_BUFFER";; short) SHORT="$VALUE_BUFFER";;
*) print_warn "Unbekanntes Feld: $KEY_BUFFER"; ERROR=1;; *) print_warn "Unbekanntes Feld: $KEY_BUFFER";;
esac esac
} }
make_invoice() { make_invoice() (
# die funktion erstellt in einer subshell die rechnung. schlägt die
# prüfung der rechnungsdaten fehl, kehrt sie zur aufrufenden shell
# zurück. ansonst wird eine kopie des latex-templates erstellt, die
# darin befindlichen platzhalter durch die entsprechenden variablen zu
# ersetzen und das ganze zu kompilieren.
check_rechnunsdaten
if [ ! "$?" -eq 0 ]; then
return 1
fi
dead_days="14" dead_days="14"
if [ "$(date +%u)" -gt 5 ]; then if [ "$(date +%u)" -gt 5 ]; then
@ -361,7 +456,6 @@ make_invoice() {
fi fi
month_ascii=$(date '+%B') month_ascii=$(date '+%B')
# inv_day=$(date '+%j')
inv_date=$(date '+%Y%m%d') inv_date=$(date '+%Y%m%d')
inv_dead=$(date -d "+${dead_days}days" '+%d.\\,%m.\\,%Y') inv_dead=$(date -d "+${dead_days}days" '+%d.\\,%m.\\,%Y')
rechnungsnummer="$inv_date--$LFDNR" rechnungsnummer="$inv_date--$LFDNR"
@ -396,7 +490,7 @@ make_invoice() {
if [ -x "$RUBBER_BIN" ]; then if [ -x "$RUBBER_BIN" ]; then
"$RUBBER_BIN" --clean "$filename" "$RUBBER_BIN" --clean "$filename"
fi fi
} )
proced_ini_line() { proced_ini_line() {
@ -417,12 +511,7 @@ proced_ini_line() {
# ende einer rechnung # ende einer rechnung
elif [ "$line" = "[ende]" ]; then elif [ "$line" = "[ende]" ]; then
if [ $ERROR -ne 0 ]; then
print_warn "Kunde \"$KUNDE\" enthält einen Fehler. Erstelle keine Rechung."
return
else
make_invoice make_invoice
fi
# alle anderen zeilen # alle anderen zeilen
else else
@ -469,7 +558,7 @@ do
esac esac
done done
# Verschiedene Basic Checks # Farbe aktivieren wenn vorhanden
if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then
COLORED_OUTPUT=1 COLORED_OUTPUT=1
fi fi
@ -478,6 +567,7 @@ print_deko " ========================"
print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION =" print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION ="
print_deko " ========================" print_deko " ========================"
# Verschiedene Basic Checks
if [ "$(id -u)" -eq 0 ]; then if [ "$(id -u)" -eq 0 ]; then
print_error "$0: Das Skript darf nicht als Root ausgeführt werden." print_error "$0: Das Skript darf nicht als Root ausgeführt werden."
exit 1 exit 1
@ -486,10 +576,10 @@ check_binaries "$EXECUTABLES_TO_CHECK"
check_readable "$RECHNUNGSFILE" check_readable "$RECHNUNGSFILE"
check_readable "$TEMPLATEFILE" check_readable "$TEMPLATEFILE"
check_readable "$LCOFILE" check_readable "$LCOFILE"
if ! check_sty "$STY_HOME"; then if ! check_sty; then
print_warn "$STY_RECHNUNG nicht gefunden." print_warn "Verwenden sie -i um $STY_RECHNUNG zu installieren"
if [ $INSTALL_LCO_FILE -eq 0 ]; then if [ $INSTALL_LCO_FILE -eq 0 ]; then
print_info "Beende $PROGRAMM_NAME" exit 7
else else
install_sty install_sty
fi fi