#!/bin/sh # # 2012-01-22, alex@barton.de # MYNAME=$(basename "$0") # options FORCE="" QUIETCMD=">/dev/null" export LC_ALL=C while [ $# -gt 0 ]; do case "$1" in "-f"|"--force") FORCE=1 ;; "-v"|"--verbose") QUIETCMD= ;; *) echo "Usage: $MYNAME [--force|-f]" >&2 exit 1 esac shift done # defaults AUTOBUILDER_D_DIR="/usr/local/etc/autobuilder/autobuild.d" CACHE_DIR="/usr/local/var/cache/autobuilder" MSG_PREFIX=" * " ERR_PREFIX=" ! " msg() { echo "$MSG_PREFIX[$(date +%H:%M:%S)] $MYNAME: $*" } err() { echo "$ERR_PREFIX[$(date +%H:%M:%S)] $MYNAME: $*" >&2 } prepare_git() { cd "$BASE_DIR" || return 1 if [ ! -d ".git" ]; then git clone "$REPOSITORY" . else git pull --ff-only | grep "Already up-to-date." >/dev/null [ $? -eq 0 ] && return 9 echo git shortlog ORIG_HEAD.. fi } build() { msg "Building \"$NAME\" ..." cd "$BASE_DIR" || return 1 date >"$BASE_DIR/.$MYNAME.dirty" || return 1 if [ -x "./autogen.sh" ]; then eval "make $MAKE_ARGS_MAINTAINERCLEAN $QUIETCMD 2>&1" eval "./autogen.sh $QUIETCMD" fi if [ -x "./configure" ]; then eval "./configure $QUIETCMD" fi eval "make $MAKE_ARGS_BUILD $QUIETCMD" return $? } check() { msg "Checking \"$NAME\" ..." cd "$BASE_DIR" || return 1 eval "make $MAKE_ARGS_CHECK $QUIETCMD" } archive() { msg "Archiving \"$NAME\" ..." cd "$BASE_DIR" || return 1 eval "make $MAKE_ARGS_DIST $QUIETCMD" } publish() { msg "Publishing \"$NAME\" ..." cd "$BASE_DIR" || return 1 archive=$(ls -1rt -- *.tar.gz | tail -n 1) if [ -z "$archive" ]; then err "No distribution archive found!?" return 1 fi mv "$archive" "$DEST_DIR"/ || return 1 chmod a+rX "$DEST_DIR/$(basename "$archive")" rm -f "$archive" "$BASE_DIR/.$MYNAME.dirty" msg "New \"$NAME\" archive: \"$(basename "$archive")\"" clean_up } clean_up() { [ -n "$KEEP_ARCHIVES" ] || return 0 [ -n "$ARCHIVE_PATTERN" ] || return 0 msg "Removing outdated archives, keeping $KEEP_ARCHIVES ..." cd "$DEST_DIR" || return 1 eval "ls -1t $ARCHIVE_PATTERN | sed -n '$((KEEP_ARCHIVES + 1)),9999p' | xargs -r rm" } # read in configuration [ -r /etc/autobuilder/autobuilder.conf ] \ && . /etc/autobuilder/autobuilder.conf [ -r /usr/local/etc/autobuilder/autobuilder.conf ] \ && . /usr/local/etc/autobuilder/autobuilder.conf # read in and process projects in autobuild.d directory for file in "$AUTOBUILDER_D_DIR"/*; do file_name="$(basename "$file")" # defaults NAME="" REPOSITORY="" DEST_DIR="" MAKE_ARGS_MAINTAINERCLEAN="maintainer-clean" MAKE_ARGS_BUILD="" MAKE_ARGS_CHECK="check" MAKE_ARGS_DIST="dist" if [ ! -r "$file" ]; then err "Can't read \"$file\"! Skipping." continue fi . "$file" if [ -z "$NAME" ]; then err "$file_name: NAME no set! Skipping." continue fi if [ -z "$DEST_DIR" ]; then err "$file_name: DEST_DIR no set! Skipping." continue fi case "$TYPE" in "git") ;; *) err "$file_name: TYPE not set or unknown: \"$TYPE\"! Skipping." continue esac BASE_DIR="${CACHE_DIR}/${file_name}" if [ ! -d "$BASE_DIR" ]; then msg "Creating base directory \"$BASE_DIR\" ..." mkdir -p "$BASE_DIR" if [ $? -ne 0 ]; then err "Failed to create directory \"$BASE_DIR\!" continue fi fi case "$TYPE" in "git") prepare_git if [ $? -eq 9 ] \ && [ -z "$FORCE" ] \ && [ ! -e "$BASE_DIR/.$MYNAME.dirty" ]; then continue fi ;; esac build if [ $? -ne 0 ]; then err "Building of \"$NAME\" FAILED!" continue fi if [ -n "$MAKE_ARGS_CHECK" ]; then check if [ $? -ne 0 ]; then err "Checking of \"$NAME\" FAILED!" continue fi fi archive if [ $? -ne 0 ]; then err "Archiving of \"$NAME\" FAILED!" continue fi publish if [ $? -ne 0 ]; then err "Can't publish \"$NAME\"!" continue fi done # -eof-