initial commit
authorMichael Wallner <mike@php.net>
Fri, 28 Jun 2013 20:57:19 +0000 (22:57 +0200)
committerMichael Wallner <mike@php.net>
Fri, 28 Jun 2013 20:57:19 +0000 (22:57 +0200)
.gitignore [new file with mode: 0644]
README.md [new file with mode: 0644]
bin/btr [new file with mode: 0755]
lib/btr/btr.mk [new file with mode: 0644]
lib/btr/btr.sh [new file with mode: 0755]
lib/btr/git.mk [new file with mode: 0644]
lib/btr/mail.mk [new file with mode: 0644]
lib/btr/pecl.mk [new file with mode: 0644]
lib/btr/php.mk [new file with mode: 0644]
lib/btr/svn.mk [new file with mode: 0644]
lib/btr/tmp.sh [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..ff1fbef
--- /dev/null
@@ -0,0 +1,2 @@
+*~
+btr+*
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..1c8a17f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+# btr
+
+## BUILD TEST REPORT
+
+A simple tool to automate reporting of build and test results.
+
+### Currently supported rulesets:
+
+* source: git, svn
+* build: php, pecl
+
diff --git a/bin/btr b/bin/btr
new file mode 100755 (executable)
index 0000000..2eaeac8
--- /dev/null
+++ b/bin/btr
@@ -0,0 +1,25 @@
+#!/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
diff --git a/lib/btr/btr.mk b/lib/btr/btr.mk
new file mode 100644 (file)
index 0000000..e461176
--- /dev/null
@@ -0,0 +1,9 @@
+.PHONY: all source build report
+.SUFFIXES:
+export
+
+all: report
+
+source:
+
+# vim: set noet
diff --git a/lib/btr/btr.sh b/lib/btr/btr.sh
new file mode 100755 (executable)
index 0000000..04cf1c2
--- /dev/null
@@ -0,0 +1,184 @@
+#!/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
diff --git a/lib/btr/git.mk b/lib/btr/git.mk
new file mode 100644 (file)
index 0000000..6ca93a9
--- /dev/null
@@ -0,0 +1,18 @@
+.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
diff --git a/lib/btr/mail.mk b/lib/btr/mail.mk
new file mode 100644 (file)
index 0000000..37b8a6c
--- /dev/null
@@ -0,0 +1,10 @@
+.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
diff --git a/lib/btr/pecl.mk b/lib/btr/pecl.mk
new file mode 100644 (file)
index 0000000..545b835
--- /dev/null
@@ -0,0 +1,38 @@
+.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
diff --git a/lib/btr/php.mk b/lib/btr/php.mk
new file mode 100644 (file)
index 0000000..84327d3
--- /dev/null
@@ -0,0 +1,38 @@
+.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
diff --git a/lib/btr/svn.mk b/lib/btr/svn.mk
new file mode 100644 (file)
index 0000000..49d94c4
--- /dev/null
@@ -0,0 +1,11 @@
+.PHONY: all
+.SUFFIXES:
+
+all: $(BRANCH_DIR)
+       cd $(BRANCH_DIR) && \
+       svn update -q
+
+$(BRANCH_DIR):
+       svn checkout $(SOURCE_URL)/$(BRANCH) $(BRANCH_DIR)
+
+# vim: set noet
diff --git a/lib/btr/tmp.sh b/lib/btr/tmp.sh
new file mode 100755 (executable)
index 0000000..f304c6a
--- /dev/null
@@ -0,0 +1,89 @@
+#!/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
+}
+