#!/bin/bash

# repochecker tries to solve runtime dependencies for a given repository. It's
# used for the openSUSE/SLE Cloud packages to check the dependencies for the
# different repositories. Use it for instance with:
#
# REPCHECK_DIST_VERSION=15.0 REPCHECK_DIST_NAME=openSUSE \
#     REPCHECK_PROJECT="Cloud:OpenStack:Kilo:Staging" repochecker

set -e

: ${REPCHECK_CACHE_DIR:=${XDG_CACHE_HOME:="$HOME/.cache/repochecker"}}
# project to check
: ${REPCHECK_PROJECT:="Cloud:OpenStack:Master"}
# openSUSE or SLE
: ${REPCHECK_DIST_NAME:="openSUSE"}
# i.e. 13.2 , Tumbleweed, 12_SP3, 15
: ${REPCHECK_DIST_VERSION:="15.0"}
: ${REPCHECK_INSTCHECK_EXCLUDES:="-kmp-"}
# buildservice instance used for $REPCHECK_PROJECT.
# use "ibs" for SUSE internal buildservice. Otherwise leave blank
: ${REPCHECK_BS_INSTANCE:=""}


D="${REPCHECK_CACHE_DIR}/${REPCHECK_DIST_NAME}/${REPCHECK_DIST_VERSION}/${REPCHECK_PROJECT}/"
zypper="zypper --gpg-auto-import-keys -n --root $D"


mkdir -p $D

if [[ $REPCHECK_DIST_NAME == "openSUSE" ]]; then
    if [[ $REPCHECK_DIST_VERSION == "Tumbleweed" ]]; then
        # Tumbleweed needs to be lower case
        dv=${REPCHECK_DIST_VERSION,,}
        $zypper ar -f http://download.opensuse.org/${dv}/repo/oss/ Base || true
    else
        $zypper ar -f http://download.opensuse.org/distribution/leap/${REPCHECK_DIST_VERSION}/repo/oss/ Base || true
        $zypper ar -f http://download.opensuse.org/update/leap/${REPCHECK_DIST_VERSION}/oss/${REPCHECK_DIST_NAME}:Leap:${REPCHECK_DIST_VERSION}:Update.repo || true
    fi
fi

if [[ $REPCHECK_DIST_NAME == "SLE" ]]; then
    if [[ $REPCHECK_DIST_VERSION == 15* ]]; then
        for prod in SLE-Product-SLES SLE-Module-Basesystem SLE-HA SLE-Module-Legacy SLE-Module-Development-Tools SLE-Module-Server-Applications; do
            $zypper ar "http://smt-internal.opensuse.org/repo/\$RCE/SUSE/Products/$prod/${REPCHECK_DIST_VERSION}/x86_64/product/" ${prod}-Base || true
            $zypper ar --refresh "http://smt-internal.opensuse.org/repo/\$RCE/SUSE/Updates/$prod/${REPCHECK_DIST_VERSION}/x86_64/update/" ${prod}-Updates || true
        done
    fi

    if [[ $REPCHECK_DIST_VERSION == 12* ]]; then
        $zypper ar -f "http://smt-internal.opensuse.org/repo/\$RCE/SUSE/Updates/SLE-SERVER/${REPCHECK_DIST_VERSION}/x86_64/update/" Updates || true
        $zypper ar -f "http://smt-internal.opensuse.org/repo/\$RCE/SUSE/Products/SLE-SERVER/${REPCHECK_DIST_VERSION}/x86_64/product" Base || true
    fi

    if [[ $REPCHECK_DIST_VERSION == 11* ]]; then
        v=${REPCHECK_DIST_VERSION//_/-}
        $zypper ar -f "http://smt-internal.opensuse.org/repo/\$RCE/SLES${v}-Pool/sle-11-x86_64/" Base || true
        $zypper ar -f "http://smt-internal.opensuse.org/repo/\$RCE/SLES${v}-Updates/sle-11-x86_64/" Updates || true
    fi
fi

# project repos
if [[ $REPCHECK_BS_INSTANCE == "ibs" ]]; then
    repo_url="http://download.suse.de/ibs"
else
    repo_url="http://download.opensuse.org/repositories"
fi

p=${REPCHECK_PROJECT//:/:\/}
if [[ $REPCHECK_DIST_NAME == "openSUSE" ]]; then
    $zypper ar -f ${repo_url}/${p}/${REPCHECK_DIST_NAME}_Leap_${REPCHECK_DIST_VERSION}/${REPCHECK_PROJECT}.repo || true
else
    $zypper ar -f ${repo_url}/${p}/${REPCHECK_DIST_NAME}_${REPCHECK_DIST_VERSION}/${REPCHECK_PROJECT}.repo || true
fi

# if it's a staging repo, also add the non-staging one
if [[ "$REPCHECK_PROJECT" == *:Staging ]]; then
    pro_nonstaging=${REPCHECK_PROJECT//:Staging/}
    p=${pro_nonstaging//:/:\/}
    $zypper ar -f ${repo_url}/${p}/${REPCHECK_DIST_NAME}_${REPCHECK_DIST_VERSION}/${pro_nonstaging}.repo || true
fi

$zypper ref

# check package installations
pro_alias=${REPCHECK_PROJECT//:/_}
installcheck x86_64 --withobsoletes --exclude ${REPCHECK_INSTCHECK_EXCLUDES} \
    $D/var/cache/zypp/raw/${pro_alias}/repodata/*primary.xml.gz \
    --nocheck $D/var/cache/zypp/solv/*/solv
