[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/8] Add core.sh and wrapper function
Add core functionality and an executable to run it Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> --- CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx> --- lib/core.sh | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ raise | 16 +++++++ 2 files changed, 163 insertions(+) create mode 100644 lib/core.sh create mode 100755 raise diff --git a/lib/core.sh b/lib/core.sh new file mode 100644 index 0000000..46b02e0 --- /dev/null +++ b/lib/core.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash + +RAISIN_HELP=() + +# Core calling convention functionality +# +# $arg_parse +# +# Parse $@. Begin with every element that a '=' in it being treated +# as a variable assignment: declare the LHS a local variable and set +# it to the RHS. Once you reach an element without a '=' in it, or +# a '--', put all further elements into the array args. +# +# $requireargs VARNAME1 [VARNAME2, ...] +# +# Check to see that VARNAME1 is defined, and throw an error if not. +# +# default VARNAME "VALUE" ; $default_post +# +# Check to see is VARNAME is defined; if not, declare it a local +# variable and set it to VALUE. +# +# Example usage: +# +# function log() +# { +# local i; +# +# $arg_parse +# +# default tmpdir "/tmp"; $default_post +# +# $requireargs filename +# +# for $i in ${args[@]} ; do +# echo "$i" > $tmpdir/$filename +# done +# +# [[ -n "$flower" ] && echo $flower +# } + +arg_parse_cmd=\ +"local -a args; +local _a; +local _vn; +local _m; + +_m=true; + +for _a in \"\$@\" ; do + false && echo \"Evaluating \${_a} [[ \"\${_a/=}\" = \"\${_a}\" ]]\"; + if \$_m && [[ \"\${_a/=}\" != \"\${_a}\" ]] ; then + false && echo Parameter; + _vn=\${_a%%=*}; + eval \"local \$_vn\"; + eval \"\$_a\"; + elif \$_m && [[ \"\${_a}\" == \"--\" ]] ; then + false && echo Separator; + _m=false; + else + false && echo Argument; + _m=false; + args+=(\"\$_a\"); + fi; +done" + +arg_parse="eval $arg_parse_cmd" + +# Pass in either the current function name, or the name of the script +requireargs="eval _func=\"\$FUNCNAME\" ; eval [[ -n \\\"\$_func\\\" ]] || _func=\$0 ; eval _require-args \$_func" + +function _require-args() +{ + local _arg + local _args + + _args=($@) + + for _arg in ${_args[@]:1} ; do + eval "[[ -n \"\${$_arg}\" ]] || fail \"${_args[0]}: Missing $_arg\"" + done +} + +function default() +{ + # l0: eval i="5" + # l1: default_post="eval $1=\"$2\"" + # l3: eval "if [[ -z \"\$$1\" ]] ; then default_post=\"eval \$1=\\\"$2\\\"\" ; fi" + eval "if [[ -z \"\$$1\" ]] ; then default_post=\"eval local \$1=\\\"$2\\\"\" ; else unset default_post ; fi" +} + +function fail() +{ + echo FATAL "$@" 1>&2 + [[ -n "$fail_cleanup" ]] && $fail_cleanup + exit 1 +} + +function info() +{ + echo INFO "$@" 1>&2 +} + +function error() +{ + echo ERROR "$@" 1>&2 +} + +RAISIN_HELP+=("help List available commands") +function help() +{ + echo "Usage: $0 command [arguments...]" + echo " Run '$0 help' for a list of commands, or '$0 command-help' for" + echo " help on a particular command." + echo + + for i in "${RAISIN_HELP[@]}" ; do + echo "$i" + done + + echo + + exit 0 +} + +function cmdline() +{ + local cmd; + + [[ "$#" -eq "0" ]] && help + + $arg_parse + + # If the command is not defined, then print help and exit + if ! type "${args[0]}" 2>/dev/null | grep -q 'function' ; then + echo "Unknown function: ${args[0]}" + echo + help + fi + + info Running "${args[0]}" + "${args[0]}" "${args[@]:1}" || exit 1 + + if ! [[ -z "$RET" ]] ; then + echo $RET + fi +} diff --git a/raise b/raise new file mode 100755 index 0000000..7f3faae --- /dev/null +++ b/raise @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Include your defaults +if [[ -e "./config" ]] ; then + . ./config +fi + +# To use this as a library, set RAISIN_PATH appropriately +[[ -z "$RAISIN_PATH" ]] && RAISIN_PATH="$PWD/lib" + +# Then as many as the sub-libraries as you need +. ${RAISIN_PATH}/core.sh + +# And do your own thing rather than running commands +# I suggest defining a "main" function of your own and running it like this. +cmdline "$@" -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |