From 87ba18e661ce563172d45c065bf48f366c16e265 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Fri, 3 Apr 2009 10:45:53 +0200 Subject: [PATCH] gsu improvements. Support config files from within gsu. Untested. --- funcs/gsu | 114 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 82 insertions(+), 32 deletions(-) diff --git a/funcs/gsu b/funcs/gsu index 37092a3..9611b30 100644 --- a/funcs/gsu +++ b/funcs/gsu @@ -1,12 +1,15 @@ +#!/bin/sh # gsu -- the global subcommand utility -# (C) 2006-2007 Andre Noll +# (C) 2006-2009 Andre Noll -gsu_init_errors() +_gsu_init_errors() { gsu_errors=" GSU_SUCCESS success E_GSU_BAD_COMMAND invalid command E_GSU_NOT_A_NUMBER not a number +E_GSU_SOURCE error in config file +E_GSU_CONFIG bad/missing config file option $gsu_errors " local a b i=0 @@ -22,7 +25,7 @@ $gsu_errors $gsu_errors EOF } -export -f gsu_init_errors +export -f _gsu_init_errors # check if $1 is a number gsu_is_a_number() @@ -44,19 +47,19 @@ export -f gsu_short_msg gsu_msg() { - gsu_short_msg "$gsu_self: $1" + gsu_short_msg "$_gsu_self: $1" } export -f gsu_msg gsu_date_msg() { - gsu_short_msg "$gsu_self $(date): $1" + gsu_short_msg "$_gsu_self $(date): $1" } export -f gsu_date_msg -gsu_banner_msg() +_gsu_banner_msg() { - local txt="*** $gsu_self --" + local txt="*** $_gsu_self --" if test -z "$gsu_banner_txt"; then txt="$txt set \$gsu_banner_txt to customize this message" else @@ -64,7 +67,7 @@ gsu_banner_msg() fi gsu_short_msg "$txt ***" } -export -f gsu_banner_msg +export -f _gsu_banner_msg gsu_err_msg() { @@ -89,13 +92,13 @@ gsu_err_msg() } export -f gsu_err_msg -gsu_usage() +_gsu_usage() { - gsu_short_msg "Usage: $gsu_self command [options]" + gsu_short_msg "Usage: $_gsu_self command [options]" } -export -f gsu_usage +export -f _gsu_usage -gsu_available_commands() +_gsu_available_commands() { result="$( (printf "help\nman\n"; grep "^com_[a-z_]\+()" $0) \ | sed -e 's/^com_//' -e 's/()//' \ @@ -103,9 +106,9 @@ gsu_available_commands() | tr '\n' ' ')" ret=$GSU_SUCCESS } -export -f gsu_available_commands +export -f _gsu_available_commands -gsu_print_available_commands() +_gsu_print_available_commands() {( local i count gsu_short_msg "Available commands:" @@ -124,7 +127,7 @@ gsu_print_available_commands() echo ) 2>&1 } -export -f gsu_print_available_commands +export -f _gsu_print_available_commands export gsu_man_txt=" Print the manual. @@ -137,24 +140,24 @@ com_man() local minus_signs="--------------------------------------------------" local com num - echo "$gsu_self (_${gsu_banner_txt}_) manual" - echo "${equal_signs:0:${#gsu_self} + ${#gsu_banner_txt} + 16}" + echo "$_gsu_self (_${gsu_banner_txt}_) manual" + echo "${equal_signs:0:${#_gsu_self} + ${#gsu_banner_txt} + 16}" echo sed -e '1,/^#\{70,\}/d' -e '/^#\{70,\}/,$d' $0 -e 's/^# *//' echo "----" echo - echo "$gsu_self usage" - echo "${minus_signs:0:${#gsu_self} + 6}" + echo "$_gsu_self usage" + echo "${minus_signs:0:${#_gsu_self} + 6}" printf "\t" - gsu_usage 2>&1 + _gsu_usage 2>&1 echo "Each command has its own set of options as described below." echo echo "----" echo echo "Available commands:" - gsu_available_commands + _gsu_available_commands for com in $result; do num=${#com} if test $num -lt 4; then @@ -182,8 +185,8 @@ com_help() { local a b if test -z "$1"; then - gsu_banner_msg 2>&1 - gsu_usage 2>&1 + _gsu_banner_msg 2>&1 + _gsu_usage 2>&1 # sed is magic, baby (printf "com_help()\n$gsu_help_txt" | head -n 4; echo "--" printf "com_man()\n$gsu_man_txt" | head -n 4; echo "--" @@ -204,7 +207,7 @@ com_help() echo "$b" done echo - echo "Try $gsu_self help for info on ." + echo "Try $_gsu_self help for info on ." ret=$GSU_SUCCESS return fi @@ -223,23 +226,70 @@ com_help() sed -e "1,/com_$1()/d" -e '/^{/,$d' -e 's/^## *//' $0 return fi - gsu_print_available_commands + _gsu_print_available_commands result="$1" ret=-$E_GSU_BAD_COMMAND } export -f com_help +_gsu_init_config() +{ + local name val default_val required ty comment + + # set default values + while read name default_val required ty comment; do + if test -z "$name"; then + continue + fi + eval ${gsu_self}_$name="$default_val" + done << EOF + $gsu_config_vars +EOF + result="$HOME/.${gsu_self}rc" + # overwrite by custom configuration + if [ -r "$result" ]; then + ret=-$E_GSU_SOURCE + if ! . "$result"; then + gsu_err_msg + exit 1 + fi + fi + while read name default_val required ty comment; do + [ -z "$name" ] && continue + eval val="\$$name" + # abort if any required config var remains unset + ret=-$_E_GSU_CONFIG + if [ "$val" = "-" -a "$required" = "required" ]; then + result="$name" + gsu_err_msg + exit 1 + fi + if [ $ty == "number" ]; then + gsu_is_a_number "$val" + if [ $ret -lt 0]; then + gsu_err_msg + exit 1 + fi + fi + eval export ${gsu_self}_$name + done << EOF + $config_vars +EOF +} +export -f _gsu_init_config + gsu() { local i - gsu_self="$(basename $0)" - gsu_init_errors - gsu_available_commands + _gsu_self="$(basename $0)" + _gsu_init_errors + _gsu_init_config + _gsu_available_commands gsu_cmds="$result" if test $# -eq 0; then - gsu_usage - gsu_print_available_commands + _gsu_usage + _gsu_print_available_commands exit 1 fi arg="$1" @@ -257,7 +307,7 @@ gsu() ret=-$E_GSU_BAD_COMMAND result="$arg" gsu_err_msg - gsu_print_available_commands + _gsu_print_available_commands exit 1 } -# no need to export this +export -f gsu -- 2.39.2