#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

## usage
usage()
{
cat << EOF
jenkins-buildpackage
usage: $0 options

OPTIONS:
    -h  Show this message
    -t  Target: siduction, debian
    -r  Repository: fixes, extra, experimental-snapshots
    -d  Distribution: unstable, experimental, experimental-snapshots
    -a  Architecture, should be 'all', 'i386' or 'amd64'
    -b  REPOPATH
    -x  Delete file for failed builds
    -V  Version
EOF
}

## version
version() {
    . /usr/share/pbuilder-scripts/version
    echo "$(basename $0): ${VERSION}"
}

## get basic configuration form /etc/jenkins
if [ -f /etc/jenkins/buildpackage.conf ]; then
    . /etc/jenkins/buildpackage.conf
fi

REPOBASE="${REPOPATH}/${REPOSITORY}"

## option handling
while getopts “t:r:d:a:b:Vhx” OPTION; do
    case ${OPTION} in
        t)
            TARGET=${OPTARG}
            ;;
        r)
            REPOSITORY=${OPTARG}
            ;;
        d)
            DISTRI=${OPTARG}
            ;;
        a)
            BUILDARCH=${OPTARG}
            ;;
        b)
            REALREPO="${OPTARG}"
            REPOBASE="${REPOPATH}/${REALREPO}"
            echo "REALREPO: ${REALREPO}"
            ;;
        h)
            usage
            exit 0
            ;;
        x)
            DELETE_FAILED="true"
            ;;
        V)
            version
            exit 0
            ;;
     esac
done


## is_valid_line
is_valid_line() {
    [[ ! -e ${SOURCEPATH}/build-failed+${TARGET}+${REPOSITORY}+${DISTRI}+${BUILDARCH} ]] && touch ${SOURCEPATH}/build-failed+${TARGET}+${REPOSITORY}+${DISTRI}+${BUILDARCH}
    grep "$REPOLINE" ${SOURCEPATH}/build-failed+${TARGET}+${REPOSITORY}+${DISTRI}+${BUILDARCH}
    RESULT=$?
    case "${RESULT}" in
        1)
            echo -e "Valid: ${REPOLINE}"
            ;;
        0)
            echo -e "Faulty: ${REPOLINE}"
            ;;
    esac
    return "${RESULT}"
}


## sub split repo_line
split_repo_line() {
    PACKAGE_NAME=$(echo ${REPOLINE} | awk -F' ' '{ print $1 }')
    PACKAGE_VER=$(echo ${REPOLINE} | awk -F' ' '{ print $2 }')
    PACKAGE_DSC=$(echo ${REPOLINE} | awk -F' ' '{ print $3 }')
    PACKAGE_FILES=$(echo ${PACKAGE_DSC} | sed 's/\.dsc/*/')
    SOURCEDIR=${SOURCEPATH}/${PACKAGE_NAME}-${PACKAGE_VER}
    BUILD_DSC=$(basename ${PACKAGE_DSC})
    UPLOADFILES=$(basename ${PACKAGE_FILES})
}

## get_source_package
get_source_package() {
    [[ -d ${SOURCEDIR} ]] && rm -rv ${SOURCEDIR}
    mkdir -p ${SOURCEDIR}
    pushd ${SOURCEDIR}
    echo -e "HOST:         $HOST"
    echo -e "REPOLINE:     $REPOLINE"
    echo -e "PACKAGE_DSC:  $PACKAGE_DSC"
    echo -e "REALREPO:     $REALREPO"
    echo -e "REPOPATH:     $REPOPATH"
    echo "dget -d ${PROTOCOL}${HOST}/${REALREPO}/${PACKAGE_DSC}"
    dget -d ${PROTOCOL}${HOST}/${REALREPO}/${PACKAGE_DSC}
    popd
}

## build_source_package
build_source_package() {
    pushd ${SOURCEDIR}
    case ${BUILDARCH} in
        all)
            ARCH="amd64"
            ;;
        *)
            ARCH=${BUILDARCH}
            ;;
    esac
    BUILDTARGET="/var/cache/pbuilder/${TARGET}-${DISTRI}-${ARCH}/result"
    echo "pbuild -t ${TARGET} -r ${REPOSITORY} -d ${DISTRI} -a ${BUILDARCH}  ${BUILD_DSC}"
    pbuild -t ${TARGET} -r ${REPOSITORY} -d ${DISTRI} -a ${BUILDARCH}  ${BUILD_DSC}
    RESULT=$?
    echo -e "build_source_package Result: ${RESULT}"
    popd
    if [ "${RESULT}" -ne "0" ]; then
        if [ "${FAILED}" != "true" ]; then
            write_failed
            FAILED="true"
        fi
    else
        rm -rf ${SOURCEDIR}
    fi
}

## upload_package
upload_package() {
    if [ -e /tmp/dput/dput-post-upload-error ]; then
        rm -f /tmp/dput/dput-post-upload-error
    fi
    pushd ${BUILDTARGET}
    dput  ${REPOSITORY} ${UPLOADFILES}changes
    RESULT=$?
    if [ "${RESULT}" -ne "0" ]; then
        if [ "${FAILED}" != "true" ]; then
            write_failed
            FAILED="true"
        fi
    fi
    if [ "${FAILED}" != "true" ]; then
        if [ -e /tmp/dput/dput-post-upload-error ]; then
            rm -f /tmp/dput/dput-post-upload-error
            write_failed
            FAILED="true"
            RESULT=1
        fi
    fi
    echo -e "---- Upload Dir: Cleanup ----"
    rm -fv ${UPLOADFILES}
    popd
    echo -e "upload_package Result: ${RESULT}"
}

## delete failed builds file
delete_failed() {
    rm -fv  ${SOURCEPATH}/build-failed+${TARGET}+${REPOSITORY}+${DISTRI}+${BUILDARCH}
}

## write_failed
write_failed() {
    echo ${REPOLINE} >>  ${SOURCEPATH}/build-failed+${TARGET}+${REPOSITORY}+${DISTRI}+${BUILDARCH}
    echo -e "added ${REPOLINE} to failed builds for ${TARGET}, ${REPOSITORY}, ${DISTRI} and ${BUILDARCH} \n"
}

## Main
[ "${DELETE_FAILED}" = "true" ] && delete_failed && exit 0
[ ! -d ${SOURCEPATH} ] && mkdir -p ${SOURCEPATH} && echo ${SOURCEPATH}

IFS=$'\n'
echo "ssh ${USER}@${HOST}  \"cd ${REPOBASE}; reprepro build-needing ${DISTRI}  $BUILDARCH\" "

for i in $(ssh ${USER}@${HOST}  "cd ${REPOBASE}; reprepro build-needing ${DISTRI}  $BUILDARCH"); do
    REPOLINE=$i
    is_valid_line
    [ "$?" -ne "1" ] && continue
    split_repo_line
    get_source_package
    FAILED=""
    build_source_package
    if [ ${RESULT} -eq "0" ]; then
        upload_package
    fi
    break
done

echo -e "main buildresult: ${RESULT}"
exit ${RESULT}
