#!/bin/bash # Copyright 2007 Paolo Ornati # Distributed under the terms of the GNU General Public License v2 # # svn-bisect v0.1 # a simple and buggy script that tries to emulate "git-bisect" # SVN=".svn" FGOOD="$SVN/BISECT-GOOD" FBAD="$SVN/BISECT-BAD" LOG="$SVN/BISECT-LOG" GOOD="" BAD="" function findbug() { if [ -z "$GOOD" ] || [ -z "$BAD" ]; then return 1 fi DIFF=$(echo $(($GOOD - $BAD)) | tr -d '-') if [ "$DIFF" = "1" ]; then echo "*********** FIRST BAD COMMIT: $BAD ************" svn log -r "$BAD" return 0 fi return 1 } function bisect() { if [ -z "$GOOD" ] || [ -z "$BAD" ]; then return fi findbug && return echo "good: $GOOD" echo "bad: $BAD" BISECT=$(( ($GOOD + $BAD) / 2 )) echo "bisect: $BISECT" echo "" echo -n "go to revision $BISECT? [Y/n]: " read x [ "$x" != "n" ] && svn up -r "$BISECT" } function exit_usage() { echo -e "please use:\n\tsvn-bisect (start | reset | pick REV | good [REV] | bad [REV] | status | log)\n" exit 1 } function check_bisecting() { if [ ! -f "$FGOOD" ] || [ ! -f "$FBAD" ]; then echo -e "start with:\n\tsvn-bisect start\n" exit 1 fi } if [ ! -d "$SVN" ]; then echo "Not an svn repo" exit 1 fi CURRENT_REV=$(svn info . | grep -m1 '^Revision:' | awk '{print $2}') REV="$2" if [ -z "$REV" ]; then REV="$CURRENT_REV" fi case "$1" in start) echo -n > "$FGOOD" echo -n > "$FBAD" echo -n > "$LOG" exit 0 ;; reset) rm -f "$FGOOD" "$FBAD" "$LOG" exit 0 ;; "") exit_usage ;; esac check_bisecting GOOD=$(cat "$FGOOD") BAD=$(cat "$FBAD") case "$1" in pick) svn up -r "$REV" ;; good) echo "svn-bisect good $REV" >> "$LOG" GOOD="$REV" echo "$GOOD" > "$FGOOD" bisect ;; bad) echo "svn-bisect bad $REV" >> "$LOG" BAD="$REV" echo "$BAD" > "$FBAD" bisect ;; status) echo "last good: $GOOD" echo "first bad: $BAD" echo "current: $CURRENT_REV" findbug ;; log) cat "$LOG" ;; *) exit_usage esac