[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.