#!/bin/bash APP_SVNID='$HeadURL$ $LastChangedRevision$' ## If bs is bs-ing bs then we need to make sure it can find its bits. #eval "[ \"X\$$#\" != Xbs ]" || { # BS_ROOTDIR=$(cd $(dirname $0)/.. && pwd) # PATH=$BS_ROOTDIR/bin:$PATH # BSSUPPORT_BS_SHARE_PREFIX=$BS_ROOTDIR/share # BS_DOC_PREFIX=$BS_ROOTDIR/doc # export BSSUPPORT_BS_SHARE_PREFIX BS_DOC_PREFIX #} . $(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; } 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 # Register application-specific errors ade_err_registerdefderrs BS_DEFINED_ERRORS # Defaults for options DESANDBOXING_FLAG=true ENFORCE_STEP_SEQUENCING_FLAG=true CONFIG_FILE=${BS_CONFIG:-$(bs-config bs_etc_prefix)/$ADE_APP_PROGNAME.conf} # Register bs options ade_opt_register "$ERRSTACK_REF" -o kf: --longoptions=no-desandboxing,no-sequencing,config --callback-template="bs_opt_handler_%s" || return $? ade_msg_register "$ERRSTACK_REF" bs_usage bs_version bs_listpaths || return $? # Process options ade_opt_process "$ERRSTACK_REF" NEW_DOLLAR_AT "$@" || return $? set -- "${NEW_DOLLAR_AT[@]}" # Argument processing ade_err_debug "$ERRSTACK_REF" 10 "main: processing arguments ..." [ $# = 2 ] || ade_msg_usage "$ERRSTACK_REF" VERB=$1 PROGRAM=$2 ade_err_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_err_error "$ERRSTACK_REF" BS_ERR_MISC "can't find components (was looking for $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD)"; return $ADE_ERR_FAIL; } # Check config file loadable and load it if [ ! -r $CONFIG_FILE ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$CONFIG_FILE: not readable" return $ADE_ERR_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_err_error "$ERRSTACK_REF" BS_ERR_MISC "$CONFIG_FILE: failed to load (return code was $RC; output was [$SH_OUTPUT])"; return $ADE_ERR_FAIL; } fi . $CONFIG_FILE export DESANDBOXING_FLAG ENFORCE_STEP_SEQUENCING_FLAG # Delegate 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_msg_usage "$ERRSTACK_REF" ;; esac return $ADE_ERR_OK } bs_opt_handler_config() { local ERRSTACK_REF="$1"; shift CONFIG_FILE="$1" return $ADE_ERR_OK } bs_opt_handler_f() { local ERRSTACK_REF="$1"; shift bs_opt_handler_config "$ERRSTACK_REF" "$@" return $ADE_ERR_OK } bs_opt_handler_k() { local ERRSTACK_REF="$1"; shift bs_opt_handler_no_desandboxing "$ERRSTACK_REF" "$@" return $ADE_ERR_OK } bs_opt_handler_no_desandboxing() { local ERRSTACK_REF="$1"; shift DESANDBOXING_FLAG=false return $ADE_ERR_OK } bs_opt_handler_no_desandboxing() { local ERRSTACK_REF="$1"; shift DESANDBOXING_FLAG=false return $ADE_ERR_OK } bs_opt_handler_no_sequencing() { local ERRSTACK_REF="$1"; shift ENFORCE_STEP_SEQUENCING_FLAG=false return $ADE_ERR_OK } bs_usage() { local ERRSTACK_REF="$1"; shift local USAGETEXT_REF="$1"; shift local PASSNO=$1; shift if [ $PASSNO = 1 ]; then eval "$USAGETEXT_REF=\" \"" elif [ $PASSNO = 2 ]; then eval "$USAGETEXT_REF=\"\ -f | --config= set config file -k | --no-desandboxing don't delete sandbox --no-sequencing overrule sequence restrictions 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\"" fi return $ADE_ERR_OK } bs_listpaths() { local ERRSTACK_REF="$1"; shift local PATHLIST_REF=$1; shift eval "$PATHLIST_REF=\"\"" return $ADE_ERR_OK } bs_version() { local ERRSTACK_REF="$1"; shift local VERSION_REF=$1; shift ade_smf_extractversionfromsvnstring "$ERRSTACK_REF" "$APP_SVNID" "$VERSION_REF" return $ADE_ERR_OK } status() { local ERRSTACK_REF="$1" ade_err_debug "$ERRSTACK_REF" 10 "status: calling $BSSUPPORT_STEP_STATUS_CMD ..." CMDLINE="PROGRAM=$PROGRAM SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_STATUS_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_STATUS_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } schedule_sources() { local ERRSTACK_REF="$1" local DFLT_CHANGE_TYPE CHANGE_ID # 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 CMDLINE="PROGRAM=$PROGRAM CHANGE_ID=$CHANGE_ID SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM CHANGE_TYPE=$CHANGE_TYPE VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } test_sources() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL AUTHEMAIL=$AUTHEMAIL AUTHFULLNAME=\"$AUTHFULLNAME\" $BSSUPPORT_STEP_TEST_SOURCES_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_TEST_SOURCES_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } release_sources() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL AUTHEMAIL=$AUTHEMAIL AUTHFULLNAME=\"$AUTHFULLNAME\" $BSSUPPORT_STEP_RELEASE_SOURCES_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_RELEASE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } make_tarball() { local ERRSTACK_REF="$1" ade_err_debug "$ERRSTACK_REF" 10 "make_tarball: sof" CMDLINE="PROGRAM=$PROGRAM SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR AUTHEMAIL=$AUTHEMAIL AUTHFULLNAME=\"$AUTHFULLNAME\" VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_MAKE_TARBALL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_MAKE_TARBALL_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } schedule_pkgctrl() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_SCHEDULE_PKGCTRL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_SCHEDULE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } test_pkgctrl() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_TEST_PKGCTRL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_TEST_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } release_pkgctrl() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_RELEASE_PKGCTRL_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_RELEASE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } make_package() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian TARBALL_TGZREPO_DIR=$TARBALL_TGZREPO_DIR PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR PACKAGE_RPMREPO_DIR=$PACKAGE_RPMREPO_DIR PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_MAKE_PACKAGE_CMD" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_MAKE_PACKAGE_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } prologue_sources() { local ERRSTACK_REF="$1" ade_err_debug "$ERRSTACK_REF" 10 "prologue_sources: PROGRAM=$PROGRAM" CMDLINE="PROGRAM=$PROGRAM SOURCES_SVNREPO_URL=$SOURCES_SVNREPO_URL_PREFIX/$PROGRAM SOURCES_SVNWC_DIR=$SOURCES_SVNWC_DIR_PREFIX/$PROGRAM SITE_PROLOGUE_SOURCES_CMD=\"\$SITE_PROLOGUE_SOURCES_CMD\" VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_PROLOGUE_SOURCES_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_PROLOGUE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } epilogue_sources() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM SITE_EPILOGUE_SOURCES_CMD=\"\$SITE_EPILOGUE_SOURCES_CMD\" VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_EPILOGUE_SOURCES_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_EPILOGUE_SOURCES_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } prologue_pkgctrl() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM PKGCTRL_SVNREPO_URL=$PKGCTRL_SVNREPO_URL_PREFIX/$PROGRAM.debian PKGCTRL_SVNWC_DIR=$PKGCTRL_SVNWC_DIR_PREFIX/$PROGRAM.debian SITE_PROLOGUE_PKGCTRL_CMD=\"\$SITE_PROLOGUE_PKGCTRL_CMD\" VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_PROLOGUE_PKGCTRL_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_PROLOGUE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_OK } epilogue_pkgctrl() { local ERRSTACK_REF="$1" CMDLINE="PROGRAM=$PROGRAM PACKAGE_DEBREPO_DIR=$PACKAGE_DEBREPO_DIR PACKAGE_RPMREPO_DIR=$PACKAGE_RPMREPO_DIR SITE_EPILOGUE_PKGCTRL_CMD=\"\$SITE_EPILOGUE_PKGCTRL_CMD\" VERBOSELEVEL=$ADE_MSG_VERBOSELEVEL $BSSUPPORT_STEP_EPILOGUE_PKGCTRL_CMD \"\$@\"" RC=0; eval "$CMDLINE" || RC=$? if [ $RC != 0 ]; then ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "$(basename $BSSUPPORT_STEP_EPILOGUE_PKGCTRL_CMD) failed (hint: see messages above)" return $ADE_ERR_FAIL fi return $ADE_ERR_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_ERR_OK else return $ADE_ERR_FAIL fi } rationalise_change_type() { local ERRSTACK_REF="$1"; shift local LOCAL_CHANGE_TYPE LOCAL_CHANGE_TYPE=$1 REF=$2 ade_err_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_ERR_OK } validate_change_id() { local ERRSTACK_REF="$1"; shift local CHANGE_ID CHANGE_ID=$1 return $ADE_ERR_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_ERR_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_err_debug "$ERRSTACK_REF" 10 "question: top of loop" [ ! -t 0 ] || echo -n "$PROMPT [$DEFAULT]: "; read RESPONSE || { ade_err_error "$ERRSTACK_REF" BS_ERR_MISC "EOF"; return $ADE_ERR_FAIL; } [ -t 0 ] || echo [ "X$RESPONSE" != X ] || RESPONSE="$DEFAULT" [ "X$RESPONSE" != X. ] || RESPONSE="" ! $VALIDATE_FNC "$ERRSTACK_REF" "$RESPONSE" || break ade_err_warning "$ERRSTACK_REF" BS_ERR_MISC "invalid response" done ade_err_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_ERR_OK } ade_gep_main bs "$@"