--- /dev/null
+# btr
+
+## BUILD TEST REPORT
+
+A simple tool to automate reporting of build and test results.
+
+### Currently supported rulesets:
+
+* source: git, svn
+* build: php, pecl
+
--- /dev/null
+#!/bin/bash
+
+export DATE=$(date +%Y%m%d%H%M%S)
+export CPUS=${CPUS:-$(grep -c "^processor" /proc/cpuinfo)}
+
+export BINDIR=$(realpath $(dirname $0)/)
+export LIBDIR=$(realpath $(dirname $0)/../lib/btr)
+
+. $LIBDIR/btr.sh
+
+VERBOSE=false
+
+parseopts $@
+setup
+
+if $VERBOSE
+then
+ show_conf
+ confirm "Do you want to continue?" || exit
+fi
+
+REPORT="$(make -s -C $BTRDIR -f $LIBDIR/$SOURCE_RULES.mk && make -s -C $BTRDIR -f $LIBDIR/$BUILD_RULES.mk)"
+make -s -C $BTRDIR -f $LIBDIR/$REPORT_RULES.mk REPORT="$REPORT"
+
+# vim: set noet
--- /dev/null
+.PHONY: all source build report
+.SUFFIXES:
+export
+
+all: report
+
+source:
+
+# vim: set noet
--- /dev/null
+#!/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
+}
+
+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" \
+ -- "$@" \
+ )
+
+ 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
+}
+
+function error {
+ 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
+
+ export SOURCE_URL BRANCH SOURCE_RULES BUILD_RULES REPORT_RULES
+
+ if test -z "$BTRDIR"
+ then
+ export BTRDIR="/tmp/btr"
+ else
+ export BTRDIR=$(realpath "$BTRDIR")
+ fi
+
+ 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
+
+ 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=""
+}
+
+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
+}
+
+function confirm {
+ local CONTINUE
+ echo -n "$1 (y/N) "
+ read -r CONTINUE
+ case $CONTINUE in
+ y*|Y*)
+ echo
+ ;;
+ *)
+ exit -1
+ ;;
+ esac
+}
+
+# vim: set noet
--- /dev/null
+.PHONY: pull all
+.SUFFIXES:
+
+all: $(BRANCH_DIR) pull
+ cd $(BRANCH_DIR) && \
+ git pull -q
+
+pull: $(CLEAN_DIR)
+ cd $(CLEAN_DIR) && \
+ git pull -q
+
+$(CLEAN_DIR):
+ git clone $(SOURCE_URL) $(CLEAN_DIR)
+
+$(BRANCH_DIR): $(CLEAN_DIR)
+ git-new-workdir $(CLEAN_DIR) $(BRANCH_DIR) $(BRANCH)
+
+# vim: set noet
--- /dev/null
+.PHONY: all
+.SUFFIXES:
+
+all:
+ MESSAGE=$$(printf "\nbtr %s %s\n\n-- \nbtr mail report\n" "$(BUILD)" "$(REPORT)"); \
+ mail -s "[btr] $(BUILD) $(REPORT)" \
+ -a $(CONFIG_REPORT) -a $(BUILD_REPORT) -a $(TEST_REPORT) \
+ $(USER) <<<"$$MESSAGE"
+
+# vim: set noet
--- /dev/null
+.PHONY: all
+.SUFFIXES:
+
+CONFIGS=$(wildcard $(BRANCH_DIR)/config*.m4 $(BRANCH_DIR)/*/config*.m4)
+
+all: $(TEST_REPORT)
+ TESTS_PASSED=$$(awk '/^Tests passed/{print $$4}' < $(TEST_REPORT)); \
+ TESTS_FAILED=$$(awk '/^Tests failed/{print $$4}' < $(TEST_REPORT)); \
+ if test -z "$(LAST_REPORT)"; then \
+ printf "%d/%d\n" $$TESTS_PASSED $$TESTS_FAILED; \
+ else \
+ LAST_PASSED=$$(awk '/^Tests passed/{print $$4}' < $(LAST_REPORT)); \
+ LAST_FAILED=$$(awk '/^Tests failed/{print $$4}' < $(LAST_REPORT)); \
+ DIFF_PASSED=$$(bc <<<"$$TESTS_PASSED - $$LAST_PASSED"); \
+ DIFF_FAILED=$$(bc <<<"$$TESTS_FAILED - $$LAST_FAILED"); \
+ printf "+%d/+%d\n" $$DIFF_PASSED $$DIFF_FAILED; \
+ fi;
+
+$(TEST_REPORT): $(BUILD_REPORT)
+ cd $(BUILD_DIR) && \
+ make test TESTS=../$(BRANCH_DIR)/$(TESTS) > ../$@
+
+$(BUILD_REPORT): $(CONFIG_REPORT)
+ cd $(BUILD_DIR) && \
+ make -j $(CPUS) > ../$@
+
+$(CONFIG_REPORT): $(BRANCH_DIR)/configure $(BUILD_DIR)
+ cd $(BUILD_DIR) && \
+ ../$(BRANCH_DIR)/configure -C $(CONFIGURE) > ../$@
+
+$(BUILD_DIR):
+ mkdir -p $@
+
+$(BRANCH_DIR)/configure: $(CONFIGS)
+ cd $(BRANCH_DIR) && \
+ phpize > /dev/null
+
+# vim: set noet
--- /dev/null
+.PHONY: all
+.SUFFIXES:
+
+CONFIGS=$(wildcard $(BRANCH_DIR)/ext/*/config*.m4)
+
+all: $(TEST_REPORT)
+ TESTS_PASSED=$$(awk '/^Tests passed/{print $$4}' < $(TEST_REPORT)); \
+ TESTS_FAILED=$$(awk '/^Tests failed/{print $$4}' < $(TEST_REPORT)); \
+ if test -z "$(LAST_REPORT)"; then \
+ printf "%d/%d\n" $$TESTS_PASSED $$TESTS_FAILED; \
+ else \
+ LAST_PASSED=$$(awk '/^Tests passed/{print $$4}' < $(LAST_REPORT)); \
+ LAST_FAILED=$$(awk '/^Tests failed/{print $$4}' < $(LAST_REPORT)); \
+ DIFF_PASSED=$$(bc <<<"$$TESTS_PASSED - $$LAST_PASSED"); \
+ DIFF_FAILED=$$(bc <<<"$$TESTS_FAILED - $$LAST_FAILED"); \
+ printf "+%d/+%d\n" $$DIFF_PASSED $$DIFF_FAILED; \
+ fi;
+
+$(TEST_REPORT): $(BUILD_REPORT)
+ cd $(BUILD_DIR) && \
+ make test TESTS=../$(BRANCH_DIR)/$(TESTS) > ../$@
+
+$(BUILD_REPORT): $(CONFIG_REPORT)
+ cd $(BUILD_DIR) && \
+ make -j $(CPUS) > ../$@
+
+$(CONFIG_REPORT): $(BRANCH_DIR)/configure $(BUILD_DIR)
+ cd $(BUILD_DIR) && \
+ ../$(BRANCH_DIR)/configure -C $(CONFIGURE) > ../$@
+
+$(BUILD_DIR):
+ mkdir -p $@
+
+$(BRANCH_DIR)/configure: $(BRANCH_DIR)/buildconf $(CONFIGS)
+ cd $(BRANCH_DIR) && \
+ ./buildconf > /dev/null
+
+# vim: set noet
--- /dev/null
+.PHONY: all
+.SUFFIXES:
+
+all: $(BRANCH_DIR)
+ cd $(BRANCH_DIR) && \
+ svn update -q
+
+$(BRANCH_DIR):
+ svn checkout $(SOURCE_URL)/$(BRANCH) $(BRANCH_DIR)
+
+# vim: set noet
--- /dev/null
+#!/bin/sh
+
+
+function checkout {
+ mkdir -p "$BTRDIR" && cd "$BTRDIR" || error
+
+ if test -d "$CLEAN_DIR"
+ then
+ echo Pulling updates...
+ cd "$CLEAN_DIR" && git pull || error
+ cd ..
+ else
+ git clone "$SOURCE_URL" "$CLEAN_DIR" || error
+ fi
+
+ if test -d "$BRANCH_DIR"
+ then
+ cd "$BRANCH_DIR" && git pull || error
+ cd ..
+ else
+ git-new-workdir "$CLEAN_DIR" "$BRANCH_DIR" "$BRANCH" || error
+ fi
+ echo
+}
+
+function report {
+ echo "Reporting..."
+ cd "$BTRDIR" || error
+ echo "Running '$REPORT_COMMAND'"
+ local REPORT_ERROR=$(eval "$REPORT_COMMAND" 2>&1) || error $REPORT_ERROR
+ exit
+}
+
+function build {
+ echo "Building..."
+ cd "$BTRDIR" || error
+ mkdir -p "$BUILD_DIR" || error
+
+ echo "Running '$BUILD_COMMAND'"
+ if ! eval "$BUILD_COMMAND" > "$BUILD_REPORT" 2>&1
+ then
+ SUCCESS=FAILURE
+ report <<EOF
+
+btr report for $BUILD
+
+FAILURE: build
+COMMAND: $BUILD_COMMAND
+
+$(cat "$BTRDIR/$BUILD_REPORT")
+
+--
+btr
+
+EOF
+ fi
+ echo
+}
+
+function diffsum {
+ cd "$BTRDIR" || error
+ local LAST_TEST_REPORT=$(ls ".btr+tests-$BUILD-"* | tail -2 | head -1)
+ if test "$TEST_REPORT" != "$LAST_TEST_REPORT"
+ then
+ local LAST_TESTS_PASSED=$(awk '/^Tests passed/ {print $4}' "$LAST_TEST_REPORT")
+ local LAST_TESTS_FAILED=$(awk '/^Tests failed/ {print $4}' "$LAST_TEST_REPORT")
+ local TESTS_PASSED=$(awk '/^Tests passed/ {print $4}' "$TEST_REPORT")
+ local TESTS_FAILED=$(awk '/^Tests failed/ {print $4}' "$TEST_REPORT")
+
+ local DIFF_TEST_REPORT=$(diff -u $LAST_TEST_REPORT $TEST_REPORT)
+ DIFFSUM="+$(grep -c "^+" <<<"$DIFF_TEST_REPORT")/-$(grep -c "^-" <<<"$DIFF_TEST_REPORT")"
+ fi
+}
+
+function tests {
+ echo "Testing..."
+ cd "$BTRDIR" || error
+
+ echo "Running '$TEST_COMMAND'"
+ if ! eval "$TEST_COMMAND" > "$TEST_REPORT" 2>&1
+ then
+ SUCCESS=FAILURE
+ else
+ SUCCESS=SUCCESS
+ diffsum
+ fi
+ echo
+}
+