flush
[m6w6/btr] / lib / btr / btr.sh
index 04cf1c209922910ac76677d1faf405119fd88944..d0db0953cab4837a538e102f4d0c3fba647f0aba 100755 (executable)
 #!/bin/sh
 
 function help {
-    echo "btr v0.2.0, (c) Michael Wallner <mike@php.net>"
-    echo
-    echo "Usage: $(basename $0) [-hv] [<options>] <repository>"
-    echo
-    echo "    -h, --help      Display this help"
-    echo "    -v, --verbose   Be more verbose"
-    echo
-    echo "  Options:"
-    echo "    -s, --source=<rules>          Use the specified source ruleset"
-    echo "    -b, --build=<rules>           Use the specified build ruleset"
-    echo "    -r, --report=<rules>          Use the specifued report ruleset"
-    echo "    -B, --branch=<branch>         Checkout this branch"
-    echo "    -D, --directory=<directory>   Use this directory as work root"
-    echo "    -S, --suffix=<suffix>         Append suffix to the build name"
-    echo "    -C, --configure=<options>     Define \$CONFIGURE options"
-    echo
-    echo "  Rulesets:"
-    echo "    source: git"
-    echo "    build:  php"
-    echo "    report: mail"
-    echo
-    exit
+       echo "btr v0.3.0, (c) Michael Wallner <mike@php.net>"
+       echo
+       echo "Usage: $(basename $0) [-hyvqcC] [<options>]"
+       echo
+       echo "    -h, --help      Display this help"
+       echo "    -y, --yes       Always assume yes"
+       echo "    -v, --verbose   Be more verbose"
+       echo "    -q, --quiet     Be more quiet"
+       echo "    -c, --clean     Clean build"
+       echo "    -C, --vcsclean  Clean repo/branch"
+       echo
+       echo "  Options:"
+       echo "    -f, --config=<file>           Read configuration from a file"
+       echo "    -s, --source=<rules>          Use the specified source ruleset"
+       echo "    -b, --build=<rules>           Use the specified build ruleset"
+       echo "    -r, --report=<rules>          Use the specifued report ruleset"
+       echo "    -T, --test=<args>             Provide test runner arguments"
+       echo "    -B, --branch=<branch>         Checkout this branch"
+       echo "    -D, --directory=<directory>   Use this directory as work root"
+       echo "    -S, --suffix=<suffix>         Append suffix to the build name"
+       echo
+       echo "  Rules format:"
+       echo "    type=argument    e.g: git=git@github.com:m6w6/btr.git"
+       echo "                          irc=irc://btr@chat.freenode.org/#btr"
+       echo "                          mail=\"-c copy@to rcpt@to\""
+       echo "                          notify-send=\"-u low\""
+       echo
+       echo "    Note though, that some rules do not use any argument."
+       echo
+       echo "  Rulesets:"
+       for ruleset in source build report
+       do
+               printf "    %10s: %s\n" $ruleset \
+                       "$(find "$LIBDIR/$ruleset" -name '*.mk' -exec basename {} .mk \; | sort | xargs)"
+       done
+       echo
+       echo "  Examples:"
+       echo 
+       echo "  Clone PHP's git, use PHP-5.5 branch, build with php ruleset and"
+       echo "  run the test suite with valgrind (-m) on a debug build and report"
+       echo "  the results with a simple OSD notification:"
+       echo "    $ btr -s git=git@php.net:php/php-src.git -B PHP-5.5 \\"
+       echo "          -b \"php=--enable-debug\" -T-m -r notify-send"
+       echo "  See also php.example.conf"
+       echo
+       echo "  Clone CURL's git (use master), build with GNU autotools"
+       echo "  ruleset which runs 'make check' and mail the report to the"
+       echo "  current user. Verbosely show all actions taken:"
+       echo "    $ btr -v -s git=https://github.com/bagder/curl.git -b gnu -r mail"
+       echo "  See also curl.example.conf"
+       echo
+       exit
 }
 
 function parseopts {
-    local shortoptions="hvB:D:S:C:s:b:r:"
-    local longoptions="help,verbose,branch:,directory:,suffix:,configure:,source:,build:,report:"
-    local options=$(getopt \
-        --options "$shortoptions" \
-        --longoptions "$longoptions" \
-        -- "$@" \
-    )
+       local shortoptions="hvqycCf:T:B:D:S:s:b:r:"
+       local longoptions="help,verbose,quiet,yes,clean,vcsclean,config:,test:,branch:,directory:,suffix:,source:,build:,report:"
+       local options=$(getopt \
+               --options "$shortoptions" \
+               --longoptions "$longoptions" \
+               -- "$@" \
+       )
 
-    if test $? -ne 0 ; then
-        help
-    fi
-    
-    eval set -- "$options"
-    
-    while test $# -gt 0
-    do
-        case "$1" in
-            -h|--help)
-                help
-                ;;
-            -v|--verbose)
-                VERBOSE=true
-                ;;
-            ####
-            -B|--branch)
-                BRANCH="$2"
-                shift
-                ;;
-            -D|--directory)
-                BTRDIR="$2"
-                shift
-                ;;
-            -S|--suffix)
-                SUFFIX="$2"
-                shift
-                ;;
-            -C|--configure)
-                CONFIGURE="$2"
-                shift
-                ;;
-            ####
-            -s|--source)
-                   case "$2" in
-                       git)
-                               SOURCE_RULES="git"
-                               test -z "$BRANCH" && BRANCH="master"
-                               ;;
-                           svn)
-                               SOURCE_RULES="svn"
-                               test -z "$BRANCH" && BRANCH="trunk"
-                               ;;
-                esac
-                shift
-                ;;
-            -b|--build)
-               case "$2" in
-                       php|pecl)
-                               BUILD_RULES="$2"
-                               ;;
-               esac
-               shift
-                ;;
-            -r|--report)
-               case "$2" in
-                       mail)
-                               REPORT_RULES="$2"
-                               ;;
-               esac
-               shift
-               ;;
-            ####
-            --)
-                SOURCE_URL="$2"
-                shift
-                ;;
-        esac
-        shift
-    done
+       if test $? -ne 0 ; then
+               help
+       fi
+       
+       eval set -- "$options"
+       
+       while test $# -gt 0
+       do
+               case "$1" in
+                       -h|--help)
+                               help
+                               ;;
+                       -v|--verbose)
+                               QUIET=false
+                               VERBOSE=true
+                               ;;
+                       -q|--quiet)
+                               QUIET=true
+                               VERBOSE=false
+                               ;;
+                       -y|--yes)
+                               FORCEYES=true
+                               ;;
+                       -c|--clean)
+                               BUILD_CLEAN=true
+                               ;;
+                       -C|--vcsclean)
+                               SOURCE_CLEAN=true
+                               ;;
+                       ####
+                       -f|--config)
+                               source "$2"
+                               shift
+                               ;;
+                       ####
+                       -B|--branch)
+                               BRANCH="$2"
+                               shift
+                               ;;
+                       -D|--directory)
+                               BTRDIR="$2"
+                               shift
+                               ;;
+                       -S|--suffix)
+                               SUFFIX="$2"
+                               shift
+                               ;;
+                       -T|--test)
+                               TEST_ARGS="$2"
+                               shift
+                               ;;
+                       ####
+                       -s|--source)
+                               case "$2" in
+                               git*)
+                                       test -z "$BRANCH" && BRANCH=master
+                                       ;;
+                               svn*)
+                                       test -z "$BRANCH" && BRANCH=trunk
+                                       ;;
+                               cvs*)
+                                       test -z "$BRANCH" && BRANCH=HEAD
+                                       ;;
+                               esac
+                               SOURCE_RULES="$(cut -d= -f1 <<<$2)"
+                               SOURCE_ARGS="$(cut -s -d= -f2- <<<$2)"
+                               shift
+                               ;;
+                       -b|--build)
+                               BUILD_RULES="$(cut -d= -f1 <<<$2)"
+                               BUILD_ARGS="$(cut -s -d= -f2- <<<$2)"
+                               shift
+                               ;;
+                       -r|--report)
+                               REPORT_RULES="$(cut -d= -f1 <<<$2)"
+                               REPORT_ARGS="$(cut -s -d= -f2- <<<$2)"
+                               shift
+                               ;;
+                       ####
+                       --)
+                               # legacy
+                               if test "$2"
+                               then
+                                       SOURCE_ARGS="$2"
+                               fi
+                               shift
+                               ;;
+               esac
+               shift
+       done
 }
 
 function error {
-    echo "$@" >&2
-    exit
+       echo "$@" >&2
+       exit
 }
 
 function setup {
-    if test -z "$SOURCE_URL" -o -z "$SOURCE_RULES" -o -z "$BUILD_RULES" -o -z "$REPORT_RULES"
-    then
-        help
-    fi
+       if test -z "$SOURCE_RULES" -o -z "$BUILD_RULES" -o -z "$REPORT_RULES"
+       then
+               help
+       fi
 
-    export SOURCE_URL BRANCH SOURCE_RULES BUILD_RULES REPORT_RULES
+       if $VERBOSE
+       then
+               QUIET_FLAG=
+               SILENT_FLAG=
+               VERBOSE_FLAG="-v"
+               SAY="echo; echo"
+       elif $QUIET
+       then
+               QUIET_FLAG="-q"
+               SILENT_FLAG="-s"
+               VERBOSE_FLAG=
+               SAY="@true"
+       else
+               QUIET_FLAG=
+               SILENT_FLAG="-s"
+               VERBOSE_FLAG=
+               SAY="@echo"
+       fi
+       
+       export QUIET VERBOSE FORCEYES QUIET_FLAG SILENT_FLAG VERBOSE_FLAG SAY
+       
+       if test -z "$BTRDIR"
+       then
+               export BTRDIR="/tmp/btr"
+       else
+               export BTRDIR=$(realpath "$BTRDIR")
+       fi
+       
+       mkdir -p "$BTRDIR" || error "Could not create $BTRDIR"
 
-    if test -z "$BTRDIR"
-    then
-        export BTRDIR="/tmp/btr"
-    else
-        export BTRDIR=$(realpath "$BTRDIR")
-    fi
+       
+       export SOURCE_RULES BUILD_RULES REPORT_RULES
+       test -z "$SOURCE_ARGS"  || export SOURCE_ARGS
+       test -z "$SOURCE_CLEAN" || export SOURCE_CLEAN
+       test -z "$BUILD_ARGS"   || export BUILD_ARGS
+       test -z "$BUILD_CLEAN"  || export BUILD_CLEAN
+       test -z "$TEST_ARGS"    || export TEST_ARGS
+       test -z "$REPORT_ARGS"  || export REPORT_ARGS
+       REPO=$(basename $(sed -re 's~^.*[/:#]~~' <<<"$SOURCE_ARGS") .git)
+       SAFE_BRANCH=$(tr ":" "_" <<<$(basename "$BRANCH"))
+       export REPO BRANCH SAFE_BRANCH
 
-    export REPO=$(basename $(sed -re 's~^.*[/:]~~' <<<"$SOURCE_URL") .git)
-    export SAFE_BRANCH=$(tr ":" "_" <<<$(basename "$BRANCH"))
+       if test -z "$SUFFIX"
+       then
+               export BUILD="$REPO@$SAFE_BRANCH"
+       else
+               export BUILD="$REPO@$SAFE_BRANCH-$SUFFIX"
+       fi
 
-    if test -z "$SUFFIX"
-    then
-        export BUILD="$REPO@$SAFE_BRANCH"
-    else
-        export BUILD="$REPO@$SAFE_BRANCH-$SUFFIX"
-    fi
-
-    export CLEAN_DIR="btr+clean-$REPO"
-    export BRANCH_DIR="btr+branch-$REPO@$SAFE_BRANCH"
-    export BUILD_DIR="btr+build-$BUILD"
-    export CONFIG_REPORT="btr+config-$BUILD-$DATE"
-    export BUILD_REPORT="btr+build-$BUILD-$DATE"
-    export TEST_REPORT="btr+tests-$BUILD-$DATE"
-    export LAST_REPORT=$(basename $(ls -t "$BTRDIR/btr+tests-$BUILD"* | tail -n1))
-    export REPORT=""
+       export CLEAN_DIR="btr+clean-$REPO"
+       export BRANCH_DIR="btr+branch-$REPO@$SAFE_BRANCH"
+       export BUILD_DIR="btr+build-$BUILD"
+       export CONFIG_REPORT="btr+config-$BUILD-$DATE"
+       export BUILD_REPORT="btr+build-$BUILD-$DATE"
+       export TEST_REPORT="btr+tests-$BUILD-$DATE"
+       export LAST_REPORT=$(basename $(ls -t "$BTRDIR/btr+tests-$BUILD"* 2>/dev/null | head -n1) 2>/dev/null)
+       export REPORT="btr+report-$BUILD-$DATE"
 }
 
 function show_conf {
-    echo
-    echo "BTRDIR         = $BTRDIR"
-    echo "BINDIR         = $BINDIR"
-    echo "LIBDIR         = $LIBDIR"
-    echo "SOURCE_URL     = $SOURCE_URL"
-    echo "SOURCE_RULES   = $SOURCE_RULES"
-    echo "BUILD_RULES    = $BUILD_RULES"
-    echo "REPORT_RULES   = $REPORT_RULES"
-    echo "BRANCH         = $BRANCH"
-    echo "SAFE_BRANCH    = $SAFE_BRANCH"
-    echo "CLEAN_DIR      = $CLEAN_DIR"
-    echo "BRANCH_DIR     = $BRANCH_DIR"
-    echo "BUILD_DIR      = $BUILD_DIR"
-    echo "CONFIG_REPORT  = $CONFIG_REPORT"
-    echo "BUILD_REPORT   = $BUILD_REPORT"
-    echo "TEST_REPORT    = $TEST_REPORT"
-    echo "LAST_REPORT    = $LAST_REPORT"
-    echo
+       echo
+       echo "Configuration:"
+       echo "=============="
+       echo
+       echo "BTRDIR         = $BTRDIR"
+       echo "BINDIR         = $BINDIR"
+       echo "LIBDIR         = $LIBDIR"
+       echo
+       echo "SOURCE_RULES   = $SOURCE_RULES"
+       echo "SOURCE_ARGS    = $SOURCE_ARGS"
+       echo "SOURCE_CLEAN   = $SOURCE_CLEAN"
+       echo "BUILD_RULES    = $BUILD_RULES"
+       echo "BUILD_ARGS     = $BUILD_ARGS"
+       echo "BUILD_CLEAN    = $BUILD_CLEAN"
+       echo "TEST_ARGS      = $TEST_ARGS"
+       echo "REPORT_RULES   = $REPORT_RULES"
+       echo "REPORT_ARGS    = $REPORT_ARGS"
+       echo
+       echo "REPO           = $REPO"
+       echo "BRANCH         = $BRANCH"
+       echo "SAFE_BRANCH    = $SAFE_BRANCH"
+       echo
+       echo "CLEAN_DIR      = $CLEAN_DIR"
+       echo "BRANCH_DIR     = $BRANCH_DIR"
+       echo "BUILD_DIR      = $BUILD_DIR"
+       echo "CONFIG_REPORT  = $CONFIG_REPORT"
+       echo "BUILD_REPORT   = $BUILD_REPORT"
+       echo "TEST_REPORT    = $TEST_REPORT"
+       echo "LAST_REPORT    = $LAST_REPORT"
+       echo
 }
 
 function confirm {
-    local CONTINUE
-    echo -n "$1 (y/N) "
-    read -r CONTINUE
-    case $CONTINUE in
-        y*|Y*)
-            echo
-            ;;
-        *)
-            exit -1
-            ;;
-    esac
+       local CONTINUE
+       echo -n "$1 (y/N) "
+       read -r CONTINUE
+       case $CONTINUE in
+               y*|Y*)
+                       echo
+                       ;;
+               *)
+                       exit -1
+                       ;;
+       esac
 }
 
-# vim: set noet
+# vim: noet