#!/bin/bash
#
# buildinstall
#
# Copyright (C) 2007  Red Hat, Inc.  All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

die() {
   [ -n "$TREEDIR" ] && rm -rf $TREEDIR
   [ -n "$BUILDINSTDIR" ] && rm -rf $BUILDINSTDIR
   [ -n "$yumconf" ] && rm -rf $yumconf
   echo "Aborting buildinstall"
   echo "$@"
   exit 1
}

usage() {
    echo "Usage: buildinstall --version <version> --brand <brand> --product <product> --release <comment> [--output outputdir] [--discs <discstring>] <root>" >&2
    exit 1
}

CWD="$(pwd)"
PRODUCTPATH="anaconda"

while [ $# -gt 0 ]; do
    case $1 in
        # general options affecting how we build things
        --nogr)
            NOGRSTR="--nogr"
            shift
        ;;
        --debug)
            DEBUGSTR="--debug"
            shift
        ;;
        --localscripts)
            LOCALSCRIPTS="yes"
            shift
        ;;

        # release information
        --version)
            VERSION=$2
            shift; shift
        ;;
        --release)
            RELEASESTR=$2
            shift; shift
        ;;
        --product)
            PRODUCTSTR=$2
            shift; shift
        ;;
        --brand)
            BRANDSTR=$2
            shift; shift
        ;;
        --variant)
            VARIANT=$2
            shift; shift
        ;;
        --bugurl)
            BUGURL=$2
            shift; shift
        ;;
        --output)
            OUTPUT=$2
            shift; shift
        ;;
        --updates)
            UPDATES=$2
            shift; shift
        ;;
        --mirrorlist)
            MIRRORLIST="$MIRRORLIST $2"
            shift; shift
        ;;

        --yumconf)
            yumconf="$2"
            shift; shift
        ;;

        *)
            if [ -z "$REPO" ]; then
                REPO=$1
            else
                EXTRA_REPOS="$EXTRA_REPOS $1"
            fi
            shift
        ;;
    esac
done

if [ -z "$PRODUCTSTR" ]; then
    usage
fi

if [ -z "$VERSION" ]; then
    usage
fi

if [ -z "$REPO" ]; then
    usage
fi

if [ -z "$RELEASESTR" ]; then
    usage
fi

if [ -z "$BUGURL" ]; then
    BUGURL="your distribution provided bug reporting tool."
fi

if [[ "$REPO" =~ ^/ ]]; then
    [ -n "$OUTPUT" ] || OUTPUT=$REPO
    REPO="file://$REPO"
fi

if [ -z "$OUTPUT" ]; then
    usage
fi

if [ ! -d "$OUTPUT" ]; then
    mkdir -p $OUTPUT
fi

# The first -release and -logos package we are going to look for is the lowercase
if [ -z "$BRANDSTR" ]; then
    BRANDSTR="`echo $PRODUCTSTR | tr '[:upper:]' '[:lower:]'`"
fi
export brandpkgname="$BRANDSTR"

BUILDINSTDIR=$(mktemp -d ${TMPDIR:-/tmp}/buildinstall.tree.XXXXXX)
TREEDIR=$(mktemp -d ${TMPDIR:-/tmp}/treedir.XXXXXX)
CACHEDIR=$(mktemp -d ${TMPDIR:-/tmp}/yumcache.XXXXXX)

if [ -z "$yumconf" ]; then
    yumconf=$(mktemp ${TMPDIR:-/tmp}/yum.conf.XXXXXX)
    cat > $yumconf <<EOF
[main]
cachedir=$CACHEDIR
keepcache=0
gpgcheck=0
plugins=0
reposdir=
tsflags=nodocs

[anacondarepo]
name=anaconda repo
baseurl=$REPO
enabled=1
EOF

    n=1
    for r in $EXTRA_REPOS; do
        if [[ $r =~ ^/ ]]; then
            r="file://$r"
        fi
        cat >> $yumconf <<EOF

[anaconda-extrarepo-$n]
name=anaconda extra repo $n
baseurl=$r
enabled=1
EOF
        let n++
    done

    n=1
    for l in $MIRRORLIST; do
        cat >> $yumconf <<EOF

[anaconda-mirrorlistrepo-$n]
name=anaconda mirrorlist repo $n
mirrorlist=$l
enabled=1
EOF
        let n++
    done
else
    newyumconf=$(mktemp ${TMPDIR:-/tmp}/yum.conf.XXXXXX)
    cp $yumconf $newyumconf
    yumconf=$newyumconf
fi

echo "Running buildinstall..."

if [ "$LOCALSCRIPTS" = "yes" ]; then
    UPD_INSTROOT="$CWD/upd-instroot"
    MK_IMAGES="$CWD/mk-images"
    MK_TREEINFO="$CWD/maketreeinfo.py"
    MK_STAMP="$CWD/makestamp.py"
    BUILDINSTALL="$CWD/buildinstall"
else
    pushd $BUILDINSTDIR
    BUILDARCH=`repoquery -c $yumconf --qf "%{ARCH}\n" anaconda`
    # lets use rpmutils to make sure we have the canonical basearch
    # BUILDARCH != BASEARCH (e.g. i586 != i386, sparcv9 != sparc)
    BASEARCH=`python -c "import rpmUtils.arch; \
      print rpmUtils.arch.getBaseArch(myarch=rpmUtils.arch.getCanonArch(skipRpmPlatform = True));"`
    yumdownloader -c $yumconf anaconda || exit 1
    rpm_verify anaconda*rpm || exit 1
    rpm2cpio anaconda*rpm | cpio --quiet -iumd './usr*'
    rm -f anaconda*rpm
    popd

    UPD_INSTROOT=./upd-instroot
    MK_IMAGES=./mk-images
    MK_TREEINFO=./maketreeinfo.py
    MK_STAMP=./makestamp.py
    BUILDINSTALL=./buildinstall

    for f in $UPD_INSTROOT $MK_IMAGES $MK_STAMP $MK_TREEINFO $BUILDINSTALL; do
        if [ -n "$UPDATES" -a -f $UPDATES/usr/lib/anaconda-runtime/$f ]; then
            cp -a $UPDATES/usr/lib/anaconda-runtime/$f* $BUILDINSTDIR/
        elif [ ! -f $f ]; then
            cp -a $BUILDINSTDIR/usr/lib/anaconda-runtime/$f* $BUILDINSTDIR/
        else
            cp -a $f* $BUILDINSTDIR/
        fi
    done

    UPD_INSTROOT=$BUILDINSTDIR/upd-instroot
    MK_IMAGES=$BUILDINSTDIR/mk-images
    MK_TREEINFO=$BUILDINSTDIR/maketreeinfo.py
    MK_STAMP=$BUILDINSTDIR/makestamp.py
    BUILDINSTALL=$BUILDINSTDIR/buildinstall
fi

if [ -n "$UPDATES" ]; then UPDATES="--updates $UPDATES"; fi

echo "Building images..."
$UPD_INSTROOT $DEBUGSTR $NOGRSTR --arch $BUILDARCH $UPDATES --imgdir $TREEDIR/install $yumconf || die "upd-instroot failed"

echo "Writing .treeinfo file..."
# NOTE --arch must match MK_IMAGES or the resulting treeinfo will be invalid
$MK_TREEINFO --family="$PRODUCTSTR" ${VARIANT:+--variant="$VARIANT"} --version=$VERSION --arch=$BASEARCH --outfile=$OUTPUT/.treeinfo

# FIXME: need to update mk-images to take the yumconf
echo "Making images: $PWD"
$MK_IMAGES $DEBUGSTR $NOGRSTR --imgdir $TREEDIR/install --arch $BASEARCH --product "$PRODUCTSTR" --version $VERSION --bugurl "$BUGURL" --output $OUTPUT $yumconf || die "image creation failed"

echo "Writing .discinfo file"
$MK_STAMP --releasestr="$RELEASESTR" --arch=$BASEARCH --discNum="ALL"  --outfile=$OUTPUT/.discinfo

rm -rf $TREEDIR $BUILDINSTDIR
rm -f $yumconf