#!@bash@ # Copyright (C) 2014, 2016-2017 Luke Shumaker # # This file is not considered part of GNU Emacs. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . m4_include(common.sh.in) usage() { print 'Usage: %q [OPTIONS] FILE_A FILE_B' "$0" print ' or: %q -3 [OPTIONS] FILE_A FILE_B FILE_C|FILE_ANCESTOR' "$0" print "Use Emacs' ediff-mode to compare two files" echo print 'The following OPTIONS are accepted:' emacs_usage flag '-r, -R REGEXP, --recursive[=REGEXP]' \ 'Diff directories recursively, excluding filenames not matching REGEXP' flag '-3' \ 'Do a 3-way diff instead of 2-way When used in the context of a --merge, the 3rd file is the common ancestor between A and B' flag '-m OUTFILE, --merge=OUTFILE' \ 'Merge files A and B, saving the output in OUTFILE' } main() { declare -a flags=() declare mode=normal # The functions that we currently make available are: # (ediff FILE-A FILE-B &optional STARTUP-HOOKS) # (ediff3 FILE-A FILE-B FILE-C &optional STARTUP-HOOKS) # (ediff-merge FILE-A FILE-B &optional STARTUP-HOOKS MERGE-BUFFER-FILE) # (ediff-merge-with-ancestor FILE-A FILE-B FILE-ANCESTOR &optional STARTUP-HOOKS MERGE-BUFFER-FILE) # and their recursive equivalents: # (edirs DIR1 DIR2 REGEXP) # (edirs3 DIR1 DIR2 DIR3 REGEXP) # (edirs-merge DIR1 DIR2 REGEXP &optional MERGE-AUTOSTORE-DIR) # (edirs-merge-with-ancestor DIR1 DIR2 ANCESTOR-DIR REGEXP &optional MERGE-AUTOSTORE-DIR) # # This list is currently missing the "revision" commands: # (ediff-revision &optional FILE STARTUP-HOOKS) # (edir-revisions DIR1 REGEXP) # (edir-merge-revisions DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR) # (edir-merge-revisions-with-ancestor DIR1 REGEXP &optional MERGE-AUTOSTORE-DIR) # and the epatch command: # (epatch &optional ARG PATCH-BUF) declare cmd=ediff declare -i cnt=2 declare -a files=() declare extra=nil # STARTUP-HOOKS for cmd=ediff, REGEXP for cmd=edirs declare merge='' emacs_getopt_init declare args if ! args="$(emacs_getopt rR:3m: recursive::,merge: "$@")"; then mode=error else eval set -- "$args" while true; do case "$1" in -V|--version) shift; mode=version;; -H|--help) shift; mode=usage;; -r) shift; cmd=edirs;; -R|--recursive) cmd=edirs [[ -z "$2" ]] || extra="$(emacs_quote "$2")" shift 2 ;; -3) shift; cnt=3;; -m|--merge) merge="$(emacs_quote "$2")"; shift 2;; --) shift; break;; *) if [[ $1 =~ $emacs_getopt_2 ]]; then flags+=("$1" "$2"); shift 2 else flags+=("$1"); shift 1 fi ;; esac done files=("$@") if [[ $mode == normal ]]; then [[ ${#files[@]} = ${cnt} ]] || mode=error fi fi if [[ -z "$merge" ]]; then [[ $cnt == 2 ]] || cmd+='3' else cmd+='-merge' [[ $cnt == 2 ]] || cmd+='-with-ancestor' fi next "$mode" \ emacsclient "${flags[@]}" --eval \ "(${cmd} $(emacs_quote "${files[@]}") $extra $merge)" } main "$@"