From 8743cd1694c5baf929d7dd25291a6609e360a548 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 28 Jun 2013 22:57:19 +0200 Subject: [PATCH] initial commit --- .gitignore | 2 + README.md | 11 +++ bin/btr | 25 +++++++ lib/btr/btr.mk | 9 +++ lib/btr/btr.sh | 184 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/btr/git.mk | 18 +++++ lib/btr/mail.mk | 10 +++ lib/btr/pecl.mk | 38 ++++++++++ lib/btr/php.mk | 38 ++++++++++ lib/btr/svn.mk | 11 +++ lib/btr/tmp.sh | 89 +++++++++++++++++++++++ 11 files changed, 435 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 bin/btr create mode 100644 lib/btr/btr.mk create mode 100755 lib/btr/btr.sh create mode 100644 lib/btr/git.mk create mode 100644 lib/btr/mail.mk create mode 100644 lib/btr/pecl.mk create mode 100644 lib/btr/php.mk create mode 100644 lib/btr/svn.mk create mode 100755 lib/btr/tmp.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff1fbef --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*~ +btr+* diff --git a/README.md b/README.md new file mode 100644 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 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 index 0000000..e461176 --- /dev/null +++ b/lib/btr/btr.mk @@ -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 index 0000000..04cf1c2 --- /dev/null +++ b/lib/btr/btr.sh @@ -0,0 +1,184 @@ +#!/bin/sh + +function help { + echo "btr v0.2.0, (c) Michael Wallner " + echo + echo "Usage: $(basename $0) [-hv] [] " + echo + echo " -h, --help Display this help" + echo " -v, --verbose Be more verbose" + echo + echo " Options:" + echo " -s, --source= Use the specified source ruleset" + echo " -b, --build= Use the specified build ruleset" + echo " -r, --report= Use the specifued report ruleset" + echo " -B, --branch= Checkout this branch" + echo " -D, --directory= Use this directory as work root" + echo " -S, --suffix= Append suffix to the build name" + echo " -C, --configure= 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 index 0000000..6ca93a9 --- /dev/null +++ b/lib/btr/git.mk @@ -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 index 0000000..37b8a6c --- /dev/null +++ b/lib/btr/mail.mk @@ -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 index 0000000..545b835 --- /dev/null +++ b/lib/btr/pecl.mk @@ -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 index 0000000..84327d3 --- /dev/null +++ b/lib/btr/php.mk @@ -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 index 0000000..49d94c4 --- /dev/null +++ b/lib/btr/svn.mk @@ -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 index 0000000..f304c6a --- /dev/null +++ b/lib/btr/tmp.sh @@ -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 < "$TEST_REPORT" 2>&1 + then + SUCCESS=FAILURE + else + SUCCESS=SUCCESS + diffsum + fi + echo +} + -- 2.30.2