# $HeadURL$ $LastChangedRevision$ ######################################################################## # # Public functions # ######################################################################## ######################################################################## # # Public functions to access module-private variable # ######################################################################## ######################################################################## # # Module-private functions # ######################################################################## # BEWARE: keep aligned with almost identical function in miniade.sh! _bssupport_replace_function() { local OLD_FNCREF NEW_FNCREF [ $# = 2 ] || miniade_internal "_miniade_replace_function: bad argument count ($#)" OLD_FNCREF=$1 NEW_FNCREF=$2 eval "$OLD_FNCREF() { miniade_warning \"$OLD_FNCREF() is obsolete; switch to $NEW_FNCREF()\" $NEW_FNCREF \"\$@\" }" } ######################################################################## # # Module-private variables # ######################################################################## _BSSUPPORT_BS_SHARE_PREFIX=$(bs-config bs_share_prefix) ######################################################################## # # Public variables # ######################################################################## # These should be replaced by *private* variables and provided with # access functions. BSSUPPORT_RCDIR=$HOME/.bs BSSUPPORT_STEP_STATUS_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/status BSSUPPORT_STEP_SCHEDULE_SOURCES_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/schedule-sources BSSUPPORT_STEP_TEST_SOURCES_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/test-sources BSSUPPORT_STEP_RELEASE_SOURCES_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/release-sources BSSUPPORT_STEP_MAKE_TARBALL_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/make-tarball BSSUPPORT_STEP_SCHEDULE_PKGCTRL_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/schedule-pkgctrl BSSUPPORT_STEP_TEST_PKGCTRL_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/test-pkgctrl BSSUPPORT_STEP_RELEASE_PKGCTRL_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/release-pkgctrl BSSUPPORT_STEP_MAKE_PACKAGE_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/make-package BSSUPPORT_STEP_PROLOGUE_SOURCES_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/prologue-sources BSSUPPORT_STEP_EPILOGUE_SOURCES_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/epilogue-sources BSSUPPORT_STEP_PROLOGUE_PKGCTRL_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/prologue-pkgctrl BSSUPPORT_STEP_EPILOGUE_PKGCTRL_CMD=$_BSSUPPORT_BS_SHARE_PREFIX/steps/epilogue-pkgctrl ######################################################################## # # Module-private variables with public access functions # ######################################################################## # (none) bssupport_checkset() { local VAR for VAR in $*; do if eval "[ \"X\$$VAR\" = X ]"; then miniade_error "$VAR: not set" eval "miniade_debug 10 \"checkset: $VAR=\\\"\$$VAR\\\"\"" fi done } bssupport_sandbox() { local RC [ "X$SANDBOX" = X ] || return 0 miniade_info "entering sandbox ..." export SANDBOX=/var/tmp/$PROGNAME.$$.sandbox mkdir $SANDBOX cd $SANDBOX RC=0; $0 || RC=$? miniade_info "leaving sandbox ..." cd / if [ "X$DESANDBOXING_FLAG" != Xfalse ]; then rm -fr $SANDBOX else miniade_info "sandbox was preserved in $SANDBOX" fi miniade_debug 10 "sandbox: exiting with code $RC ..." exit $RC } bssupport_changestate() { local FROM_STATES TO_STATE CURRENT_STATE RC STEPNAME ID # Defaults for options # Process options _bssupport_special_opts_handler() { case $1 in --id=*) ID=${1#*=} ;; --from=*) FROM_STATES=${1#*=} ;; --to=*) TO_STATE=${1#*=} ;; --step=*) STEPNAME=${1#*=} ;; *) return 1 ;; esac } miniade_process_options --no-standard-opts --help-handler=usage --special-opts-handler=_bssupport_special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# = 0 ] || usage # Sanity checks and derivations [ "X$CHANGESTATE" = X ] || return 0 miniade_debug 10 "changestate: ID=$ID, FROM_STATES=[$FROM_STATES], TO_STATE=$TO_STATE" if [ "X$FROM_STATES" = X ]; then miniade_info "not checking source state" else miniade_info "checking source state ..." bssupport_checkstate --id=$ID --from=$FROM_STATES --step=$STEPNAME fi # Guts export CHANGESTATE=true RC=0; $0 || RC=$? if [ "X$TO_STATE" = X ]; then miniade_info "not setting target state" elif [ $RC = 0 ]; then miniade_info "setting target state ..." bssupport_setstate $ID $TO_STATE else miniade_info "not setting target state" fi exit $RC } bssupport_checkstate() { local ID FROM_STATES FROM_STATE STEPNAME STATE # Process options _bssupport_special_opts_handler() { case $1 in --id=*) ID=${1#*=} ;; --from=*) FROM_STATES=${1#*=} ;; --step=*) STEPNAME=${1#*=} ;; *) return 1 ;; esac } miniade_process_options --no-standard-opts --help-handler=usage --special-opts-handler=_bssupport_special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" if [ "X$ENFORCE_STEP_SEQUENCING_FLAG" != Xtrue ]; then miniade_debug 10 "checkstate: step sequence enforcement is disabled; returning 0 ..." return 0 fi bssupport_getstate $ID STATE miniade_debug 10 "checkstate: ID=$ID, STATE=$STATE, FROM_STATES=[$FROM_STATES]" FOUND=false for FROM_STATE in ${FROM_STATES//,/ }; do if [ "X$STATE" = "X$FROM_STATE" ]; then FOUND=true break fi done if ! $FOUND; then miniade_error "this step cannot be performed in the current state ($STATE)" fi return 0 } bssupport_get_released_sources_version() { local CHANGELOG_FILE VARREF [ $# = 2 ] || miniade_internal "get_released_sources_version: $#: invalid argument count" CHANGELOG_FILE=$1 VARREF=$2 miniade_internal "get_released_sources_version: not implemented (I didn't think it was needed)" } bssupport_get_unreleased_sources_version() { local CHANGELOG_FILE VARREF [ $# = 2 ] || miniade_internal "get_unreleased_sources_version: $#: invalid argument count" CHANGELOG_FILE=$1 VARREF=$2 [[ $(head -1 $CHANGELOG_FILE) =~ ^Release\ (.*)\ \(.*\)\ -\ UNRELEASED$ ]] || miniade_error "ChangeLog not parsable (hint: first line of $CHANGELOG_FILE should be 'Release ( - UNRELEASED')" eval "$VARREF=\"\${BASH_REMATCH[1]}\"" } bssupport_get_sources_version() { local CHANGELOG_FILE VARREF [ $# = 2 ] || miniade_internal "get_sources_version: $#: invalid argument count" CHANGELOG_FILE=$1 VARREF=$2 # Extract version and nothing or " - UNRELEASED". [[ $(head -1 $CHANGELOG_FILE) =~ ^Release\ ([^\ ]+)\ \(.*\)(|\ -\ UNRELEASED)$ ]] || miniade_error "$CHANGELOG_FILE: not parsable" eval "$VARREF=\"${BASH_REMATCH[1]}${BASH_REMATCH[2]// /}\"" } bssupport_get_unreleased_pkgctrl_version() { local CHANGELOG_FILE VARREF [ $# = 2 ] || miniade_internal "get_unreleased_pkgctrl_version: $#: invalid argument count" CHANGELOG_FILE=$1 VARREF=$2 # Sanity checks and derivations bssupport_checkset PROGRAM # Guts [[ $(head -1 $CHANGELOG_FILE) =~ ^$PROGRAM\ \((.*-.*)\)\ UNRELEASED\;\ urgency=medium$ ]] || miniade_error "changelog not parsable (hint: first line of $CHANGELOG_FILE should be '$PROGRAM (-) UNRELEASED; urgency=')" eval "$VARREF=\"\${BASH_REMATCH[1]}\"" } bssupport_get_released_pkgctrl_version() { local CHANGELOG_FILE VARREF [ $# = 2 ] || miniade_internal "get_released_pkgctrl_version: $#: invalid argument count" CHANGELOG_FILE=$1 VARREF=$2 # Sanity checks and derivations bssupport_checkset PROGRAM # Guts [[ $(head -1 $CHANGELOG_FILE) =~ ^.*\ \((.*)-(.*)\)\ .*$ ]] || miniade_error "changelog not parsable (hint: first line of $CHANGELOG_FILE should be '$PROGRAM (-) ; urgency=')" eval "$VARREF=\"\${BASH_REMATCH[1]}\"" # We capture the revision as well as the version, but it's not used. Probably we sould # not capture it. } bssupport_get_pkgctrl_version() { local CHANGELOG_FILE VARREF [ $# = 2 ] || miniade_internal "get_pkgctrl_version: $#: invalid argument count" CHANGELOG_FILE=$1 VARREF=$2 # Extract version and "UNRELEASED" or don't extract anything and let .* slurp rest. [[ $(head -1 $CHANGELOG_FILE) =~ ^[^\ ]+\ \(([^\)]+)\)\ (UNRELEASED|).*$ ]] || miniade_error "$CHANGELOG_FILE: can't parse" eval "$VARREF=\"${BASH_REMATCH[1]}${BASH_REMATCH[2]:+-}${BASH_REMATCH[2]}\"" } bssupport_setstate() { local STATES_DIR STATE STATE_FILE ID ID=$1 STATE=$2 STATES_DIR=$BSSUPPORT_RCDIR/program-states STATE_FILE=$STATES_DIR/$ID [ "X$ENFORCE_STEP_SEQUENCING_FLAG" = Xtrue ] || return 0 mkdir -p $STATES_DIR echo $STATE > $STATE_FILE } bssupport_getstate() { local STATES_DIR STATE_FILE ID [ $# = 2 ] || miniade_internal "getstate: $#: invalid argument count" ID=$1 STATE_REF=$2 miniade_debug 10 "getstate: ID=$1, STATE_REF=$2" STATES_DIR=$BSSUPPORT_RCDIR/program-states STATE_FILE=$STATES_DIR/$ID [ -f $STATE_FILE ] || { mkdir -p $STATES_DIR; echo uninitialised > $STATE_FILE; } eval "$STATE_REF=\"$(cat $STATE_FILE)\"" } ######################################################################## # # Actual code # ######################################################################## _bssupport_replace_function internal miniade_internal _bssupport_replace_function error miniade_error _bssupport_replace_function warning miniade_warning _bssupport_replace_function info miniade_info _bssupport_replace_function debug miniade_debug _bssupport_replace_function checkinstalled miniade_validate_command _bssupport_replace_function checkset bssupport_checkset _bssupport_replace_function sandbox bssupport_sandbox _bssupport_replace_function changestate bssupport_changestate _bssupport_replace_function checkstate bssupport_checkstate _bssupport_replace_function setstate bssupport_setstate _bssupport_replace_function getstate bssupport_getstate _bssupport_replace_function get_released_sources_version bssupport_get_released_sources_version _bssupport_replace_function get_unreleased_sources_version bssupport_get_unreleased_sources_version _bssupport_replace_function get_sources_version bssupport_get_sources_version _bssupport_replace_function get_unreleased_pkgctrl_version bssupport_get_unreleased_pkgctrl_version _bssupport_replace_function get_released_pkgctrl_version bssupport_get_released_pkgctrl_version _bssupport_replace_function get_pkgctrl_version bssupport_get_pkgctrl_version