#!/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 . # 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;