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