#!/bin/sh set -e err() { echo $@ >&2 exit 1 } clean() { rm -rf ${dir} exit 1 } ask() { question=${1} answer=x while [ "${answer}" != "y" -a "${answer}" != "n" ] ; do read -p "${question} [yn] " answer done [ "${answer}" = "y" ] && return 0 return 1 } [ $# -ne 2 ] && err "Takes 2 arguments: " branch=$1 rev=$2 case $rev in ''|*[!0-9]*) err "revision should be a number" ;; esac dir=$(mktemp -d /tmp/merge.XXX) cd $dir svn co --depth=empty svn+ssh://svn.FreeBSD.org/ports/branches/${branch} filelist="" for f in $(svn diff --summarize -c $rev svn://svn.FreeBSD.org/ports/head); do case ${f} in */*) ;; *)continue;; esac f=${f#*/ports/head/} f=${f%/*} filelist="$filelist\n$f" done filelist=$(echo -e $filelist | sort -u) echo "MFH: r$rev" > commit.txt svn log -r$rev svn://svn.freebsd.org/ports/head | sed '1,2d;$d' >> commit.txt for f in ${filelist}; do svn up --parents ${branch}/${f} done svn merge -c r${rev} ^/head/ ${branch} svn up --quiet ${branch} svn diff ${branch} ask "Do you want to commit?" || clean ${EDITOR:-vi} commit.txt svn ci -F commit.txt ${branch} rm -rf $dir