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