#!/bin/bash

set -e

if [ "$1" = "--help" ]
then
	cat <<__END__
upgrade - Upgrade a package to the version in the package plan

__END__
	$0 --manpage
	exit 0
fi


if [ "$1" = "--manpage" ]
then
cat <<__END__
Usage: dht upgrade [-D dist] directory/

This script will:

 * Query the package plan for the desired version number.
 * Run debchange to amend the debian/changlog.
 * Run cabal-debian --official --upgrade to upgrade the packaging.
 * Optimistically mark the package as ready for release
 * Commit this to git.

At the end, it will rightfully ask you to review the changes,
giving you a helpful link to the diff between the upstream sources.
__END__
	exit 0;
fi

if [ "$1" = "-D" ]
then
	dist="$2"
	shift
	shift
else
	dist=unstable
fi

if ! git diff-files --quiet -- "$@"
then
      echo "The git repository is not clean. Please fix that first!"
      exit 1
fi

if ! git diff-index --cached --quiet HEAD -- "$@"
then
      echo "WARNING: The git index is not clean, and will be amended!"
fi

if test -n "$(git ls-files --exclude-standard --others -- "$@")"
then
      echo "The git repository has untracked files. Please fix that first!"
      exit 1
fi


for dir in "$@"
do
  pushd $dir >/dev/null

  if [ ! -d debian ]
  then
    echo "ERROR: No debian/ directory found in $dir; run me in the packaging directory."
    continue
    popd $dir >/dev/null
  fi


  cabal_name="$(cat debian/watch | grep http | cut -d/ -f5)"
  package="$(grep-dctrl -n -s Source . < debian/control)"
  old_version=`dpkg-parsechangelog -ldebian/changelog -c1 | grep-dctrl -n -s Version .`
  old_version=`echo $old_version | cut -d- -f1` # this could be improved
  if echo $old_version | fgrep -q : ; then
	old_version=`echo $old_version | cut -d: -f2-`
	epoch=`echo $old_version | cut -d: -f1`:
  else
          epoch=''
  fi

  version=$(grep "^$cabal_name " ../../../package-plan/packages.txt|cut -d\  -f2)

  if [ -z "$version" ]
  then
	echo "could not detect version to upgrade to."
	exit 1
  fi

  if [ "$version" = "$old_version" ]
  then
	echo "No new version to upgrade to."
	exit 1
  fi

  branch_name="$(git symbolic-ref -q HEAD)"
  branch_name="${branch_name##refs/heads/}"

  git checkout --orphan dht-update-tmp

  # base commit
  origtargz -u
  dht cabal-debian --upgrade
  git add .
  git commit -q -m 'Temporary base commit'

  # next commit
  debchange --changelog debian/changelog --newversion="$epoch$version-1" 'New upstream release'
  origtargz -u
  dht cabal-debian --upgrade
  dch -D $dist -r ''
  git commit . -q -m "$cabal_name: Upgrading from $old_version to $version"

  commit=$(git rev-parse HEAD)
  git checkout "$branch_name"
  git branch -D dht-update-tmp
  if git cherry-pick $commit 
  then
    echo "Upgraded $cabal_name to $version:"
    git diff HEAD^..HEAD
    echo "Please check http://hdiff.luite.com/cgit/$cabal_name/diff/?id=$version&id2=$old_version for interesting changes."
  else
    echo "Upgraded $cabal_name to $version"
    echo "Merge failed. Please resolve and then run"
    echo "git add -u .; git commit"
  fi
  if test -d debian/patches
  then
    echo "Please refresh the patches"
  fi
done



