#!/bin/sh
#
# git-svn-diff -- SVN-compatible diff against the tip of the tracking branch
#
# ChangeLog
#
#	Originally by http://mojodna.net/2009/02/24/my-work-git-workflow.html
#
#	<mike@mikepearce.net>
#	- <unknown changes>
#
#	aconway@[redacted]
#	- handle diffs that introduce new files
#
#	<jari.aalto@cante.net>
#	- Use readable POSIX $() instead backticsk
#	- Add ChangeLog
#	- Convert from bash to plain /bin/sh
#	- Fit as much as possible in 80 columns
#	- Make sed \/ quoting more readable using alternative separators
#	- Remove EOL whitespaces.
#       - 2011-12-27 Incorporate fixes by https://github.com/nfloyd
#         from the Gist comment 2011-07-31 https://gist.github.com/946727
#
#	<javabrett>
#	- Retain space after leading --- and +++, add TAB before (revision 0)
#	- Use \t instead of spaces before (revision $REV) and (working copy)
#
#	<javabrett>
#	- Added support for non-empty git-svn prefix, important now that the
#	- default --prefix is "origin/" in Git 2.0+.

# Get the tracking branch (if we're on a branch)

TRACKING_BRANCH=$(git svn info | grep URL | sed -e 's,.*/branches/,,')

# If the tracking branch has 'URL' at the beginning, then the sed
# wasn't successful and we'll fall back to the svn-remote config
# option

case "$TRACKING_BRANCH" in
    URL*)
        TRACKING_BRANCH=$(git config --get svn-remote.svn.fetch |
                          sed -e 's,.*:refs/remotes/,,')
        ;;
    *)
        # GIT_SVN_PREFIX will be origin/ by-default in Git 2.0 or later, or ""
        GIT_SVN_PREFIX=$(git config --get svn-remote.svn.branches | sed -e 's,.*:refs/remotes/\(.*\)\*$,\1,')
        TRACKING_BRANCH=${GIT_SVN_PREFIX}${TRACKING_BRANCH}
        ;;
esac

# Get the highest revision number

REV=$(git svn info |
      grep 'Last Changed Rev:' |
      sed --regexp-extended 's/^.*: ([[:digit:]]*)/\1/')

# Then do the diff from the highest revision on the current branch and
# masssage into SVN format

git diff \
    --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) \
    "$@" |
sed -e "/--- \/dev\/null/{ N; s|^--- /dev/null\n+++ \(.*\)|--- \1\t(revision 0)\n+++ \1\t(revision 0)|;}" \
    -e "s/^--- .*/&\t(revision $REV)/" \
    -e "s/^+++ .*/&\t(working copy)/" \
    -e "s/^diff --git [^[:space:]]*/Index:/" \
    -e "s/^index.*/===================================================================/"

# End of file