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