#!/usr/bin/env bash SVN=svn if [ $# -ne 2 ]; then echo "$0: merges changes done in a given revision of the current checkout" echo "usage: $0 " exit 1 fi revision=$1 prev_revision=`expr $revision - 1` srcdir=$PWD dstdir="$2" cd ${dstdir} msg_file=`mktemp /tmp/ilc.XXXXXX || exit 1` ${SVN} log -r ${revision} ${srcdir} > ${msg_file} message_lines=`cat ${msg_file} | wc -l` log_message=`cat ${msg_file} | tail -n $((${message_lines}-2)) | head -n $((${message_lines}-4))` rm -f ${msg_file} changed_files=`${SVN} diff -c ${revision} --summarize ${srcdir} | sed -e "s,.*${srcdir}/,,"` for f in ${changed_files}; do echo "Making sure that ${f} is up to date..." svn up -q ${f} done #echo "previous committed revision: ${prev_revision}" #echo "last committed revision: ${revision}" #echo "log message for that commit:" #echo "${log_message}" #echo "file affected by commit: ${changed_files}" #exit 0 ${SVN} merge -c ${revision} ${srcdir} if [ $? -ne 0 ]; then echo "Oops, there was an error while merging. See whether you can fix it. :-)" cd ${srcdir} exit 1 fi while true; do read -n 1 -p "c(o)mmit, (d)iff or (c)ancel ? " r echo if [ $r = "o" ]; then break elif [ $r = "c" ]; then exit 1 elif [ $r = "d" ]; then ${SVN} diff ${changed_files} fi done ${SVN} -m "automatically merged revision ${revision}:${log_message}" ci ${changed_files} cd ${srcdir}