#!/bin/bash -xe

WORK_SPACE="$WORKSPACE"
TMP_DIR="$WORK_SPACE/.tmp"
TIZEN_SOURCE="$WORK_SPACE/tizen"
GBS_BUILD_ROOT="$WORK_SPACE/GBS-ROOT"
BUILD_ID=
LOCAL_REPO_DIR=
KS_FILES=
OUTPUT_DIR="$WORK_SPACE/$JOB_NAME/tizen_$(date +%Y%m%d)#${BUILD_NUMBER}"
GBS_BUILD_ARGS= # default enabled args
PKGS_FROM_PUB="$WORKSPACE/PACKAGES_FROM_PUBLIC"

# Prepare build env
prepare_build_env()
{
    export no_proxy="165.213.149.200,10.113.136.118,10.113.136.109"
    mkdir -p $TIZEN_SOURCE
    sudo rm -rf "$JOB_NAME"
    mkdir -p $OUTPUT_DIR/repos
    mkdir -p $OUTPUT_DIR/builddata
    mkdir -p $OUTPUT_DIR/images
    mkdir -p $OUTPUT_DIR/builddata/image-configs

    test -e $TMP_DIR || mkdir $TMP_DIR
}

cleanup_and_exit ()
{
    #sudo rm $OUTPUT_DIR -rf
    sudo mv $GBS_BUILD_ROOT $GBS_BUILD_ROOT"_$(date +%Y%m%d)#${BUILD_NUMBER}"
    rm -rf $TMP_DIR
    exit $1
}

# Build gbs args using jenkins job options
gen_gbs_build_args()
{
    GBS_BUILD_ARGS="-B $GBS_BUILD_ROOT $GBS_BUILD_ARGS $BUILD_ARGS "
    [ -n "$EXCLUDE_PACKAGES" ] && GBS_BUILD_ARGS="$GBS_BUILD_ARGS --exclude=$EXCLUDE_PACKAGES"
    [ -z "$PARALEL_THREADS" ] && $PARALEL_THREADS="4"
    GBS_BUILD_ARGS="$GBS_BUILD_ARGS --threads=$PARALEL_THREADS"
    for repo in $REMOTE_REPOS
    do
        ret=`echo $repo |grep $PROFILE`
        if test x$ret != x ;then
            profile="tizen_$PROFILE"
            break
        fi
    done

    echo "[general]" > $TIZEN_SOURCE/.gbs.conf
    echo "profile = profile.$profile" >>$TIZEN_SOURCE/.gbs.conf
    echo "fallback_to_native = true" >>$TIZEN_SOURCE/.gbs.conf

    echo "[profile."$profile"]" >>$TIZEN_SOURCE/.gbs.conf
    repo_num=`echo $REMOTE_REPOS |awk '{print NF}'`
    for i in `seq $repo_num`
    do
        if test $i -eq $repo_num;then
            repos=$repos"repo.$i"
        else
            repos="repo.$i, "
        fi
    done
    echo "repos = $repos" >>$TIZEN_SOURCE/.gbs.conf
    echo "user = y0169.zhang" >>$TIZEN_SOURCE/.gbs.conf
    echo "passwd = abc123" >>$TIZEN_SOURCE/.gbs.conf
    #echo "buildconf = ~/tizen_$PROFILE_kvm.conf" >>$TIZEN_SOURCE/.gbs.conf

    i=1
    for repo in $REMOTE_REPOS
    do
        ret=`echo $repo |grep $PROFILE`
        if test x$ret != x ;then
            last=$repo
            continue
        fi
        echo "[repo."$i"]" >>$TIZEN_SOURCE/.gbs.conf
        echo "url = $repo""packages/" >>$TIZEN_SOURCE/.gbs.conf
        let "i++"
    done

    echo "[repo."$i"]" >>$TIZEN_SOURCE/.gbs.conf
    echo "url = $last""packages/" >>$TIZEN_SOURCE/.gbs.conf
}

# Update ks files with new repos
update_ks_file(){
    # KS files
    for repo in $REMOTE_REPOS
    do
        ret=`echo $repo |grep $PROFILE`
        if test x$ret != x;then
            sed -i 's#^\(repo.*\)http.*@BUILD_ID@/repos/.*/packages/\(.*\)$#\1'"${repo}packages/"'\2#' $KS_FILES
            continue
        fi

        ret=`echo $repo |grep base`
        if test x$ret != x;then
            sed -i 's#^\(repo.*\)http.*base.*/repos/.*/packages/\(.*\)$#\1'"${repo}packages/"'\2#' $KS_FILES
            continue
        fi
    done

    sed -i 's/^repo .*/& --priority=99 --ssl_verify=no/' $KS_FILES
    sed -i "/^repo/ a\repo --name=local  --baseurl=file://$LOCAL_REPO_DIR --priority=1" $KS_FILES

}

#Create images
create_images()
{
    if [ -z "$KS_FILES" ]; then
        echo "No KS files found, skip image creation "
        return
    fi

    update_ks_file

    for ks in $KS_FILES
    do
        ks_file=$(basename $ks)
        sudo mic cr auto $ks --release=$BUILD_ID \
                             --logfile=${BUILD_ID}_${ks_file%.*} \
                             -o $OUTPUT_DIR/images || true
    done

    if [ -e "$OUTPUT_DIR/images/${BUILD_ID}/images" ]; then
        sudo mv $OUTPUT_DIR/images/${BUILD_ID}/images/* $OUTPUT_DIR/images/
        sudo rm $OUTPUT_DIR/images/${BUILD_ID} -rf
    fi
}

# publish build artifacts
publish_artifacts()
{
    cd $OUTPUT_DIR
    if [ -e "$LOCAL_REPO_DIR/repodata" -a \
         -e "$LOCAL_REPO_DIR/RPMS" -a \
         -e "$LOCAL_REPO_DIR/logs" -a \
         -e "$LOCAL_REPO_DIR/index.html" ]; then
        ln -s "$LOCAL_REPO_DIR/repodata" "$LOCAL_REPO_DIR/RPMS" repos/
        cp $LOCAL_REPO_DIR/index.html builddata/
        ln -s $LOCAL_REPO_DIR/logs builddata/
        rsync -avzk "$WORK_SPACE/$JOB_NAME" $PUBLISH_URL || cleanup_and_exit 1
    else
        echo "No build report generated"
    fi
}

clone_pkgs_from_public()
{
    pushd $TIZEN_SOURCE
    if test -s $PKGS_FROM_PUB;then
        echo "Have some packages need clone from public tizen gerrit."
        while read line
        do
            path=`echo $line |awk '{print $1}'`
            commit=`echo $line |awk '{print $2}'`
            pkg=${path##*/}
            rm -rf $pkg
            giturl="ssh://zhangy@review.tizen.org:29418/$path"
            git clone $giturl
            git --git-dir=$pkg/.git --work-tree=$pkg/ reset --hard $commit
        done < $PKGS_FROM_PUB
    fi
    popd
}

# 1:find the invalid packages list
# 2:according to this list, clear the local source rpm.
clear_invalid_packages()
{
	mkdir -p ./packages
	pushd ./packages
	wget -r -np -nd $1/packages/repodata/
	primary_file=`ls -l *primary.xml.gz | awk '{print $9}'`
	primary_file=gunzip $parmary_file
}

# Clone & sync source code
prepare_tizen_src()
{
    for repo in $REMOTE_REPOS
    do
        ret=`echo $repo |grep $PROFILE`
        if test x$ret != x ;then
            a=`dirname $repo`
            a=`dirname $a`
            a=`basename $a`
            TIZEN_SOURCE=$TIZEN_SOURCE/$a"-"$ARCH
            if test -d $TIZEN_SOURCE;then
                echo "Source files exsit, skip download..."
                clone_pkgs_from_public
                return
            fi

            mkdir -p $TIZEN_SOURCE
            break
        fi
    done

    download_path=$TIZEN_SOURCE/dl/
    if test ! -d $download_path;then
        mkdir -p $download_path
    fi
    for repo in $REMOTE_REPOS
    do
        ret=`echo $repo |grep $PROFILE`
        if test x$ret != x ;then
            source_path=$repo"source/"
            break
        fi
    done
    #download source rpms those belong to Arch
    pushd $JENKINS_HOME/jenkins-scripts/
    python ./SyncPackages.py $repo $download_path $ARCH
    popd
    pushd $TIZEN_SOURCE
    for src in `ls dl/*.src.rpm`
    do
        gbs import $src
    done
    popd

    clone_pkgs_from_public
}

# Get ks files via unpack image-configurations.rpm
get_ks_files()
{
    image_configurations_rpm=`find $LOCAL_REPO_DIR ! -name "image-configurations-debug*.noarch.rpm" -a -name "image-configurations*.noarch.rpm"`
    if [ -z $image_configurations_rpm ]; then
        echo "No image-configuation rpm generated, so can't get ks files"
        return 1
    fi

    rpm -K $image_configurations_rpm || cleanup_and_exit 1;

    for ks_file in $(rpm2cpio $image_configurations_rpm |cpio -t)
    do
        echo $ks_file|grep "ks$" || continue
        ks_base_name=$(basename $ks_file)
        rpm2cpio $image_configurations_rpm |cpio -i --quiet --to-stdout $ks_file >"$OUTPUT_DIR/builddata/image-configs/$ks_base_name"
        KS_FILES="$KS_FILES $OUTPUT_DIR/builddata/image-configs/$ks_base_name"
    done

}


#MAIN START

prepare_build_env

prepare_tizen_src

#Building tizen source packages using gbs build
cd $TIZEN_SOURCE
gen_gbs_build_args
time gbs build --arch $ARCH $GBS_BUILD_ARGS --define 'jobs 40' --define '_smp_mflags -j40'|| true

profile_name=$(sed -n 's/profile.*=.*profile\.\(.*\)/\1/p' $TIZEN_SOURCE/.gbs.conf)
LOCAL_REPO_DIR="$GBS_BUILD_ROOT/local/repos/$profile_name/$ARCH"

# Building Images
get_ks_files && create_images

#cleanup_and_exit 0

