[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/8] Add core.sh and wrapper function
On Thu, Apr 9, 2015 at 8:29 PM, George Dunlap <george.dunlap@xxxxxxxxxxxxx> wrote: > Add core functionality and an executable to run it > > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> > --- > CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx> Hmm, not sure where the 0/8 for this patch went... anyway, you can also find this series here: git://xenbits.xenproject.org/people/gdunlap/raisin.git out/librarify/v1 -George > --- > 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |