#!/bin/bash
# Set builder for specfile
BUILDER="Stephen Collier <stephenbcollier@gmail.com>"

function version_gt() {
    [[ ( "$(echo "$@" | tr " " "\n" | sort -V | tail -n 1)" == "$1" ) && ( "$1" != "$2" ) ]]
}

function update_rpm_to_latest_src {
    MOCK_CFG=$1
    TYPE=$2
    ARCH=$3
    RPM=$4
    # Get latest src rpm version
    FILE=`ls /var/ftp/pub/home/SRPMS/"$RPM"* | sort -rV | sed -n 1p | sed -e 's/.*\///g' | sed -e 's/\.src\.rpm//'`
    if [ "$ARCH" = "i686" -o "$ARCH" = "i586" -o "$ARCH" = "i486" ]
    then
        RPMS_ARCH="i386"
    else
        RPMS_ARCH=$ARCH
    fi
    if ! test -f /var/ftp/pub/home/RPMS/"$TYPE"/"$RPMS_ARCH"/"$FILE".*."$ARCH".rpm
    then
        sudo mock -r $MOCK_CFG rebuild /var/ftp/pub/home/SRPMS/"$FILE".src.rpm
        sudo rsync -av /var/lib/mock/$MOCK_CFG/root/builddir/build/RPMS/  /var/ftp/pub/home/RPMS/$TYPE/$RPMS_ARCH
        homerepo $TYPE $RPMS_ARCH
    fi
}

function update_git_version {
    # Move to master git repository
    cd /var/local/git/mythtv/mythtv
    # Pull latest
    git pull
    # Find what lastest is
    GIT_DESCRIBE=`git describe`
    # Pull information apart to be usefull 
    GIT_TAG=`git describe | awk '{print substr($1,2); }' | awk '{split($0,a,"-"); print a[1] }'`
    LIB_VERSION=`echo -n $GIT_TAG | cut -d'.' -f1,2`
    GIT_COMMITS=`git describe | awk '{split($0,a,"-"); print a[2] }'`
    # If we hit an exact tag we will not get any commits so need to set it
    if [ -z $GIT_COMMIT ]; then
        GIT_COMMIT="0"
    fi
    # last update stores the last commit number that was built
    read LAST < ../last_update.txt
    read VERSION < ../last_version.txt
    read RELEASE < ../last_release.txt
    RELEASE=`expr $RELEASE + 1`
    LASTDATE=`stat -c "%Y" ../last_update.txt`
    NOW=`date -d now +"%s"`
    DAYSDIFF=$((($NOW-$LASTDATE)/(60*60*24)))
    echo $DAYSDIFF
    #Check for new version and set flag
    NEWVERSION=0
    if version_gt $GIT_TAG $VERSION; then
       echo "NEW VERSION"
       NEWVERSION=1
       RELEASE=1
       cd mythtv
       git archive --format=tar --prefix=mythtv-$GIT_TAG/ v$GIT_TAG | bzip2 > ~/rpmbuild/SOURCES/mythtv-$GIT_TAG.tar.bz2 
       cd ../mythplugins
       git archive --format=tar --prefix=mythplugins-$GIT_TAG/ v$GIT_TAG | bzip2 > ~/rpmbuild/SOURCES/mythplugins-$GIT_TAG.tar.bz2 
       cd ../
    fi

    # if last less greater or equal to 5 then rebuild or
    # the last commit was 7 days ago and we have not built it
    # or there is a new version
    if [[ ( $GIT_COMMITS -ge $((LAST+5)) ) ||  (( $DAYSDIFF -gt 7 ) &&  ( $GIT_COMMITS -ge $((LAST+1)) )) || ( $NEWVERSION -gt 0 ) ]]; 
    then
        # reindex to fix up dirty on git 1.7.6 or earlier
        git update-index --refresh
        # Fix up mythtv version
        SOURCE_VERSION=$(git describe --dirty || git describe || echo Unknown)
        BRANCH=$(git branch --no-color | sed -e '/^[^\*]/d' -e 's/^\* //' -e 's/(no branch)/exported/')
        #create diff git patches
        git diff --no-prefix v$GIT_TAG mythtv >~/rpmbuild/SOURCES/mythtv-$GIT_TAG-gitfixes.patch
        git diff --no-prefix v$GIT_TAG mythplugins >~/rpmbuild/SOURCES/mythplugins-$GIT_TAG-gitfixes.patch
        #create diff patch for version
        cat > ~/rpmbuild/SOURCES/version-$GIT_TAG.patch <<EOF
diff -Naur mythtv/EXPORTED_VERSION.orig mythtv/EXPORTED_VERSION
--- mythtv/EXPORTED_VERSION.orig       2014-05-26 23:16:57.000000000 +1000
+++ mythtv/EXPORTED_VERSION    2014-06-27 23:52:50.951965264 +1000
@@ -1,2 +1,2 @@
-SOURCE_VERSION="\$Format:%h$"
-BRANCH="\$Format:%d$"
+SOURCE_VERSION=${SOURCE_VERSION}
+BRANCH=${BRANCH}
EOF
        # modify the spec file with the information from above
        sed 's/^#%global libversion.*$/#%global libversion '$LIB_VERSION'/'  ~/rpmbuild/SPECS/mythtv.spec > ~/rpmbuild/SPECS/mythtv.spec.tmp
        sed 's/^Version:.*$/Version: '$GIT_TAG'/'  ~/rpmbuild/SPECS/mythtv.spec.tmp > ~/rpmbuild/SPECS/mythtv.spec.tmp.1
        sed 's/^Release:.*$/Release: '$RELEASE'%{?dist}/'  ~/rpmbuild/SPECS/mythtv.spec.tmp.1 > ~/rpmbuild/SPECS/mythtv.spec.tmp
        # add coment to changelog in spec filr
        DATE_STR=`date +'%a %b %d %Y'`
        sed 's/^%changelog/%changelog\n* '"$DATE_STR"' '"$BUILDER"' - '$GIT_TAG'-'$RELEASE'\n- Update to latest git fixes ('$GIT_DESCRIBE').\n/'  ~/rpmbuild/SPECS/mythtv.spec.tmp > ~/rpmbuild/SPECS/mythtv.spec.tmp.1
        # make a backup of spec for rollback if build failure
        cp  ~/rpmbuild/SPECS/mythtv.spec  ~/rpmbuild/SPECS/mythtv.spec.$RELEASE.orig
        cp  ~/rpmbuild/SPECS/mythtv.spec.tmp.1  ~/rpmbuild/SPECS/mythtv.spec
        cp  ~/rpmbuild/SPECS/mythtv.spec  ~/rpmbuild/SPECS/mythtv.spec.$RELEASE
        # remove temorary spec files
        rm ~/rpmbuild/SPECS/mythtv.spec.tmp.1
        rm ~/rpmbuild/SPECS/mythtv.spec.tmp
        # build srpm
        sudo mock -r $MOCK_CFG --buildsrpm --spec ~/rpmbuild/SPECS/mythtv.spec  --sources ~/rpmbuild/SOURCES
        # rollback spec in case of failure
        cp ~/rpmbuild/SPECS/mythtv.spec.$RELEASE.orig ~/rpmbuild/SPECS/mythtv.spec
    	# copy srpm to ftp server make it non type 
    	sudo cp /var/lib/mock/$MOCK_CFG/result/mythtv-$GIT_TAG-$RELEASE.$TAG.src.rpm  /var/ftp/pub/home/SRPMS/mythtv-$GIT_TAG-$RELEASE.src.rpm
        # success so update the spec
        cp ~/rpmbuild/SPECS/mythtv.spec.$RELEASE ~/rpmbuild/SPECS/mythtv.spec
        rm ~/rpmbuild/SPECS/mythtv.spec.$RELEASE
        # update the commit log to current
        echo $GIT_COMMITS > ../last_update.txt
        echo $RELEASE > ../last_release.txt
        echo $GIT_TAG > ../last_version.txt
    fi
}

function mock_build_nvidia_rpm
{
# mock utility to create rpm from spec
#
# Check if we have a new kernel
    MOCK_CFG=$1
    TYPE=$2
    ARCH=$3
    SITE=$4
    echo $1 $2 $3 $4
    curl --connect-timeout 60 --max-time 900 -s $SITE --list-only | awk 'match($0, />kernel-[0-9][a-z,A-Z,0-9,_,.,-]+.rpm</) { print substr($0,RSTART+1,RLENGTH-2) }' | sed 's/<.*>/ /' | sort -V | tail -1 > /var/local/git/mythtv/latest_"$TYPE"_"$ARCH"_kernel.txt
    if diff /var/local/git/mythtv/latest_"$TYPE"_"$ARCH"_kernel.txt /var/local/git/mythtv/last_"$TYPE"_"$ARCH"_kernel.txt || [ ! -s /var/local/git/mythtv/latest_"$TYPE"_"$ARCH"_kernel.txt ] >/dev/null ; then echo 'No new kernel'
    else
# Move to the versions
        shift; shift; shift; shift;
        for vers in "$@"
        do
# Build the version
            if ! test -f /var/ftp/pub/home/SRPMS/nvidia-graphics$vers-$vers.src.rpm
            then
               # build srpm
               sudo mock -r "$MOCK_CFG" --buildsrpm --spec ~/rpmbuild/SPECS/nvidia-graphics$vers.spec  --sources ~/rpmbuild/SOURCES
    	       # copy srpm to ftp server make it non type 
    	       sudo cp /var/lib/mock/$MOCK_CFG/result/nvidia-graphics$vers-$vers*.src.rpm  /var/ftp/pub/home/SRPMS/nvidia-graphics$vers-$vers.src.rpm
            fi
            sudo mock --define "kmdl_userland 1" -r $MOCK_CFG rebuild /var/ftp/pub/home/SRPMS/nvidia-graphics$vers-$vers.src.rpm
            if [ "$ARCH" = "i686" -o "$ARCH" = "i586" -o "$ARCH" = "i486" ]
            then
                sudo rsync -av /var/lib/mock/$MOCK_CFG/root/builddir/build/RPMS/  /var/ftp/pub/home/RPMS/"$TYPE"/i386
                homerepo $TYPE i386
            else
                sudo rsync -av /var/lib/mock/$MOCK_CFG/root/builddir/build/RPMS/  /var/ftp/pub/home/RPMS/"$TYPE"/"$ARCH"
                homerepo $TYPE $ARCH
            fi
            sudo mock --no-clean --define "kmdl_userland 0" -r $MOCK_CFG rebuild /var/ftp/pub/home/SRPMS/nvidia-graphics$vers-$vers.src.rpm
            if [ "$ARCH" = "i686" -o "$ARCH" = "i586" -o "$ARCH" = "i486" ]
            then
                sudo rsync -av /var/lib/mock/$MOCK_CFG/root/builddir/build/RPMS/  /var/ftp/pub/home/RPMS/"$TYPE"/i386
                homerepo $TYPE i386
            else
                sudo rsync -av /var/lib/mock/$MOCK_CFG/root/builddir/build/RPMS/  /var/ftp/pub/home/RPMS/"$TYPE"/"$ARCH"
                homerepo $TYPE $ARCH
            fi
        done
        mv -f /var/local/git/mythtv/latest_"$TYPE"_"$ARCH"_kernel.txt /var/local/git/mythtv/last_"$TYPE"_"$ARCH"_kernel.txt
    fi
}

# Set bailout on error
set -e 
MOCK_CFG=$1
TAG=$2
ARCH=$3
REPO=$4

# Move to master git repository
cd /var/local/git/mythtv/mythtv
# Build the nvidia drivers
mock_build_nvidia_rpm "$MOCK_CFG" "$TAG" "$ARCH" "$REPO" 340.17 331.79 337.25 304.121
update_git_version
update_rpm_to_latest_src "$MOCK_CFG" "$TAG" "$ARCH" ffmpeg
update_rpm_to_latest_src "$MOCK_CFG" "$TAG" "$ARCH" libquicktime
update_rpm_to_latest_src "$MOCK_CFG" "$TAG" "$ARCH" transcode
update_rpm_to_latest_src "$MOCK_CFG" "$TAG" "$ARCH" mythtv
# rsync to update
rsync -avz -e ssh --delete --rsync-path=~/bin/rsync /var/ftp/pub/home/ user@example.com:~/public_html/pub/
