#!/bin/bash

# Copyright 2004 - Rene Rebe - ROCK Linux Consulting
# License: GPL version 2

[ -e .merge-done ] || echo -n "" > .merge-done
[ -e .merge-no ] || echo -n "" > .merge-no

echo "Obtaining basic information ..."

if [ -f .merger-base ] ; then
	base="`tail -n 1 .merger-base`"
else
	base="`svn log --stop-on-copy | egrep "^r[0-9]* " | tail -n1 |
               sed 's/r\([0-9]*\) .*/\1/'`"
	base=$((base+1))
	echo "$base" > .merger-base
fi

if [ -f .merger-runk ] ; then
	trunk="`tail -n 1 .base-trunk`"
else
	trunk="`svn info | grep URL | sed -e "s/URL: //" -e 's/branches.*/trunk/'`"
	echo "$trunk" > .merger-trunk
fi

head="`svn ls -v $trunk | tr -s ' ' | cut -f2 -d ' ' | sort -n | tail -n 1`"

echo "base:  $base"
echo "trunk: $trunk"
echo "head:  $head"

if [ "$*" ] ; then
	echo -n "" > .merge-list
	for x ; do
		echo "$x" >> .merge-list
	done
else
	echo "Obtaining possible merge revisions ..."
	svn log -q -r$base:HEAD $trunk | grep -v '\---' | \
	  sed 's/r\([^ ]*\) .*/\1/' \
	  > .merge-list
fi

tmp="`mktemp`"

reset_vars ()
{
	echo -n "" > .changes
	echo -n "" > ./commit.txt
	merged_files=""
	merged_revs=""
}

commit ()
{
	echo $merged_revs
	read in
	set -- $merged_revs

	(echo -en "\t* merged "
	while [ "$1" ] ; do
		echo -n "r$1"
		shift
		if [ "$2" ] ; then
			echo -n ", "
		elif [ "$1" ] ; then
			echo -n " and "
		fi
	done
	echo " from trunk"
	cat commit.txt ) > ./commit2.txt

	vi ./commit2.txt
	svn commit $modified_files --file ./commit2.txt

	reset_vars
}

reset_vars

while read -u 66 x ; do
  echo "Revision: $x"

  worked=0
  while [ "$worked" == 0 ] ; do
	set -e
	if egrep -q "^$x$" .merge-done .merge-no ; then
		worked=1
		continue
	fi

	svn log -r$x $trunk > $tmp
	cat $tmp

	echo -ne "\nMerge (view|yes|no|(default: skip)): "
	read in

	case $in in
	  v*) svn diff -r$((x-1)):$x $trunk ;;
	  y*) 
		svn merge -r$((x-1)):$x $trunk | tee -a .changes
		merged_files="$merged_files `tr -s ' ' < .changes |
                              cut -d ' ' -f2`"
		echo $merged_revs
		merged_revs="$merged_revs $x"

		cat $tmp >> ./commit.txt
		echo "Go on and tweak the modification or resolve conflicts ..."
		bash --login || true
		echo -n "Commit now? (y/n) "
		read yn
		[[ $yn = y* ]] && commit
		echo "$x" >> .merge-done ; worked=1 ;;
	  n*) echo "$x" >> .merge-no ; worked=1 ;;
	  *) worked=1 ;;
	esac 
  done
done 66< .merge-list

if [ "$merged_revisions" ] ; then
	echo -n "Uncommitted changes, commit now? (y/n) "
	read yn
	[[ $yn = y* ]] && commit
fi

