#!/usr/bin/env bash
CHANGESET=$1
TICKET=$2
# check to see if changeset or file have been specified
# and whether ZENHOME is directory
if [ ! -z "$ZENHOME" -a ! -d $ZENHOME ]; then
    echo "Unable to determine \$ZENHOME (ie where the patches should be applied)" >&2
    exit 1 
fi 

if [ -z "$CHANGESET" -o "$CHANGESET" = '--help' -o "$CHANGESET" = '-h' ]; then
    cmd=`basename $0`
    cat - >&2  <<USAGE
  $cmd: Specify a changeset, a patch file or a comand-line flag. 

  Usage:
$cmd --help
$cmd --list
$cmd --guess_ticket
$cmd --show_ticket_changesets
$cmd changeset
$cmd filename
USAGE
    exit 1
fi 

#are patching from trunk or branch
findStripSize () {
    rFILE=${ZENHOME}/Products/$1
    echo "determining strip size for ${rFILE}"
    ssize=3 
    if [[ `head -1 ${rFILE} | grep branches` ]] ; then
        ssize=4
    fi
    return $ssize
}



if [ $CHANGESET = '--list' ]; then
    patches=`ls -1 $ZENHOME/Products/*.patch 2>/dev/null | sed -e 's#.*/r\([0-9]\+\).patch#\1#' -e 's#.*/\(.*\).patch#\1#' | sort -n`
    if [ -z "$patches" ] ; then
        echo "No patch files or changesets applied using zenpatch"
    else
        echo "Patch    URL"
        echo "-----    ---"
        for patch in $patches ; do
            if [ -z "`echo $patch | tr -d 0-9`" ] ; then
                echo "$patch     http://dev.zenoss.org/trac/changeset/${patch}?new=${patch}"
            else
                echo "$patch"
            fi
        done
    fi
    exit 0
fi 

# NB: The appliances don't have 'which'
WHICH=which
$WHICH which >/dev/null 2>&1
if [ $? -gt 1 ] ; then   #  1- missing file, 127 - bad command
   which() { whereis $* | awk '{ print $2; }'; }
   $WHICH whereis >/dev/null 2>&1
   if [ $? -gt 1 ] ; then
      echo "Unable to find 'which' or 'whereis' -- exiting" >&2
      exit 1
   fi
fi

if [ $CHANGESET = '--guess_ticket' ]; then
    # sanity check for wget...
    if [ -x "$($WHICH curl 2>/dev/null)" ]; then
       get="curl -s"
    elif [ -x "$($WHICH wget 2>/dev/null)" ]; then
       get="wget -q -O -"
    else
        echo "Please install 'wget' or 'curl' to compare patches to fixes" >&2
       exit 1
    fi
    patches=`ls -1 $ZENHOME/Products/*.patch 2>/dev/null | grep /r | sed -e 's#.*/r\([0-9]\+\).patch#\1#' | sort -n`
    if [ -z "$patches" ] ; then
        echo "No changesets applied using zenpatch"
    else
        echo "Patch    Ticket"
        echo "-----    ------"
        for patch in $patches ; do
            if [ -z "`echo $patch | tr -d 0-9`" ] ; then
                tickets=`$get http://dev.zenoss.org/trac/changeset/${patch}?new=${patch} | grep Fixes | sed -e 's/.*#\([0-9]\+\).*/\1/'`
                echo "$patch     $tickets"
            fi
        done
    fi
    exit 0
fi

if [ $CHANGESET = '--show_ticket_changesets' ]; then
    # sanity check for wget...
    if [ -x "$($WHICH curl 2>/dev/null)" ]; then
       get="curl -s"
    elif [ -x "$($WHICH wget 2>/dev/null)" ]; then
       get="wget -q -O -"
    else
       echo "Please install 'wget' or 'curl' to compare patches to fixes" >&2
       exit 1
    fi
    if [ -z "$TICKET" ] ; then
       echo "Need to supply a ticket number for the --show_ticket_changesets flag"
       exit 1
    fi
    echo "Ticket    Changesets"
    echo "------    ----------"
    $get http://dev.zenoss.org/trac/ticket/$TICKET | grep 'class="changeset"' | sed -e 's#.*changeset/\([0-9]\+\)" title="\(.*\)#\1    \2#'
    exit 0
fi


# sanity check for patch...
if [ ! -x "`$WHICH patch 2>/dev/null`" ]; then 
    echo "Please install 'patch' or ensure 'patch' is in \$PATH" >&2 
    exit 1 
fi 


# use a diff file
if [ -e "$CHANGESET" ];	then
    echo "Using the file ${CHANGESET} as the patch source..."
    cp `pwd`/${CHANGESET} $ZENHOME/Products
    DFILE=${CHANGESET}

else
# get diff from svn
    # sanity check for wget...
    if [ -x "$($WHICH curl 2>/dev/null)" ]; then 
       get=curl 
    elif [ -x "$($WHICH wget 2>/dev/null)" ]; then 
       get="wget -q -O -" 
    else 
        echo "Please install 'wget' or 'curl' to download patches" >&2 
       exit 1
    fi

    echo "Getting patch from Internet..."
    echo "http://dev.zenoss.org/trac/changeset/${CHANGESET}?format=diff&new=${CHANGESET}"
    $get "http://dev.zenoss.org/trac/changeset/${CHANGESET}?format=diff&new=${CHANGESET}" \
    > ${ZENHOME}/Products/r${CHANGESET}.patch
    DFILE=r${CHANGESET}.patch
fi

#get the strip size for branch vs. trunk patches
findStripSize ${DFILE}
STRIPSIZE=$?


# apply patch
echo
echo "Applying patch with strip=${STRIPSIZE}"
cd $ZENHOME/Products
echo "patch -b --strip=${STRIPSIZE} < ${DFILE}"
patch -b --strip=${STRIPSIZE} < ${DFILE}

