#!/bin/bash

docker_init_mock() {
    local CONFIG_CONTENT_BASE64=$(echo "${CONFIG_CONTENT}" | base64 -w0)
    docker run ${DOCKER_OPTS} --privileged --rm \
    -v ${CACHE_DIR}:/var/cache/mock ${CONTAINER_NAME} \
    bash ${BASH_OPTS} -c "
        mkdir -p /var/cache/mock/configs
        cp /etc/mock/logging.ini /var/cache/mock/configs/
        rm -rf /etc/mock
        rm -f /var/cache/mock/configs/${DIST}.cfg
        rm -rf /var/cache/mock/${ROOT_NAME}
        ln -s /var/cache/mock/configs /etc/mock
        echo \"${CONFIG_CONTENT_BASE64}\" \
            | base64 -d > /etc/mock/${DIST}.cfg
        echo 'Current config file:'
        cat /etc/mock/${DIST}.cfg
        chown -R abuild:mock /var/cache/mock
        chmod g+s /var/cache/mock
        su - abuild -c \
            'mock -r ${DIST} ${MOCK_OPTS} --init'"
}

docker_init_sbuild() {
    local MIRROR=$(echo "${APT_SOURCES_CONTENT}" | fgrep deb | head -1 | awk '{print $2}')
    local APT_SOURCES_CONTENT_BASE64=$(echo "$APT_SOURCES_CONTENT" | base64 -w0)
    docker run ${DOCKER_OPTS} --privileged --rm \
        -v ${CACHE_DIR}:/srv/images ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            mkdir -p /srv/images/chroot.d
            rm -rf /etc/schroot/chroot.d
            ln -s /srv/images/chroot.d /etc/schroot/chroot.d
            rm -rf /srv/images/${ROOT_NAME}
            rm -f /etc/schroot/chroot.d/${ROOT_NAME}*
            sbuild-createchroot ${DIST} /srv/images/${ROOT_NAME} ${MIRROR}
            mv /etc/schroot/chroot.d/${ROOT_NAME}* /etc/schroot/chroot.d/${ROOT_NAME}
            echo 'union-type=aufs' >> /etc/schroot/chroot.d/${ROOT_NAME}
            echo ${APT_SOURCES_CONTENT_BASE64} | base64 -d \
                > /srv/images/${ROOT_NAME}/etc/apt/sources.list
            echo '#!/bin/bash' > /srv/images/${ROOT_NAME}/usr/bin/apt-add-repo
            echo 'echo \$* >> /etc/apt/sources.list' >> /srv/images/${ROOT_NAME}/usr/bin/apt-add-repo
            chmod +x /srv/images/${ROOT_NAME}/usr/bin/apt-add-repo
            echo '#!/bin/bash' > /srv/images/${ROOT_NAME}/usr/bin/set-apt-prefs
            echo 'echo \$* | base64 -d > /etc/apt/preferences' >> /srv/images/${ROOT_NAME}/usr/bin/set-apt-prefs
            chmod +x /srv/images/${ROOT_NAME}/usr/bin/set-apt-prefs
            sbuild-update -udcar ${DIST}"
}

docker_update_mock() {
    docker run ${DOCKER_OPTS} --privileged --rm \
        -v ${CACHE_DIR}:/var/cache/mock ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            rm -rf /etc/mock
            mkdir -p /var/cache/mock/configs
            ln -s /var/cache/mock/configs /etc/mock
            rm -rf /var/cache/mock/${ROOT_NAME}/yum_cache
            touch /etc/mock/${DIST}.cfg -r \
                /var/cache/mock/${ROOT_NAME}/root_cache/cache.tar.gz
            echo 'Current config file:'
            cat /etc/mock/${DIST}.cfg
            chown -R abuild:mock /var/cache/mock
            chmod g+s /var/cache/mock
            su - abuild -c \
                'mock -r ${DIST} ${MOCK_OPTS} --update'"
}

docker_update_sbuild() {
    local MIRROR=$(echo "${APT_SOURCES_CONTENT}" | fgrep deb | head -1 | awk '{print $2}')
    local APT_SOURCES_CONTENT_BASE64=$(echo "${APT_SOURCES_CONTENT}" | base64 -w0)
    docker run ${DOCKER_OPTS} --privileged --rm \
        -v ${CACHE_DIR}:/srv/images ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            mkdir -p /srv/images/chroot.d
            rm -rf /etc/schroot/chroot.d
            ln -s /srv/images/chroot.d /etc/schroot/chroot.d
            echo ${APT_SOURCES_CONTENT_BASE64} | base64 -d \
                > /srv/images/${ROOT_NAME}/etc/apt/sources.list
            sbuild-update -udcar ${DIST}"
}

docker_build_mock() {
    [ $(ls -1 ${SOURCE_PATH}/*.{src.rpm,spec} 2>/dev/null | wc -l) -eq 0 ] \
        && fail_exit "ERROR: No RPM sources found at ${SOURCE_PATH}"
    ## Parse additional repositories
    for repo in ${repos[@]} ; do
        local reponame=$(mktemp -u XXXXXXXX)
        local repourl=${repo%%,*}
        local priority=${repo##*,}
        if [ "$priority" == "$repourl" ] ; then
            unset priority
        else
            priority="priority=$priority\n"
        fi
        local ADD_REPO_CMD="$ADD_REPO_CMD -e \"/^\[base\]/i[${reponame}]\nname=${reponame}\nbaseurl=${repourl}\ngpgcheck=0\nenabled=1\nskip_if_unavailable=1\n${priority}\""
    done
    [ ${#repos[@]} -gt 0 ] \
        && ADD_REPO_CMD="sed $ADD_REPO_CMD -i /etc/mock/${DIST}.cfg"
    ##

    [ "$KEEP_CHROOT" == "true" ] \
        && local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}:/var/lib/mock"

    local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)

    docker run ${DOCKER_OPTS} --privileged --rm \
        -v ${CACHE_DIR}:/srv/mock/cache:ro \
        -v ${SOURCE_PATH}:/home/abuild/rpmbuild \
        -v ${DEST_PATH}:/home/abuild/buildresult \
        ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
            sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
                -e 's|%TYPE%|${TYPE}|g' \
                -e 's|%UNAME%|${UNAME}|g' \
                -e 's|%GNAME%|${GNAME}|g' \
                -i /cleanup
            source /cleanup
            rm -rf /var/lib/mock/${ROOT_NAME}
            mkdir -p /srv/tmpfs/cache
            mount -t tmpfs overlay /srv/tmpfs/cache
            mount -t aufs -o br=/srv/tmpfs/cache:/srv/mock/cache \
                none /var/cache/mock
            rm -rf /etc/mock
            ln -s /var/cache/mock/configs /etc/mock
            ${ADD_REPO_CMD}
            touch /etc/mock/${DIST}.cfg -r \
                /var/cache/mock/${ROOT_NAME}/root_cache/cache.tar.gz
            echo 'Current config file:'
            cat /etc/mock/${DIST}.cfg
            chown -R abuild.mock /home/abuild
            rm -rf /var/cache/mock/${ROOT_NAME}/yum_cache
            ulimit -n 10000
            su - abuild -c 'mock -r ${DIST} ${MOCK_OPTS} --update'
            if [ x${KEEP_CHROOT} = xtrue ] ; then
                sed -i /etc/mock/${DIST}.cfg -e '/tmpfs_enable/s|True|False|'
                mkdir -p /var/lib/mock/${ROOT_NAME}/root
                tar -xf /var/cache/mock/${ROOT_NAME}/root_cache/cache.tar.gz \
                    -C /var/lib/mock/${ROOT_NAME}/root
            fi
            [ \$(ls /home/abuild/rpmbuild/*.src.rpm 2>/dev/null | wc -l) -eq 0 ] \
                && su - abuild -c 'mock -r ${DIST} --no-clean \
                   --no-cleanup-after --buildsrpm \
                   --sources=/home/abuild/rpmbuild \
                   --spec=\$(ls /home/abuild/rpmbuild/*.spec) \
                   --resultdir=/home/abuild/rpmbuild ${MOCK_OPTS}'
            rm -rf /home/abuild/rpmbuild/build
            su - abuild -c 'mock -r ${DIST} --no-clean \
                 --no-cleanup-after ${MOCK_OPTS} \
                 --resultdir=/home/abuild/buildresult \
                 \$(ls /home/abuild/rpmbuild/*.src.rpm)'
            echo \$? > /home/abuild/buildresult/exitstatus"
}

docker_build_sbuild() {
    find ${SOURCE_PATH} | egrep "(debian/rules|\.dsc)$" &>/dev/null \
        || fail_exit "ERROR: No DEB sources found at ${SOURCE_PATH}"
    local SOURCE_TARGET=$(find ${SOURCE_PATH} | egrep "(debian/rules|\.dsc)$" | head -1 2>/dev/null)
    [ "${SOURCE_TARGET##*/}" == "rules" ] \
        && SOURCE_TARGET=$(basename $(dirname $(dirname ${SOURCE_TARGET})))/ \
        || SOURCE_TARGET=$(basename ${SOURCE_TARGET})
    ## Parse additional repositories
    for repo_id in $(seq 0 $(( ${#repos[@]} - 1 ))) ; do
        ADD_REPO_CMD="${ADD_REPO_CMD} --chroot-setup-commands=\"apt-add-repo deb ${repos[${repo_id}]}\" "
    done
    ## Parse Apt pinning options
    unset PIN_CONTENT
    if [ ${#pins[@]} -gt 0 ] ; then
        for pin_id in $(seq 0 $(( ${#pins[@]} - 1 ))) ; do
            local PIN_CONTENT="${PIN_CONTENT}Package: ${pinpkgs[${pin_id}]}\nPin: ${pins[${pin_id}]}\nPin-Priority: ${pinprios[${pin_id}]}\n"
        done
    fi
    unset PIN_CONTENT_BASE64
    [ -n "${PIN_CONTENT}" ] \
        && PIN_CONTENT_BASE64=$(echo -e "${PIN_CONTENT}" | base64 -w0)
    unset SET_APT_PREFS_CMD
    [ -n "${PIN_CONTENT_BASE64}" ] \
        && local SET_APT_PREFS_CMD="--chroot-setup-commands=\"set-apt-prefs ${PIN_CONTENT_BASE64}\""
    ## Process hooks
    local debian_dir=${SOURCE_PATH}/${SOURCE_TARGET}/debian
    if [ -d "${debian_dir}/hooks.d" ] ; then
        HOOKS_CMD="--chroot-setup-commands=\"run-parts /hooks.d/\""
    fi

    ##
    local SBUILD_OPTS="--nolog --source --force-orig-source"
    if [ "$KEEP_CHROOT" = "true" ] ; then
        local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}/${ROOT_NAME}:/srv/overlay"
        local SBUILD_OPTS="${SBUILD_OPTS} --purge-build=never --purge-session=never"
        local SBUILD_OPTS=${SBUILD_OPTS/--force-orig-source/}
    fi

    local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
    docker run ${DOCKER_OPTS} --privileged --rm \
        -v ${CACHE_DIR}:/srv/images:ro \
        -v ${SOURCE_PATH}:/srv/source \
        -v ${DEST_PATH}:/srv/build \
        ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
            sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
                -e 's|%TYPE%|${TYPE}|g' \
                -e 's|%UNAME%|${UNAME}|g' \
                -e 's|%GNAME%|${GNAME}|g' \
                -i /cleanup
            source /cleanup
            rm -rf /etc/schroot/chroot.d
            ln -s /srv/images/chroot.d /etc/schroot/chroot.d
            ulimit -n 10000
            if [ x$HOOKS_CMD != x ] ; then
                echo '/srv/source/${SOURCE_TARGET}/debian/hooks.d /hooks.d    none ro,bind 0 0' \
                    >> /etc/schroot/sbuild/fstab
            fi
            ( sed -i /usr/bin/sbuild -e '/debian\/rules/d'
              DEB_BUILD_OPTIONS=nocheck /usr/bin/sbuild -d ${DIST} \
                  ${SBUILD_OPTS} \
                  ${ADD_REPO_CMD} \
                  ${SET_APT_PREFS_CMD} \
                  ${HOOKS_CMD} \
                  --chroot-setup-commands=\"apt-get update\" \
                  --chroot-setup-commands=\"apt-get upgrade -f -y --force-yes\" \
                  /srv/source/${SOURCE_TARGET} 2>&1
              echo \$? > /srv/build/exitstatus ) \
                  | tee /srv/build/buildlog.sbuild
              if [ x$KEEP_CHROOT = xtrue ] ; then
                  rm -rf /srv/overlay/*
                  SESSION=\$(schroot --info --all-sessions | grep \"^  Name\" | awk '{print \$2}')
                  cp -R /var/lib/schroot/union/overlay/\${SESSION}/* /srv/overlay
                  cp -R /var/lib/schroot/mount/\${SESSION}/build /srv/overlay/
              fi"
}

docker_shell_mock() {
    local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
    local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}:/var/lib/mock"
    docker run ${DOCKER_OPTS} -ti --privileged --rm \
        -v ${CACHE_DIR}:/var/cache/mock:ro \
        ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
            sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
                -e 's|%TYPE%|${TYPE}|g' \
                -e 's|%UNAME%|${UNAME}|g' \
                -e 's|%GNAME%|${GNAME}|g' \
                -i /cleanup
            source /cleanup
            mkdir -p /var/lib/mock/${ROOT_NAME}/root/{proc,sys,dev/{shm,pts},var/cache/yum,tmp/ccache}
            mount -n -t proc proc /var/lib/mock/${ROOT_NAME}/root/proc
            mount -n -t sysfs sysfs /var/lib/mock/${ROOT_NAME}/root/sys
            mount -n -t tmpfs tmpfs /var/lib/mock/${ROOT_NAME}/root/dev/shm
            mount -n -t devpts -o gid=5,mode=0620,ptmxmode=0666,newinstance devpts /var/lib/mock/${ROOT_NAME}/root/dev/pts
            mount -n --bind /var/cache/mock/${ROOT_NAME}/yum_cache/ /var/lib/mock/${ROOT_NAME}/root/var/cache/yum
            mount -n --bind /var/cache/mock/${ROOT_NAME}/ccache/u1000/ /var/lib/mock/${ROOT_NAME}/root/tmp/ccache
            chroot /var/lib/mock/${ROOT_NAME}/root \
                /bin/bash -c 'export LANG=en_US.UTF-8
                    export HOME=/builddir
                    export CCACHE_DIR=/tmp/ccache
                    export CCACHE_UMASK=002
                    cd \${HOME}/build
                    bash'"
}

docker_shell_sbuild() {
    local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}:/srv/overlay"
    local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
    docker run ${DOCKER_OPTS} -ti --privileged --rm \
        -v ${CACHE_DIR}:/srv/images:ro \
        -v ${DEST_PATH}:/srv/build \
        ${CONTAINER_NAME} \
        bash ${BASH_OPTS} -c "
            echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
            sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
                -e 's|%TYPE%|${TYPE}|g' \
                -e 's|%UNAME%|${UNAME}|g' \
                -e 's|%GNAME%|${GNAME}|g' \
                -i /cleanup
            source /cleanup
            mkdir -p /srv/root
            mount -t aufs -o br=/srv/overlay/${ROOT_NAME}:/srv/images/${ROOT_NAME} \
                none /srv/root
            mount -n -t proc proc /srv/root/proc
            mount -n -t sysfs sysfs /srv/root/sys
            mount -n -t tmpfs tmpfs /srv/root/dev/shm
            mount -n -t devpts -o gid=5,mode=0620,ptmxmode=0666,newinstance devpts /srv/root/dev/pts
            chroot /srv/root \
               /bin/bash -c '
               cd /build/*/
               bash'"
}
