#!/bin/bash APP_SVNID='$HeadURL$ $LastChangedRevision$' . $(ade-config ade_share_prefix)/include/ade.sh || { echo "${0##*/}: INTERNAL ERROR: failed to load ade.sh" >&2; exit 3; } ADECH_DEFINED_ERRORS=( "KEY=ADECH_ERR_MISC; FMT=\"%s\"" ) adech() { local ERRSTACK_REF="$1"; shift local RC LABEL local -a NEW_DOLLAR_AT local MODE TYPE CHANGELOG_FILE COMMENT # Register application-specific errors ade_register_error_types ADECH_DEFINED_ERRORS # Defaults for options MODE=unset PROGRAM= COMMENT="please change this text!" # Register options ade_register_options "$ERRSTACK_REF" --longoptions=bump-bug,bump-feature,bump-rewrite,check-released,check-unreleased,finalise,program:,comment: --callback-template="handle_option_%s" || return $? ade_set_callbacks "$ERRSTACK_REF" adech_usage_help adech_version adech_paths || return $? # Process options ade_process_options "$ERRSTACK_REF" NEW_DOLLAR_AT "$@" || return $? set -- "${NEW_DOLLAR_AT[@]}" ade_debug "$ERRSTACK_REF" 10 "adech: MODE=$MODE" [ $MODE != unset ] || ade_show_bad_usage "$ERRSTACK_REF" # Process arguments ade_debug "$ERRSTACK_REF" 10 "adech: processing args ..." [ $# = 1 ] || ade_show_bad_usage "$ERRSTACK_REF" CHANGELOG_FILE=$1 # Guts case $MODE in bump) bump "$ERRSTACK_REF" || return $? ;; check) check "$ERRSTACK_REF" || return $? ;; finalise) finalise "$ERRSTACK_REF" || return $? ;; esac return $ADE_OK } bump() { local ERRSTACK_REF="$1"; shift local VERSION CHANGELOG_REWRITE_NUMBER CHANGELOG_FEATURE_NUMBER CHANGELOG_BUG_NUMBER ade_debug "$ERRSTACK_REF" 10 "bump: CHANGELOG_FILE=$CHANGELOG_FILE, TYPE=$TYPE, pwd=$(pwd)" if [ ! -f $CHANGELOG_FILE ]; then ade_debug "$ERRSTACK_REF" 10 "bump: about to call ade_error() ..." ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "please create an empty ChangeLog" return $ADE_FAIL elif [ $(stat -c %s $CHANGELOG_FILE) = 0 ]; then VERSION=0 else TYPE=released check "$ERRSTACK_REF" || return $? if ! [[ $(head -1 $CHANGELOG_FILE) =~ ^Release\ ([^ .]+)(\.([^ .]+)(\.([^ .]+))?)?\ \(.*\)$ ]]; then ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "$CHANGELOG_FILE: malformed first line (it should be 'Release ()')" return $ADE_FAIL fi CHANGELOG_REWRITE_NUMBER=${BASH_REMATCH[1]} CHANGELOG_FEATURE_NUMBER=${BASH_REMATCH[3]} CHANGELOG_BUG_NUMBER=${BASH_REMATCH[5]} case $TYPE in bug) VERSION=${CHANGELOG_REWRITE_NUMBER:-0}.${CHANGELOG_FEATURE_NUMBER:-0}.$((${CHANGELOG_BUG_NUMBER:-0} + 1)) ;; feature) VERSION=${CHANGELOG_REWRITE_NUMBER:-0}.$((${CHANGELOG_FEATURE_NUMBER:-0} + 1)) ;; rewrite) VERSION=$((${CHANGELOG_REWRITE_NUMBER:-0} + 1)) ;; esac if ! [[ $(sed -n 3p $CHANGELOG_FILE) =~ ^\ \ \*\ ([^:]{1,}):\ .*$ ]]; then ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "$CHANGELOG_FILE: malformed third line (it should be ' * : ')" return $ADE_FAIL fi PROGRAM=${BASH_REMATCH[1]} fi [ "X$PROGRAM" != X ] || { ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "program unknown (do you need to use '--program='?)"; return $ADE_FAIL; } { echo "Release $VERSION ($(date)) - UNRELEASED"; echo; echo " * $PROGRAM: $COMMENT"; echo; cat $CHANGELOG_FILE; } > ChangeLog.$$ cat ChangeLog.$$ > $CHANGELOG_FILE rm -f ChangeLog.$$ return $ADE_OK } check() { local ERRSTACK_REF="$1"; shift local RELEASED_FLAG UNRELEASED_FLAG { [[ $(head -1 $CHANGELOG_FILE) =~ ^Release\ .*\ \(.*\)$ ]] && RELEASED_FLAG=true; } || RELEASED_FLAG=false { [[ $(head -1 $CHANGELOG_FILE) =~ ^Release\ .*\ \(.*\)\ -\ UNRELEASED$ ]] && UNRELEASED_FLAG=true; } || UNRELEASED_FLAG=false if [ $TYPE = released ] && $RELEASED_FLAG; then : elif [ $TYPE = unreleased ] && $UNRELEASED_FLAG; then : elif [ $TYPE = released ] && $UNRELEASED_FLAG; then ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "ChangeLog is unreleased!" return $ADE_FAIL elif [ $TYPE = unreleased ] && $RELEASED_FLAG; then ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "ChangeLog is released!" return $ADE_FAIL else ade_error "$ERRSTACK_REF" ADECH_ERR_MISC "ChangeLog is unparsable!" return $ADE_FAIL fi return $ADE_OK } finalise() { local ERRSTACK_REF="$1"; shift TYPE=unreleased check "$ERRSTACK_REF" || return $? sed -i "1s/(.*) - UNRELEASED\$/($(date))/" $CHANGELOG_FILE return $ADE_OK } handle_option_bump_bug() { local ERRSTACK_REF="$1"; shift MODE=bump TYPE=bug return $ADE_OK } handle_option_bump_feature() { local ERRSTACK_REF="$1"; shift MODE=bump TYPE=feature return $ADE_OK } handle_option_bump_rewrite() { local ERRSTACK_REF="$1"; shift MODE=bump TYPE=rewrite return $ADE_OK } handle_option_check_released() { local ERRSTACK_REF="$1"; shift MODE=check TYPE=released return $ADE_OK } handle_option_check_unreleased() { local ERRSTACK_REF="$1"; shift MODE=check TYPE=unreleased return $ADE_OK } handle_option_finalise() { local ERRSTACK_REF="$1"; shift MODE=finalise return $ADE_OK } handle_option_program() { local ERRSTACK_REF="$1"; shift PROGRAM="$1" return $ADE_OK } handle_option_comment() { local ERRSTACK_REF="$1"; shift COMMENT="$1" return $ADE_OK } adech_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=\"\ --program= set program name --bump-{bug|feature|rewrite} specify bump type --check-{released|unreleased} check (un)released --finalise finalise ChangeLog\"" return $ADE_OK } adech_paths() { local ERRSTACK_REF="$1"; shift local PATHLIST_REF=$1; shift eval "$PATHLIST_REF=\"\"" return $ADE_OK } adech_version() { local ERRSTACK_REF="$1"; shift local VERSION_REF=$1; shift ade_extract_version "$ERRSTACK_REF" "$APP_SVNID" "$VERSION_REF" return $ADE_OK } ade_main adech "$@"