So I’ve been accepted as a GSoC student for WordPress. My project involves working on the core WordPress code, but on a separate svn repository. I needed an easy way to keep my fork synchronized with trunk.

Unfortunately, svn doesn’t have the concept of rebasing, so I wrote a little bash script to simulate it:

#!/bin/bash

# usage:
# svnrebase [WORKING_COPY_PATH]

# set working copy path
WCPATH=${1-'.'}

cd $WCPATH

# read base URL
BASE_URL=`cat BASE_URL`
if [ "" == "$BASE_URL" ]; then
	echo "can't find base URL"
	exit
fi

# read current base revision
OLD_BASE_REV=`cat BASE_REV`
if [ "" == "$OLD_BASE_REV" ]; then
	echo "can't find current base revision"
	exit
fi

# fetch latest base revision
NEW_BASE_REV=`svn info $BASE_URL | grep 'Revision:' | cut -d ' ' -f 2`
if [ "" == "$NEW_BASE_REV" ]; then
	echo "can't find base"
	exit
fi

if [ "$OLD_BASE_REV" == "$NEW_BASE_REV" ]; then
	echo 'base already at latest revision'
	exit
fi

# apply changes to fork
svn merge $BASE_URL@$OLD_BASE_REV $BASE_URL@$NEW_BASE_REV

# update current base revision
echo $NEW_BASE_REV > BASE_REV

echo "updated base to revision $NEW_BASE_REV"

The above script requires two text files placed in your working copy directory:

BASE_URL – the url of the base repository. In my case, it contains:

http://core.svn.wordpress.org/trunk

BASE_REV – the currently used revision number in your working copy. For example:

14995

The BASE_REV file will be updated automatically when you run the script, but you need to create it manually the first time.