#!/bin/bash

# Settings
PATCHES_DIR=trunk/patches
SYSTEM_ICONSET_DIR=trunk/iconsets/system/default
GIT_DIR=git
DEST_DIR=sources
WORK_DIR=work
PATCH_LOG=`readlink -f "long.log"`
SHORT_LOG=`readlink -f "short.log"`
SKIP_BAD_PATCHES="${SKIP_BAD_PATCHES:-0}"
BACKUP_POSTFIX=`date "+%F_%H%M%S"`

# Init
term_width=`tput cols`

die() { echo " !!!ERROR: ${1}"; exit 1; }

prepare_dir() {
  [ -z "${1}" ] && die "dir must not be empty";
  if [ ! -e "${1}" ]; then
    mkdir "${1}"
  else
    echo -en "${1} dir already exists. [b]ackup, [\033[4mr\033[0m]emove, [o]verwrite: "
    read -n 1 act
    case $act in
      b) echo "backuping..."; mv "${1}" "${1}.${BACKUP_POSTFIX}"; mkdir "${1}"  ;;
      o) echo "leave for overwriting" ;;
      ""|r) echo "removing..."; rm -rf "${1}"; mkdir "${1}" ;;
      *) die "unsupported option" ;;
    esac
    
  fi
  [ ! -d "${1}" ] && die "can't prepare dir ${1}"
}

unpack_git() {
  ( cd "${GIT_DIR}"; git archive --format=tar master ) \
  	| ( cd "${1}" ; tar xf - )
  (
    export ddir="${PWD}/${1}"
    cd "${GIT_DIR}"
    git submodule foreach '( git archive --format=tar HEAD ) \
    	| ( cd "${ddir}/${path}" ; tar xf - )'
  )
}

spatch() {
  PATCH_TARGET="${1}"

  echo -n " * applying ${PATCH_TARGET} ..." | tee -a $SHORT_LOG

  if (patch -p1 --dry-run -F 0 -i ${PATCH_TARGET}) >> $PATCH_LOG 2>&1
  then
    if (patch -p1 -i ${PATCH_TARGET} >> $PATCH_LOG 2>&1)
    then
    	echo "done" | tee -a $SHORT_LOG
	return 0
    else
    	echo "dry-run ok, but actual failed" | tee -a $SHORT_LOG
    fi
  else
    echo "failed" | tee -a $SHORT_LOG
  fi

  [ "${SKIP_BAD_PATCHES}" = "1" ] && { echo "skip buggy patch"  | tee -a $SHORT_LOG; return 0; }
  return 1
}


PATCHES=`ls -1 "${PATCHES_DIR}"/*diff 2>/dev/null`
[ -z "${PATCHES}" ] && die "patches not found in ${PATCHES_DIR}"
[ -d "${GIT_DIR}/.git" ] || die "${GIT_DIR} is not git repo"


prepare_dir "${DEST_DIR}"
prepare_dir "${WORK_DIR}"


ZENITY_LIST=`echo "${PATCHES}" | sed 's/.*/FALSE \0/'`
UP_TO=`zenity --title 'Patch selector' --text 'Apply patches up to?' \
	--list --radiolist --column '' --column Patch --height 440 \
	--width 600 ${ZENITY_LIST}`
[ "$?" != 0 ] && die "aborted"

echo "patches will be applied up to ${UP_TO}"

unpack_git "${DEST_DIR}"
unpack_git "${WORK_DIR}"
svn export "${SYSTEM_ICONSET_DIR}" "${WORK_DIR}/iconsets/system/default" --force
touch "${SHORT_LOG}"

if [ ! -z "${UP_TO}" ]
then
  for p in $PATCHES; do
     fp=$(readlink -f "${p}")
     ( cd "${WORK_DIR}"; spatch "${fp}" )
     [ "$?" = 0 ] || die "can't continue"
     [ "${p}" = "${UP_TO}" ] && [ "$1" = "-e" ] && break
     ( cd "${DEST_DIR}"; spatch "${fp}" )
     [ "$?" = 0 ] || die "can't continue"
    [ "${p}" = "${UP_TO}" ] && break;
  done
fi

( cd "${DEST_DIR}"; qconf; )
( cd "${WORK_DIR}"; qconf; ./configure --disable-growl --disable-bundled-qca \
  --debug --prefix=/usr --qtdir=/usr --enable-plugins )

[ -f psi.pro.user ] && cp psi.pro.user "${WORK_DIR}"
