#!/bin/bash

: ${TOPDIR:=/usr/src/packages}

ARCH=$( rpm --eval '%{_arch}')

KIWI_NG=`kiwi --version|grep "next generation"`

echo "containment-rpm-docker: KIWI VERSION: $KIWI_NG"

set -e
set -u

# new path for python based kiwi
if [ -n "$KIWI_NG" ];then
  EXT=".docker.tar.xz"
  PREFIX="@(sles|opensuse|obs-appliance|obs-source-service)*.${ARCH}-"
  SUFFIX="-Build*${EXT}"
else
  EXT=".tar.xz"
  PREFIX="@(sles|opensuse|obs-appliance|obs-source-service)*-docker.${ARCH}-"
  SUFFIX="-Build*${EXT}"
fi

IMAGE_DIR=$TOPDIR/KIWI
BUILD_DIR=/usr/lib/build

cd $IMAGE_DIR

# Setting default for SPEC_IN
SPEC_IN=$BUILD_DIR/image.spec.in

# Overwrite default for SPEC_IN if _image.spec.in
# exists in sources dir
if [ -f $TOPDIR/SOURCES/_image.spec.in ];then
    SPEC_IN=$TOPDIR/SOURCES/_image.spec.in
fi

echo "Using $SPEC_IN as spec file template"

# Local build:
# sles12-docker.x86_64-1.0.0-Build.tar.xz
# OBS build:
# sles12-docker.x86_64-1.0.0-Build5.2.tar.xz

shopt -s nullglob
shopt -s extglob

IMAGE=$(echo ${PREFIX}*${SUFFIX})
PACKAGES=$(echo ${PREFIX}*.packages)

if [ -z "$IMAGE" ]; then
    echo "Couldn't find anything in "`pwd`" matching ${PREFIX}*${SUFFIX}."
    echo "Content of directory:"
    ls -1
    echo "Will skip containment rpm wrapping steps."
    exit 0
fi

echo "Attempting to wrap $IMAGE in a containment rpm ..."

declare -A SUSE_PRODUCT_MAP

SUSE_PRODUCT_MAP[sles]="SUSE Linux Enterprise Server"
SUSE_PRODUCT_MAP[opensuse]="openSUSE"
SUSE_PRODUCT_MAP[obs-appliance]="Open Build Service"

SUSE_PRODUCT_MAP[obs-source-service]="Open Build Service - Source Service"

if [ -n "$KIWI_NG" ];then
  # No clear scheme ATM
  SUSE_VERSION=""
else
  SUSE_VERSION="${IMAGE#@(sles|opensuse|obs-appliance|obs-source-service)}"
  if [ -n "" ];then
    # e.g. obs-source-service.x86_64-1.0.0-Build3.1.docker.tar.xz
    SUSE_VERSION="${SUSE_VERSION%%.$ARCH*$EXT}"
  else 
    SUSE_VERSION="${SUSE_VERSION%%-docker.$ARCH*$EXT}"
  fi
fi
SUSE_PRODUCT=$(echo ${IMAGE} | perl -p -e 's/^(sles|opensuse|obs-appliance|obs-source-service).*/$1/')
echo "Using SUSE_PRODUCT='$SUSE_PRODUCT'"
SUSE_PRODUCT_NAME=${SUSE_PRODUCT_MAP[$SUSE_PRODUCT]}

NAME="${SUSE_PRODUCT}${SUSE_VERSION}-docker-image"
RELEASE=$(date +%Y%m%d)

VERSION="${IMAGE#$PREFIX}"
IMAGE_NAME="${IMAGE%%$EXT}"
VERSION="${VERSION%%$SUFFIX}"
if [ -z "$VERSION" ]; then
    echo "Local build detected"
    # Just arbitrarily assign the version since we have nothing else
    # to go on.
    VERSION=1
fi

echo "name $NAME"
echo "version $VERSION"
echo "release $RELEASE"
echo "image_name $IMAGE_NAME"


# keep __SLE_VERSION__ in there for backwards compatiblity
# with older spec file templates
sed -e "s/__NAME__/$NAME/g" \
    -e "s/__VERSION__/$VERSION/g" \
    -e "s/__RELEASE__/$RELEASE/g" \
    -e "s/__SOURCE__/$IMAGE/g" \
    -e "s/__SLE_VERSION__/$SUSE_VERSION/g" \
    -e "s/__SUSE_VERSION__/$SUSE_VERSION/g" \
    -e "s/__SUSE_PRODUCT_NAME__/$SUSE_PRODUCT_NAME/g" \
    -e "s/__IMAGE_NAME__/$IMAGE_NAME/g" \
    < $SPEC_IN \
    > $BUILD_DIR/image.spec

changelog-generator --new-packages $PACKAGES \
  --old-packages /usr/share/changelog-generator-data/old.packages.$ARCH \
  --changelog /usr/share/changelog-generator-data/old.changes.$ARCH > $BUILD_DIR/image.changes

cat $BUILD_DIR/image.changes >> $BUILD_DIR/image.spec
mv $BUILD_DIR/image.changes $IMAGE_DIR

# Local builds have the file already in place, that's not true on IBS
if [ ! -f $TOPDIR/SOURCES/$IMAGE ]; then
  ln $IMAGE $TOPDIR/SOURCES
fi

# Make sure /usr/src/packages/* dirs exist
if [ ! -f $TOPDIR/BUILD ]; then
  echo "Create BUILD dir"
  mkdir -p $TOPDIR/BUILD
fi

if [ ! -f $TOPDIR/SRPMS ]; then
  echo "Create SRPMS dir"
  mkdir -p $TOPDIR/SRPMS
fi

if [ ! -f $TOPDIR/RPMS/$ARCH ]; then
  echo "Create SRPMS dir"
  mkdir -p $TOPDIR/RPMS/$ARCH
fi

rpmbuild -ba $BUILD_DIR/image.spec

# required for the BS to find the rpm, because it is
# a "non-standard result file for KIWI"
mkdir -p $TOPDIR/OTHER
mv $TOPDIR/RPMS/$ARCH/$NAME-$VERSION-$RELEASE.$ARCH.rpm $TOPDIR/OTHER/
mv $TOPDIR/SRPMS/$NAME-$VERSION-$RELEASE.src.rpm $TOPDIR/OTHER/

