#!/usr/bin/zsh

# svn-diff-branch [-s] [имя бранча]:
#   -s              вывод диффа в stdout, по дефолту показываем дифф в vim
#   -имя бранча     бранч который необходимо сравнить с транком, при отсутствии параметра сравниваем с бранчом в текущей директории
#   Примеры:
#                   Вывести в stdout отличия example_branch c trunk
#                   svn-diff-branch -s example_branch 
#                   
#                   Вывести в vim отличия бранча в текущей директории и транка
#                   svn-diff-branch
#
#
# скрипт ждет переписывания на perl, именованных параметров, --summarize и т.п.

function svndiff
{
    if [[ -d /tmp/temp-ttl/ttl_2d/ ]]
    then
        TMPFILE1=`mktemp /tmp/temp-ttl/ttl_2d/svndiff.XXXXXXXXXX` || return 1
    else
        TMPFILE1=`mktemp /tmp/svndiff.XXXXXXXXXX` || return 1
    fi
    TMPFILE2=$TMPFILE1.patch
    svn diff --diff-cmd=diff01 -x "-ud -F ^sub" $@  >$TMPFILE2 &&  ($stdout && vim -R -c ":nmap q :quit!<CR>" $TMPFILE2 || cat $TMPFILE2) && rm -f $TMPFILE1 $TMPFILE2
}


function CB
{
    svn info|grep '^URL'|sed 's|URL: \(.*branches/direct/perl/[^/]*\).*|\1|'|grep -v $SVN_ROOT/trunk
}


function points_to_compare_for_branch
{
    local branch=''
    if [[ -n $1 ]] 
    then
        branch=$SVN_ROOT/branches/direct/perl/$1
    else
        branch=$(CB)
    fi
    [[ -n $branch ]] || return

    local LAST_MERGED_REVISION=`svn propget svn:mergeinfo $branch |grep '^(/trunk|/migration/svn/direct/trunk|/trunk/arcadia/perl/direct):' |sed 's/^.*-\([0-9]*\)/\1/'`
    if [[ -z $LAST_MERGED_REVISION ]]
    then
        LAST_MERGED_REVISION=`svn log --stop-on-copy -q $branch | tail -n 2 |head -n 1 |sed 's/^r\([0-9]*\) .*/\1/'`
    fi
    echo $SVN_ROOT/trunk/arcadia/direct/perl@$LAST_MERGED_REVISION $branch
}

function branchdiff
{
    points_to_compare=`points_to_compare_for_branch $@`
    [[ -n $points_to_compare ]] || return
    echo performing svndiff $points_to_compare ...
    eval "svndiff $points_to_compare"
}


SVN_ROOT=`perl -MProjectSpecific -e 'print ProjectSpecific::svn_url("root")'`
params=()
while [[ $# > 0 ]] do
    case $1 in
        -s) stdout=1
            ;;
        *)  params+=$1
            ;;
    esac
    shift
done
branchdiff $params

