#!/bin/bash APP_SVNID='$HeadURL$ $LastChangedRevision$' # Modules . $(ade-config ade_share_prefix)/include/ade.sh || { echo "${0##*/}: INTERNAL ERROR: failed to load ade.sh" >&2; exit 3; } . $(bs-config bs_share_prefix)/include/bssupport.sh || { echo "${0##*/}: INTERNAL ERROR: failed to load bssupport.sh" >&2; exit 3; } # Configuration # Other globals BS_DEFINED_ERRORS=( "KEY=BS_ERR_MISC; FMT=\"%s\"" ) bs() { local ERRSTACK_REF="$1"; shift local RC local -a NEW_DOLLAR_AT local DESANDBOXING_FLAG ENFORCE_STEP_SEQUENCING_FLAG CONFIG_FILE DELAY_FAIL_ENABLED_FLAG PROGNAME # Register application-specific errors ade_register_error_types BS_DEFINED_ERRORS # Defaults for options DESANDBOXING_FLAG=true ENFORCE_STEP_SEQUENCING_FLAG=true DELAY_FAIL_ENABLED_FLAG=false ade_get_progname "$ERRSTACK_REF" PROGNAME CONFIG_FILE=${BS_CONFIG:-$(bs-config bs_etc_prefix)/$PROGNAME.conf} # Register bs options ade_register_options "$ERRSTACK_REF" -o kf: --longoptions=no-desandboxing,no-sequencing,config,delay-fail --callback-template="bs_opt_handler_%s" || return $? ade_set_callbacks "$ERRSTACK_REF" bs_usage_help bs_version bs_paths || return $? # Process options ade_process_options "$ERRSTACK_REF" NEW_DOLLAR_AT "$@" || return $? set -- "${NEW_DOLLAR_AT[@]}" # Process arguments ade_debug "$ERRSTACK_REF" 10 "main: processing arguments ..." [ $# = 2 ] || ade_show_bad_usage "$ERRSTACK_REF" VERB=$1 PROGRAM=$2 ade_debug "$ERRSTACK_REF" 10 "main: VERB=$VERB, PROGRAM=$PROGRAM" # Sanity checks and derivations # Check include file loaded ok [ -x $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD ] || { ade_error "$ERRSTACK_REF" BS_ERR_MISC "can't find components (was looking for $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD)"; return $ADE_FAIL; } # Check config file loadable and load it if [ ! -r $CONFIG_FILE ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$CONFIG_FILE: not readable" return $ADE_FAIL else RC=0; SH_OUTPUT=$(bash -c "PROGRAM=$PROGRAM; . $CONFIG_FILE && echo OK" 2>&1) || RC=$? [ $RC = 0 -a "X$SH_OUTPUT" = XOK ] || { ade_error "$ERRSTACK_REF" BS_ERR_MISC "$CONFIG_FILE: failed to load (return code was $RC; output was [$SH_OUTPUT])"; return $ADE_FAIL; } fi . $CONFIG_FILE export DESANDBOXING_FLAG ENFORCE_STEP_SEQUENCING_FLAG # Guts # (delegated) case $VERB in s|status) status "$ERRSTACK_REF" || return $? ;; ss|schedule-sources) schedule_sources "$ERRSTACK_REF" || return $? ;; ts|test-sources) test_sources "$ERRSTACK_REF" || return $? ;; rs|release-sources) release_sources "$ERRSTACK_REF" || return $? ;; mt|make-tarball) make_tarball "$ERRSTACK_REF" || return $? ;; sp|schedule-pkgctrl) schedule_pkgctrl "$ERRSTACK_REF" || return $? ;; tp|test-pkgctrl) test_pkgctrl "$ERRSTACK_REF" || return $? ;; rp|release-pkgctrl) release_pkgctrl "$ERRSTACK_REF" || return $? ;; mp|make-package) make_package "$ERRSTACK_REF" || return $? ;; ps|prologue-sources) prologue_sources "$ERRSTACK_REF" || return $? ;; es|epilogue-sources) epilogue_sources "$ERRSTACK_REF" || return $? ;; pp|prologue-pkgctrl) prologue_pkgctrl "$ERRSTACK_REF" || return $? ;; ep|epilogue-pkgctrl) epilogue_pkgctrl "$ERRSTACK_REF" || return $? ;; *) ade_show_bad_usage "$ERRSTACK_REF" ;; esac return $ADE_OK } bs_opt_handler_config() { local ERRSTACK_REF="$1"; shift CONFIG_FILE="$1" return $ADE_OK } bs_opt_handler_f() { local ERRSTACK_REF="$1"; shift bs_opt_handler_config "$ERRSTACK_REF" "$@" return $ADE_OK } bs_opt_handler_k() { local ERRSTACK_REF="$1"; shift bs_opt_handler_no_desandboxing "$ERRSTACK_REF" "$@" return $ADE_OK } bs_opt_handler_no_desandboxing() { local ERRSTACK_REF="$1"; shift DESANDBOXING_FLAG=false return $ADE_OK } bs_opt_handler_no_desandboxing() { local ERRSTACK_REF="$1"; shift DESANDBOXING_FLAG=false return $ADE_OK } bs_opt_handler_no_sequencing() { local ERRSTACK_REF="$1"; shift ENFORCE_STEP_SEQUENCING_FLAG=false return $ADE_OK } bs_opt_handler_delay_fail() { local ERRSTACK_REF="$1"; shift DELAY_FAIL_ENABLED_FLAG=true return $ADE_OK } bs_usage_help() { local ERRSTACK_REF="$1"; shift local USAGE_TEXT_SHORT_REF="$1"; shift local USAGE_TEXT_LONG_REF="$1"; shift eval "$USAGE_TEXT_SHORT_REF=\" \"" eval "$USAGE_TEXT_LONG_REF=\"\ -f | --config= set config file -k | --no-desandboxing don't delete sandbox --no-sequencing overrule sequence restrictions --delay-fail postpone inter-phase fail Steps: prologue-sources, schedule-sources, test-sources, release-sources, make-tarball, epilogue-sources, prologue-pkgctrl, schedule-pkgctrl, test-pkgctrl, release-pkgctrl, make-package, epilogue-pkgctrl, status\"" return $ADE_OK } bs_paths() { local ERRSTACK_REF="$1"; shift local PATHLIST_REF=$1; shift eval "$PATHLIST_REF=\"\"" return $ADE_OK } bs_version() { local ERRSTACK_REF="$1"; shift local VERSION_REF=$1; shift ade_extract_version "$ERRSTACK_REF" "$APP_SVNID" "$VERSION_REF" return $ADE_OK } status() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL ade_debug "$ERRSTACK_REF" 10 "status: calling $BSSUPPORT_STEP_STATUS_CMD ..." # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM BS_PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_STATUS_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_STATUS_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } schedule_sources() { local ERRSTACK_REF="$1" local DFLT_CHANGE_TYPE CHANGE_ID local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Get a ticket number question "$ERRSTACK_REF" "" "change type (b)ug, (f)eature or (r)ewrite" b validate_change_type rationalise_change_type CHANGE_TYPE question "$ERRSTACK_REF" "" "change ID" "" validate_change_id rationalise_change_id CHANGE_ID # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_CHANGE_ID=$CHANGE_ID BS_SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM BS_CHANGE_TYPE=$CHANGE_TYPE BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } test_sources() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM BS_SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM BS_TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR BS_VERBOSELEVEL=$VERBOSELEVEL BS_AUTHEMAIL=$AUTHEMAIL BS_AUTHFULLNAME=\"$AUTHFULLNAME\" BS_DELAY_FAIL_ENABLED_FLAG=$DELAY_FAIL_ENABLED_FLAG $BSSUPPORT_STEP_TEST_SOURCES_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_TEST_SOURCES_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } release_sources() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM BS_SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM BS_TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR BS_VERBOSELEVEL=$VERBOSELEVEL BS_AUTHEMAIL=$AUTHEMAIL BS_AUTHFULLNAME=\"$AUTHFULLNAME\" $BSSUPPORT_STEP_RELEASE_SOURCES_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_RELEASE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } make_tarball() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL ade_debug "$ERRSTACK_REF" 10 "make_tarball: sof" # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM BS_SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM BS_TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR BS_AUTHEMAIL=$AUTHEMAIL BS_AUTHFULLNAME=\"$AUTHFULLNAME\" BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_MAKE_TARBALL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_MAKE_TARBALL_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } schedule_pkgctrl() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_SCHEDULE_PKGCTRL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_SCHEDULE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } test_pkgctrl() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian BS_PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR BS_PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian BS_VERBOSELEVEL=$VERBOSELEVEL BS_DELAY_FAIL_ENABLED_FLAG=$DELAY_FAIL_ENABLED_FLAG $BSSUPPORT_STEP_TEST_PKGCTRL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_TEST_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } release_pkgctrl() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian BS_PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR BS_PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_RELEASE_PKGCTRL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_RELEASE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } make_package() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian BS_TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR BS_PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR BS_PACKAGE_RPMREPO_DIR=$PACKAGE_RPMREPO_DIR BS_PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_MAKE_PACKAGE_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_MAKE_PACKAGE_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } prologue_sources() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL ade_debug "$ERRSTACK_REF" 10 "prologue_sources: PROGRAM=$PROGRAM" # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM BS_SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM BS_SITE_PROLOGUE_SOURCES_CMD=\"\$SITE_PROLOGUE_SOURCES_CMD\" BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_PROLOGUE_SOURCES_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_PROLOGUE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } epilogue_sources() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_SITE_EPILOGUE_SOURCES_CMD=\"\$SITE_EPILOGUE_SOURCES_CMD\" BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_EPILOGUE_SOURCES_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_EPILOGUE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } prologue_pkgctrl() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian BS_PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian BS_SITE_PROLOGUE_PKGCTRL_CMD=\"\$SITE_PROLOGUE_PKGCTRL_CMD\" BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_PROLOGUE_PKGCTRL_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_PROLOGUE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } epilogue_pkgctrl() { local ERRSTACK_REF="$1" local VERBOSELEVEL ade_get_verboselevel "$ERRSTACK_REF" VERBOSELEVEL # Note that we do not contaminate the environment with PROGRAM or # VERBOSELEVEL, but rather with BS_PROGNAME for clarity. CMDLINE="BS_PROGRAM=$PROGRAM BS_PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR BS_PACKAGE_RPMREPO_DIR=$PACKAGE_RPMREPO_DIR BS_SITE_EPILOGUE_PKGCTRL_CMD=\"\$SITE_EPILOGUE_PKGCTRL_CMD\" BS_VERBOSELEVEL=$VERBOSELEVEL $BSSUPPORT_STEP_EPILOGUE_PKGCTRL_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_EPILOGUE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_FAIL fi return $ADE_OK } validate_change_type() { local ERRSTACK_REF="$1"; shift local CHANGE_TYPE CHANGE_TYPE=$1 if [[ $CHANGE_TYPE =~ ^(b|bug|f|feature|r|rewrite)$ ]]; then return $ADE_OK else return $ADE_FAIL fi } rationalise_change_type() { local ERRSTACK_REF="$1"; shift local LOCAL_CHANGE_TYPE LOCAL_CHANGE_TYPE=$1 REF=$2 ade_debug "$ERRSTACK_REF" 10 "rationalise_change_type: LOCAL_CHANGE_TYPE=$LOCAL_CHANGE_TYPE, REF=$REF" case $LOCAL_CHANGE_TYPE in b) LOCAL_CHANGE_TYPE=bug ;; f) LOCAL_CHANGE_TYPE=feature ;; r) LOCAL_CHANGE_TYPE=rewrite ;; esac eval "$REF=\"\$LOCAL_CHANGE_TYPE\"" return $ADE_OK } validate_change_id() { local ERRSTACK_REF="$1"; shift local CHANGE_ID CHANGE_ID=$1 return $ADE_OK } rationalise_change_id() { local ERRSTACK_REF="$1"; shift local LOCAL_CHANGE_ID LOCAL_CHANGE_ID=$1 REF=$2 eval "$REF=\"\$LOCAL_CHANGE_ID\"" return $ADE_OK } question() { local ERRSTACK_REF="$1"; shift local HINT PROMPT DEFAULT VALIDATE_FNC RATIONALISE_FNC RATIONALISED_RESPONSE_REF RESPONSE RC VALIDATED HINT="$1" PROMPT="$2" DEFAULT="$3" VALIDATE_FNC="$4" RATIONALISE_FNC="$5" RATIONALISED_RESPONSE_REF="$6" [ "X$HINT" = X ] || echo -e "$HINT" while :; do ade_debug "$ERRSTACK_REF" 10 "question: top of loop" [ ! -t 0 ] || echo -n "$PROMPT [$DEFAULT]: "; read RESPONSE || { ade_error "$ERRSTACK_REF" BS_ERR_MISC "EOF"; return $ADE_FAIL; } [ -t 0 ] || echo [ "X$RESPONSE" != X ] || RESPONSE="$DEFAULT" [ "X$RESPONSE" != X. ] || RESPONSE="" ! $VALIDATE_FNC "$ERRSTACK_REF" "$RESPONSE" || break ade_warning "$ERRSTACK_REF" BS_ERR_MISC "invalid response" done ade_debug "$ERRSTACK_REF" 10 "question: before rationalisation RESPONSE=$RESPONSE" if [ "X$RATIONALISE_FNC" = X ]; then eval "$RATIONALISED_RESPONSE_REF=\"$RESPONSE\"" else $RATIONALISE_FNC "$ERRSTACK_REF" "$RESPONSE" $RATIONALISED_RESPONSE_REF fi return $ADE_OK } ade_main bs "$@"