svn-viewdiff   [plain text]


#!/bin/sh
# -*- coding:utf-8;mode:shell-script;mode:font-lock -*-

##
# GNU diff wrapper for FileMerge.
#
# (FileMerge is a graphical diff tool in the Mac OS X Developer
# Tools.)
#
# Use this as a --diff-cmd argument to svn diff in order to view your
# diffs using FileMerge.
##
# Copyright (c) 2002 Wilfredo Sanchez Vega <wsanchez@wsanchez.net>.
# All rights reserved.
# 
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
# 
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
##

set -e
set -u

##
# Handle command line
##

usage ()
{
  program=$(basename "$0");

  if [ $# != 0 ]; then echo "$@"; echo ""; fi;

  echo "${program}: usage:";
  echo "    ${program} [options] file1 file2";
  echo "";
  echo "options:";
  echo "  --help                     Print this help";
  echo "  -c                         Ignored";
  echo "  -C --context X             Ignored";
  echo "  -u                         Ignored";
  echo "  -U --unified X             Ignored";
  echo "  -L --label X               Ignored";
 #echo "  -p --show-c-function       Ignored";
 #echo "  -F --show-function-line X  Ignored";
  echo "  -q --brief                 Ignored";
  echo "  -y --side-by-side          Ignored";
  echo "  -w --width X               Ignored";
 #echo "  --left-column              Ignored";
 #echo "  --suppress-common-lines    Ignored";
  echo "  -l --paginate              Ignored";
  echo "  -t --expand-tabs           Ignored";
  echo "  -T --initial-tab           Ignored";
 #echo "  -r --recursive             Ignored";
  echo "  -d --minimal               Ignored";
  echo "  -H --speed-large-files     Ignored";
}

# Process arguments
while [ $# != 0 ]; do
  case "$1" in
    --help)
      usage;
      exit 0;
      ;;

    # These display options would not make sense for FileMerge
    -c                     ) shift 1; ;; # Context diff
    -C|--context           ) shift 2; ;; # Context diff
    -u                     ) shift 1; ;; # Unified diff
    -U|--unified           ) shift 2; ;; # Unified diff
    -L|--label             ) shift 2; ;; #   Label
   #-p|--show-c-function   ) shift 1; ;; #   C function names
   #-F|--show-function-line) shift 2; ;; #   Show recent line w/ regex
    -q|--brief             ) shift 1; ;; # Output only whether files differ
    -y|--side-by-side      ) shift 1; ;; # Output in two columns
    -w|--width             ) shift 2; ;; #   Max chars per line
   #--left-column          ) shift 1; ;; #   Left only if common
   #--suppress-common-lines) shift 1; ;; #   No output if common
    -l|--paginate          ) shift 1; ;; # Pass through pr
    -t|--expand-tabs       ) shift 1; ;; # Expand tabs
    -T|--initial-tab       ) shift 1; ;; # Add initial tab
   #-r|--recursive         ) shift 1; ;; # Recurse into directories
    -d|--minimal           ) shift 1; ;; # Try hard to minimize changes
    -H|--speed-large-files ) shift 1; ;; # Assume large files and small changes

    # Implement these
   #-s  --report-identical-files

    --|*) break; ;;
  esac;
done;

if [ $# != 2 ]; then
    usage "Invalid arguments: $*";
    exit 1;
fi;

file1="$1"; shift;
file2="$1"; shift;

##
# Do The Right Thing
##

#
# If opendiff isn't installed, you can't launch FileMerge.
# If we're not in the OS X Terminal, we probably can't run FileMerge
#
if ! type opendiff >& /dev/null || [ "${TERM_PROGRAM:=}" != "Apple_Terminal" ]; then
    diff "$@";
    exit $?;
fi;

merge="${file2}";

tmp="";

if [ $(dirname "${file1}") == "/tmp" ]; then
    if [ -z "${tmp}" ]; then tmp=$(mktemp -d /tmp/viewdiff.XXXX); fi;

    ln "${file1}" "${tmp}/left";
    file1="${tmp}/left";
fi;

if [ $(dirname "${file2}") == "/tmp" ]; then
    if [ -z "${tmp}" ]; then tmp=$(mktemp -d /tmp/viewdiff.XXXX); fi;

    ln "${file2}" "${tmp}/right";
    file2="${tmp}/right";
    merge="";
fi;

echo opendiff "${file1}" "${file2}";
if [ -z "${merge}" ]; then
    opendiff "${file1}" "${file2}";
else
    opendiff "${file1}" "${file2}" -merge "${merge}";
fi;

sleep 1

# Give FileMerge some time before letting svn diff continue and possibly delete
# any temp files, or before deleting our own temp files.
if [ -n "${tmp}" ]; then (sleep 2; rm -rf "${tmp}") & fi;