| #!/bin/sh |
| # -*- coding:utf-8;mode:shell-script;mode:font-lock -*- |
| |
| ## |
| # Resolve Subversion conflicts using FileMerge. |
| # |
| # (FileMerge is a graphical diff tool in the Mac OS X Developer |
| # Tools.) |
| # |
| # In your working copy, do (for example): |
| # |
| # svn-resolve . |
| # |
| # FileMerge will open a window for each file that is in a conflict |
| # state, showing you diffs with the left/right arrows pointing to the |
| # side of each change that is selected. Diffs with gray outlines are |
| # automatically resolved. Diffs with red outlines are the conflicts. |
| # Find those and select which side you want, or pull up the split view |
| # at he bottom and edit the text to what it should be. |
| ## |
| # 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, this permission, and the following |
| # disclaimer 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} file1 [file2 ...]"; |
| } |
| |
| # Process arguments |
| while [ $# != 0 ]; do |
| case "$1" in |
| --help) |
| usage; |
| exit 0; |
| ;; |
| --|*) break; ;; |
| esac; |
| done; |
| |
| ## |
| # 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; |
| |
| find_ancestor () |
| { |
| local conflict="$1"; |
| local which="$2"; |
| |
| n=$(ls -1 "${conflict}.merge-${which}.r"* 2>/dev/null | wc -l); |
| |
| if [ "${n}" -eq 0 ]; then |
| echo "ERROR: No ${which} ancenstor found." |
| return 1; |
| fi; |
| |
| if [ "${n}" -gt 1 ]; then |
| echo "ERROR: Multible ${which} ancenstors found:" |
| ls -1 "${conflict}.merge-left.r"* |
| return 1; |
| fi; |
| |
| ls "${conflict}.merge-${which}.r"* |
| } |
| |
| resolve () |
| { |
| local conflict="$1"; |
| |
| local revision="$(svn info "${conflict}" | grep '^Revision: ' | sed 's|^Revision: ||')"; |
| |
| local left="${conflict}.working"; |
| local right="$(find_ancestor "${conflict}" right)"; |
| local ancestor="$(find_ancestor "${conflict}" left )"; |
| |
| for file in "${left}" "${right}" "${ancestor}"; do |
| if [ ! -f "${file}" ]; then |
| echo "ERROR: Missing file: ${file}"; |
| return 1; |
| fi; |
| done; |
| |
| opendiff "${left}" "${right}" -ancestor "${ancestor}" -merge "${conflict}"; |
| } |
| |
| for file in "$@"; do |
| for conflict in $(svn status . | grep '^C' | sed 's|^C......||'); do |
| resolve "${conflict}"; |
| done; |
| done; |