#!/bin/bash

#####
#Usage:
#   oscsubmit [<OBS_Project> [<OBS_Target> [<logfile>]]]
#
#   OBS_Project - BuildService project to submit the package to.
#                 If not definet, YaST:Head is used
#   OBS_Target  - Target project to create request to move to.
#                 If not defined, openSUSE:Factory is used
#   logfile     - File to write submission log to.
#                 If not defined, ~/.y2submitlog is used.
#                 File is deleted prior each package submission
#####
# Author: Jiri Srain <jsrain@suse.cz>
#####

printhelp()
{
        echo "Usage: $0 [OPTIONS]"
        echo
        echo "OPTIONS:"
        echo "  -h, --help          this message"
        echo "  -d, --devel-project development project to submit to; default YaST:Head"
        echo "  -p, --project       project to create submit request to"
        echo "  -l, --log           the logfile, default ~/.y2submitlog"
        echo "  -e, --empty-log     empty the log before starting"
        echo
}

# inirialize default values
OBS_PROJECT=YaST:Head
OBS_MOVE_PROJECT=""
LOGFILE=~/.y2submitlog

# parse parameters
TEMP=`/usr/bin/getopt -o hl:d:p:e --long help,log:,devel-project:,project:,empty-log \
     -n 'oscsubmit' -- "$@"`

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

while true ; do
        case "$1" in
                -h|--help) printhelp; exit 0 ;;
		-l|--log) LOGFILE="$2"; shift 2; ;;
		-d|--devel-project) OBS_PROJECT="$2"; shift 2; ;;
		-p|--project) OBS_MOVE_PROJECT="$2"; shift 2; ;;
                -e|--empty-log) EMPTY_LOG=1; shift; ;;
		--) shift ; break ;;
                *) echo "Unrecognized option $1" ; exit 1 ;;

                # IMPORTANT: Remember to change that "getopt" call above, too
                # if you change anything here!
        esac
done

PACKAGE=`cat RPMNAME`;

OSCVER=$(osc --version)
OSCVER=$((1000*${OSCVER/./+}))
if [ $OSCVER -lt 119 ]; then
    SUBMITREQ="sr create"
else
    SUBMITREQ="sr"
fi

test -f $LOGFILE && test -z $EMPTY_LOG || rm $LOGFILE
if test -z $OBS_MOVE_PROJECT; then
    echo "Submitting $PACKAGE to $OBS_PROJECT" | tee -a $LOGFILE
else
    echo "Submitting $PACKAGE to $OBS_PROJECT, forwarding to $OBS_MOVE_PROJECT" | tee -a $LOGFILE
fi

echo -n "Checking out module from OBS... " | tee -a $LOGFILE
echo "" >>$LOGFILE;
if osc co $OBS_PROJECT $PACKAGE >>$LOGFILE 2>&1; then
    echo "OK" | tee -a $LOGFILE
else
    echo "Failed" | tee -a $LOGFILE; exit 3
fi

echo -n "Preparing new package for submission... " | tee -a $LOGFILE
echo "" >>$LOGFILE;

# FIXME directory may be empty
rm $OBS_PROJECT/$PACKAGE/* 2>&1 | tee -a $LOGFILE
test -d build/package && cp build/package/* $OBS_PROJECT/$PACKAGE  # needed for cmake-based modules

cp package/* $OBS_PROJECT/$PACKAGE
# do not submit *.rej and *.orig files left after failed patching/merging
rm -rf $OBS_PROJECT/$PACKAGE/*.rej $OBS_PROJECT/$PACKAGE/*.orig

echo "OK" | tee -a $LOGFILE
diff $OBS_PROJECT/$PACKAGE/*changes $OBS_PROJECT/$PACKAGE/.osc/*changes >diff
test -f $OBS_PROJECT/$PACKAGE/.osc/*changes || echo "< New package" >diff
cat diff | tee -a $LOGFILE
if grep '^>' diff ; then
    echo "There are changes in OBS only not reflected in SVN. Merge them first." | tee -a $LOGFILE
    exit 4
fi

if grep '^<' diff ; then
    echo -n "";
else
    echo "There are no new changes in SVN." | tee -a $LOGFILE
    exit 4
fi

echo -n "Submitting the package... " | tee -a $LOGFILE
echo "" >>$LOGFILE;
osc addremove $OBS_PROJECT/$PACKAGE >>$LOGFILE
find $OBS_PROJECT >>$LOGFILE;
if osc ci -F diff $OBS_PROJECT/$PACKAGE >>$LOGFILE 2>&1 ; then
    echo "OK" | tee -a $LOGFILE
else
    echo "Failed" | tee -a $LOGFILE; exit 5
fi

if [ -z $OBS_MOVE_PROJECT ]; then
    echo "To create submit request, run
osc $SUBMITREQ --nodevelproject $OBS_PROJECT $PACKAGE <project>,
to submit to Factory, run.
osc $SUBMITREQ --nodevelproject $OBS_PROJECT $PACKAGE openSUSE:Factory


" | tee -a $LOGFILE
else
    echo -n "Forwarding package from $OBS_PROJECT to $OBS_MOVE_PROJECT... " | tee -a $LOGFILE
    echo "" >>$LOGFILE;
    if osc $SUBMITREQ --nodevelproject $OBS_PROJECT $PACKAGE $OBS_MOVE_PROJECT ; then
        echo "OK" | tee -a $LOGFILE
    else
        echo "Failed" | tee -a $LOGFILE; exit 6
    fi
fi

echo -n "Cleaning up... " | tee -a $LOGFILE
echo "" >>$LOGFILE;
rm diff;
rm -rf $OBS_PROJECT;
echo "OK" | tee -a $LOGFILE
exit 0;
