| 1 | #! /bin/sh |
| 2 | set -e |
| 3 | |
| 4 | ### Huh? |
| 5 | ### |
| 6 | ### This script is an adaptor for git mergetool so that, while /it/ thinks |
| 7 | ### it's using emerge, it's really using ediff, which is much better, and |
| 8 | ### maybe a long-running Emacs via gnuserv. |
| 9 | |
| 10 | ## Find out what we're supposed to be doing. The command line looks like |
| 11 | ## |
| 12 | ## emerge-hack -f emerge-mumble FILE FILE ... OUTPUT |
| 13 | |
| 14 | dashf=$1 |
| 15 | command=$2 |
| 16 | shift 2 |
| 17 | case "$dashf" in |
| 18 | -f) ;; |
| 19 | *) echo >&2 "$0: expected -f emerge-mumble"; exit 1;; |
| 20 | esac |
| 21 | |
| 22 | case "$command" in |
| 23 | emerge-files-with-ancestor-command) |
| 24 | func=ediff-merge-files-with-ancestor |
| 25 | ;; |
| 26 | emerge-merge-files-command) |
| 27 | func=ediff-files |
| 28 | ;; |
| 29 | *) |
| 30 | echo >&2 "$0: unexpected command $command" |
| 31 | exit 1 |
| 32 | ;; |
| 33 | esac |
| 34 | |
| 35 | ## Find out whether there's a plausible-looking gnuserv. |
| 36 | |
| 37 | if gnuclient -batch -eval t >/dev/null 2>&1; then |
| 38 | emacs="gnuclient" |
| 39 | else |
| 40 | emacs="emacs" |
| 41 | fi |
| 42 | |
| 43 | ## Now build the command line. |
| 44 | ## |
| 45 | ## The hairy-looking seddery is there to quotify file names properly for |
| 46 | ## Lisp. We also need to make sure that the filenames are absolute. |
| 47 | ## Finally, there's a little tweak to separate off the last name because of |
| 48 | ## the strange argument order ediff uses. |
| 49 | |
| 50 | expr="" |
| 51 | sep="" |
| 52 | last="$func" |
| 53 | |
| 54 | for i; do |
| 55 | name=$i |
| 56 | case "$name" in |
| 57 | /*);; |
| 58 | *) name=`pwd`/$name;; |
| 59 | esac |
| 60 | quot=$(echo -n "$name" | |
| 61 | sed -n ' |
| 62 | 1 h |
| 63 | 2,$ H |
| 64 | $ { |
| 65 | g |
| 66 | s/["\\]/\\&/ |
| 67 | s/^/"/ |
| 68 | s/$/"/ |
| 69 | s/\ |
| 70 | /\\n/ |
| 71 | p |
| 72 | } |
| 73 | ') |
| 74 | expr="$expr$sep$last" |
| 75 | sep=" " |
| 76 | last=$quot |
| 77 | output=$name |
| 78 | done |
| 79 | |
| 80 | ## Done. Note that we pass the output filename again, as an explicit |
| 81 | ## argument. This will make gnuclient wait until we've finished with the |
| 82 | ## merge. |
| 83 | |
| 84 | exec "$emacs" -eval "($expr${sep}nil $last)" "$output" |