#!/bin/bash
#
# Homepage: http://code.google.com/p/coderev
# License: GPLv2, see "COPYING"
#
# Generate code review page of <workspace> vs <workspace>@HEAD, by using
# `codediff.py' - a standalone diff tool
#
# Usage: coderev.sh [file|subdir ...]
#
# $Id: coderev.sh 4 2008-08-19 05:24:24Z mattwyl $
PROG_NAME=$(basename $0)
function help
{
cat << EOF
Usage:
$PROG_NAME [-r revsion] [file|subdir ...]
\`revision' is a revision number, or symbol (PREV, BASE, HEAD), see svn
books for details. Default revision is revision of your working copy
(aka. BASE)
Default \`subdir' is working dir.
Example 1:
$PROG_NAME bin lib
Generate coderev based on your working copy. If you are working on the
most up-to-date version, this is suggested way (faster).
Example 2:
$PROG_NAME -r HEAD bin lib
Generate coderev based on HEAD revision (up-to-date version in repository),
this will retrive diffs from SVN server so it's slower, but most safely.
EOF
return 0
}
while getopts "r:h" op; do
case $op in
r) REV="$OPTARG" ;;
h) help; exit 0 ;;
?) help; exit 1 ;;
esac
done
shift $((OPTIND - 1))
SUBDIRS="$@"
[[ -n "$REV" ]] && SVN_OPT="-r $REV"
# Get codediff path
#
BINDIR=$(cd $(dirname $0) && pwd -L) || exit 1
CODEDIFF=$BINDIR/codediff.py
# Retrive SVN information
#
echo "Retriving SVN information ..."
URL=$(svn info | grep '^URL:' | awk '{print $2}') || exit 1
WS_NAME=$(basename "$URL")
WS_REV=$(svn info | grep 'Revision:' | awk '{print $2}') || exit 1
BASE_REV=$(svn info $SVN_OPT | grep 'Revision:' | awk '{print $2}') || exit 1
echo "URL : $URL"
echo "WS_REV : $WS_REV"
echo "BASE_REV: $BASE_REV"
# Prepare file list and base source
#
LIST=$(mktemp /tmp/list.XXXXXX) || exit 1
DIFF=$(mktemp /tmp/diff.XXXXXX) || exit 1
BASE_SRC="/tmp/${WS_NAME}@${BASE_REV}"
for file in $(svn st $SUBDIRS | grep '^[A-Z]' | awk '{print $2}'); do
[[ -d $file ]] && continue
echo $file >> $LIST || exit 1
done
echo "Active file list:"
echo "============================"
cat $LIST
echo "============================"
# Generate $base_src
#
mkdir -p $BASE_SRC || exit 1
tar -cf - $(cat $LIST) | tar -C $BASE_SRC -xf - || exit 1
echo "Retriving diffs ..."
svn diff $SVN_OPT $(cat $LIST) > $DIFF || exit 1
cat $DIFF | patch -NER -p0 -d $BASE_SRC || exit 1
# Generate coderev
#
CODEREV=/tmp/${WS_NAME}-diff-${BASE_REV}
cat $LIST | $CODEDIFF -o $CODEREV -w80 -y -f- $BASE_SRC . || exit 1
echo
echo "Coderev generated under $CODEREV"
echo
# Cleanup
#
rm -rf $LIST $DIFF $BASE_SRC
##############################################################################
#
# Customize your webdir to save coderev:
#
# 1. define WEBHOST, SSH_USER, HOST_DIR and WEBDIR
# 2. Comment out the line ":<< \__copy_to_webserver__" below
#
##############################################################################
: << __copy_to_webserver__
WEBHOST=example.org
SSH_USER=me
HOST_DIR='~/public_html/coderev'
WEBDIR="http://$WEBHOST/~$SSH_USER/coderev"
scp -r $CODEREV ${SSH_USER}@${WEBHOST}:$HOST_DIR/ || exit 1
echo
echo "Coderev link:"
echo "$WEBDIR/$(basename $CODEREV)"
echo
exit 0
__copy_to_webserver__