#!/bin/bash # $HeadURL$ $LastChangedRevision$ # Modules . $(bs-config bs_share_prefix)/include/bssupport.sh || { echo "${0##*/}: INTERNAL ERROR: failed to load bssupport.sh" >&2; exit 3; } . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # Other globals main() { local MY_ARGS local PROGRAM VERBOSELEVEL PROGNAME AGGREGATED_RC # Defaults for options # Process options miniade_process_options --help-handler=usage MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments # Sanity checks and derivations # bs sets PROGRAM, but passes it to us through environment as BS_PROGRAM, copy it back. PROGRAM=$BS_PROGRAM VERBOSELEVEL=$BS_VERBOSELEVEL SOURCES_SVNWC_DIR=$BS_SOURCES_SVNWC_DIR SOURCES_SVNREPO_URL=$BS_SOURCES_SVNREPO_URL AUTHFULLNAME=$BS_AUTHFULLNAME AUTHEMAIL=$BS_AUTHEMAIL bssupport_checkset VERBOSELEVEL PROGRAM SOURCES_SVNWC_DIR SOURCES_SVNREPO_URL AUTHFULLNAME AUTHEMAIL miniade_get_progname PROGNAME miniade_set_verboselevel $VERBOSELEVEL bssupport_changestate --id=$PROGRAM --from=unreleased --step=$PROGNAME bssupport_sandbox # Guts # Recently, I switched to *not* checking test output for errors, but only # checking return codes. That means that *any* error detected in the checks # below needs to result in a non-zero exit code. However, when some checks # fail it is nonetheless useful to run a few more checks before exiting due # to the check that failed. So we split these checks into phases. # Start phase #1 RC=0 AGGREGATED_RC=$RC miniade_info "phase #1.1: getting sources ..." cp -r $SOURCES_SVNWC_DIR $PROGRAM || RC=$? miniade_info "phase #1.2: checking is unreleased ..." # This *should* be redundant as the ChangeLog should be in step with bs's # state management. adech --debug=$VERBOSELEVEL --check-unreleased $PROGRAM/doc/ChangeLog || RC=$? # End phase #1 if [ $RC = 0 ]; then : elif $DELAY_FAIL_ENABLED_FLAG; then miniade_warning "something in phase #1 failed (hint: see messages above); exit delayed" AGGREGATED_RC=$RC else miniade_error "something in phase #1 failed (hint: see messages above)" fi # Start phase #2 RC=0 miniade_info "phase #2.1: checking for pullable stuff ..." SVN_OUTPUT=$(svn st -u $PROGRAM | grep '\*' 2>&1) || true [ "X$SVN_OUTPUT" = X ] || { echo "$SVN_OUTPUT"; RC=1; } miniade_info "phase #2.2: checking for pushable stuff ..." SVN_OUTPUT=$(svn st $PROGRAM | grep -v '^\?' 2>&1) || true [ "X$SVN_OUTPUT" = X ] || { echo "$SVN_OUTPUT"; RC=1; } miniade_info "phase #2.3: checking for untagged stuff ..." # Must delete binaries before checking for keywords make -s -C $PROGRAM clean distclean || RC=$? CHECK_OUTPUT=$(find $PROGRAM -name '.svn' -prune -o -type f -print | while read FILE; do ! expr "$FILE" : '.*/\(tests/\(ref\|in\)/.*\|.*/pxe-images/\(linux\|initrd\).*\|\(format\|control\|compat\|changelog\|copyright\|ChangeLog\|COPYING\|README\.1ST\|INSTALL\|INSTALL\.generic\)\|.*\.\(asc\|png\|sqlite\|jpg\|lyx\|run\|dia\|xcf\|mp3\|deb\|bz2\|gz\)\)$' > /dev/null || continue [ "X$(svn pget svn:keywords $FILE 2>/dev/null | paste -d' ' -s)" = "XHeadURL LastChangedRevision" ] || echo "$FILE: no keywords property" # Grep for the keywords but write the keywords in such a way that *this script* won't # have these keywords changed by svn! grep -q '\$Hea[d]URL: .*\$ \$LastCha[n]gedRevision: .* \$' $FILE || echo "$FILE: no keyword placeholders" done) [ "X$CHECK_OUTPUT" = X ] || { echo "$CHECK_OUTPUT"; RC=1; } # End phase #2 if [ $RC = 0 ]; then : elif $DELAY_FAIL_ENABLED_FLAG; then miniade_warning "something in phase #2 failed (hint: see messages above); exit delayed" AGGREGATED_RC=$RC else miniade_error "something in phase #2 failed (hint: see messages above)" fi # Start phase #3 RC=0 miniade_info "phase #3.1: checking compilable ..." # release-source expects test-sources to be quiet unless errors - this includes # when it runs the tests. make -s -C $PROGRAM clean distclean || RC=$? make -s -C $PROGRAM || RC=$? MAKE_OUTPUT=$(make -s -C $PROGRAM tests 2>&1) || { RC=$?; echo "$MAKE_OUTPUT"; } miniade_info "phase #3.2: checking tarballable ..." SANDBOX= $BSSUPPORT_STEP_MAKE_TARBALL_CMD || RC=$? miniade_info "phase #3.3: checking for unignored stuff ..." SVN_OUTPUT=$(svn st $PROGRAM | grep '^\?' 2>&1) || true [ "X$SVN_OUTPUT" = X ] || { echo "$SVN_OUTPUT"; RC=1; } # End phase #3 if [ $RC = 0 ]; then : elif $DELAY_FAIL_ENABLED_FLAG; then miniade_warning "something in phase #3 failed (hint: see messages above); exit delayed" AGGREGATED_RC=$RC else miniade_error "something in phase #3 failed (hint: see messages above)" fi # Start phase #4 RC=0 # End phase #4 if [ $RC = 0 ]; then : elif $DELAY_FAIL_ENABLED_FLAG; then miniade_warning "something in phase #3 failed (hint: see messages above); exit delayed" AGGREGATED_RC=$RC else miniade_error "something in phase #3 failed (hint: see messages above)" fi [ $AGGREGATED_RC = 0 ] || miniade_error "exiting after delayed exit" } main "$@"