X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/7ffefb0856637762050ca248013d2b2f1cf7554e..cbee283dd7dd655124e81a6bd555506476180b5d:/lisp/ediff-diff.el diff --git a/lisp/ediff-diff.el b/lisp/ediff-diff.el index e367506401..d9d2b2458b 100644 --- a/lisp/ediff-diff.el +++ b/lisp/ediff-diff.el @@ -1,7 +1,7 @@ ;;; ediff-diff.el --- diff-related utilities ;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -;; 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +;; 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Author: Michael Kifer @@ -9,7 +9,7 @@ ;; GNU Emacs 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 2, or (at your option) +;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -27,18 +27,18 @@ ;;; Code: +(provide 'ediff-diff) + ;; compiler pacifier (defvar ediff-default-variant) (defvar null-device) (defvar longlines-mode) (eval-when-compile - (let ((load-path (cons (expand-file-name ".") load-path))) - (or (featurep 'ediff-init) - (load "ediff-init.el" nil nil 'nosuffix)) - (or (featurep 'ediff-util) - (load "ediff-util.el" nil nil 'nosuffix)) - )) + (require 'ediff-init) + (if (not (featurep 'ediff-util)) + (require 'ediff-util)) + ) ;; end pacifier (require 'ediff-init) @@ -48,7 +48,6 @@ :prefix "ediff-" :group 'ediff) -;; these two must be here to prevent ediff-test-utility from barking (defcustom ediff-diff-program "diff" "*Program to use for generating the differential of the two files." :type 'string @@ -62,46 +61,8 @@ Must produce output compatible with Unix's diff3 program." ;; The following functions must precede all defcustom-defined variables. -;; The following functions needed for setting diff/diff3 options -;; test if diff supports the --binary option -(defsubst ediff-test-utility (diff-util option &optional files) - (condition-case nil - (eq 0 (apply 'call-process - (append (list diff-util nil nil nil option) files))) - (error (format "Cannot execute program %S." diff-util))) - ) - -(defun ediff-diff-mandatory-option (diff-util) - (let ((file (if (boundp 'null-device) null-device "/dev/null"))) - (cond ((not (memq system-type '(ms-dos windows-nt windows-95))) - "") - ((and (string= diff-util ediff-diff-program) - (ediff-test-utility - ediff-diff-program "--binary" (list file file))) - "--binary ") - ((and (string= diff-util ediff-diff3-program) - (ediff-test-utility - ediff-diff3-program "--binary" (list file file file))) - "--binary ") - (t "")))) - - -;; must be before ediff-reset-diff-options to avoid compiler errors (fset 'ediff-set-actual-diff-options '(lambda () nil)) -;; make sure that mandatory options are added even if the user changes -;; ediff-diff-options or ediff-diff3-options in the customization widget -(defun ediff-reset-diff-options (symb val) - (let* ((diff-program - (if (eq symb 'ediff-diff-options) - ediff-diff-program - ediff-diff3-program)) - (mandatory-option (ediff-diff-mandatory-option diff-program))) - (set symb (concat mandatory-option val)) - (ediff-set-actual-diff-options) - )) - - (defcustom ediff-shell (cond ((eq system-type 'emx) "cmd") ; OS/2 ((memq system-type '(ms-dos windows-nt windows-95)) @@ -130,13 +91,25 @@ are `-I REGEXP', to ignore changes whose lines match the REGEXP." :type '(repeat string) :group 'ediff-diff) -(defcustom ediff-diff-options "" +(defun ediff-set-diff-options (symbol value) + (set symbol value) + (ediff-set-actual-diff-options)) + +(defcustom ediff-diff-options + (if (memq system-type '(ms-dos windows-nt windows-95)) "--binary" "") "*Options to pass to `ediff-diff-program'. If Unix diff is used as `ediff-diff-program', - then a useful option is `-w', to ignore space. -Options `-c' and `-i' are not allowed. Case sensitivity can be - toggled interactively using \\[ediff-toggle-ignore-case]." - :set 'ediff-reset-diff-options +then a useful option is `-w', to ignore space. +Options `-c', `-u', and `-i' are not allowed. Case sensitivity can be +toggled interactively using \\[ediff-toggle-ignore-case]. + +Do not remove the default options. If you need to change this variable, add new +options after the default ones. + +This variable is not for customizing the look of the differences produced by +the command \\[ediff-show-diff-output]. Use the variable +`ediff-custom-diff-options' for that." + :set 'ediff-set-diff-options :type 'string :group 'ediff-diff) @@ -175,7 +148,7 @@ This output is not used by Ediff internally." "Pattern to match lines produced by diff3 that describe differences.") (defcustom ediff-diff3-options "" "*Options to pass to `ediff-diff3-program'." - :set 'ediff-reset-diff-options + :set 'ediff-set-diff-options :type 'string :group 'ediff-diff) @@ -254,10 +227,10 @@ one optional arguments, diff-number to refine.") ;; ediff-setup-diff-regions-function, which can also have the value ;; ediff-setup-diff-regions3, which takes 4 arguments. (defun ediff-setup-diff-regions (file-A file-B file-C) - ;; looking for '-c', '-i', or a 'c', 'i' among clustered non-long options - (if (string-match "^-[ci]\\| -[ci]\\|\\(^\\| \\)-[^- ]+[ci]" + ;; looking for '-c', '-i', '-u', or 'c', 'i', 'u' among clustered non-long options + (if (string-match "^-[ciu]\\| -[ciu]\\|\\(^\\| \\)-[^- ]+[ciu]" ediff-diff-options) - (error "Options `-c' and `-i' are not allowed in `ediff-diff-options'")) + (error "Options `-c', `-u', and `-i' are not allowed in `ediff-diff-options'")) ;; create, if it doesn't exist (or (ediff-buffer-live-p ediff-diff-buffer) @@ -344,20 +317,20 @@ one optional arguments, diff-number to refine.") ;; fixup diff-list (if diff3-job (cond ((not file-A) - (mapcar (lambda (elt) - (aset elt 0 nil) - (aset elt 1 nil)) - (cdr diff-list))) + (mapc (lambda (elt) + (aset elt 0 nil) + (aset elt 1 nil)) + (cdr diff-list))) ((not file-B) - (mapcar (lambda (elt) - (aset elt 2 nil) - (aset elt 3 nil)) - (cdr diff-list))) + (mapc (lambda (elt) + (aset elt 2 nil) + (aset elt 3 nil)) + (cdr diff-list))) ((not file-C) - (mapcar (lambda (elt) - (aset elt 4 nil) - (aset elt 5 nil)) - (cdr diff-list))) + (mapc (lambda (elt) + (aset elt 4 nil) + (aset elt 5 nil)) + (cdr diff-list))) )) (ediff-convert-fine-diffs-to-overlays diff-list reg-num) @@ -370,6 +343,7 @@ one optional arguments, diff-number to refine.") (get-buffer-create (ediff-unique-buffer-name "*ediff-errors" "*")))) (ediff-with-current-buffer ediff-error-buffer + (setq buffer-undo-list t) (erase-buffer) (insert (ediff-with-current-buffer diff-buff (buffer-string))) (goto-char (point-min)) @@ -863,7 +837,7 @@ one optional arguments, diff-number to refine.") (ediff-make-fine-diffs n 'noforce) (ediff-make-fine-diffs n 'skip))) - ;; highlight iff fine diffs already exist + ;; highlight if fine diffs already exist ((eq ediff-auto-refine 'off) (ediff-make-fine-diffs n 'skip)))) @@ -885,9 +859,9 @@ one optional arguments, diff-number to refine.") (let ((fine-diff-vector (ediff-get-fine-diff-vector n buf-type)) (face (if default 'default - (face-name - (ediff-get-symbol-from-alist - buf-type ediff-fine-diff-face-alist)))) + (ediff-get-symbol-from-alist + buf-type ediff-fine-diff-face-alist) + )) (priority (if default 0 (1+ (or (ediff-overlay-get @@ -974,7 +948,7 @@ delimiter regions")) ))) -(defsubst ediff-convert-fine-diffs-to-overlays (diff-list region-num) +(defun ediff-convert-fine-diffs-to-overlays (diff-list region-num) (ediff-set-fine-overlays-in-one-buffer 'A diff-list region-num) (ediff-set-fine-overlays-in-one-buffer 'B diff-list region-num) (if ediff-3way-job @@ -1274,9 +1248,7 @@ delimiter regions")) ;; Similarly for Windows-* ;; In DOS, must synchronize because DOS doesn't have ;; asynchronous processes. - (condition-case nil - (apply 'call-process program nil buffer nil args) - (error (format "Cannot execute program %S." program))) + (apply 'call-process program nil buffer nil args) ;; On other systems, do it asynchronously. (setq proc (get-buffer-process buffer)) (if proc (kill-process proc)) @@ -1339,7 +1311,7 @@ These characters are ignored when differing regions are split into words.") (make-variable-buffer-local 'ediff-whitespace) (defvar ediff-word-1 - (ediff-cond-compile-for-xemacs-or-emacs "a-zA-Z---_" "-[:word:]_") + (if (featurep 'xemacs) "a-zA-Z---_" "-[:word:]_") "*Characters that constitute words of type 1. More precisely, [ediff-word-1] is a regexp that matches type 1 words. See `ediff-forward-word' for more details.") @@ -1447,17 +1419,17 @@ arguments to `skip-chars-forward'." "Return t if files F1 and F2 have identical contents." (if (and (not (file-directory-p f1)) (not (file-directory-p f2))) - (condition-case nil - (let ((res - (apply 'call-process ediff-cmp-program nil nil nil - (append ediff-cmp-options (list f1 f2))))) - (and (numberp res) (eq res 0))) - (error (format "Cannot execute program %S." ediff-cmp-program))) + (let ((res + (apply 'call-process ediff-cmp-program nil nil nil + (append ediff-cmp-options (list (expand-file-name f1) + (expand-file-name f2)))) + )) + (and (numberp res) (eq res 0))) )) (defun ediff-same-contents (d1 d2 &optional filter-re) - "Returns t iff D1 and D2 have the same content. + "Return t if D1 and D2 have the same content. D1 and D2 can either be both directories or both regular files. Symlinks and the likes are not handled. If FILTER-RE is non-nil, recursive checking in directories @@ -1531,7 +1503,7 @@ affects only files whose names match the expression." (defun ediff-set-actual-diff-options () (if ediff-ignore-case - (setq ediff-actual-diff-options + (setq ediff-actual-diff-options (concat ediff-diff-options " " ediff-ignore-case-option) ediff-actual-diff3-options (concat ediff-diff3-options " " ediff-ignore-case-option3)) @@ -1564,8 +1536,6 @@ affects only files whose names match the expression." ) -(provide 'ediff-diff) - ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) @@ -1573,5 +1543,5 @@ affects only files whose names match the expression." ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body)) ;;; End: -;;; arch-tag: a86d448e-58d7-4572-a1d9-fdedfa22f648 +;; arch-tag: a86d448e-58d7-4572-a1d9-fdedfa22f648 ;;; ediff-diff.el ends here