X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/2f29e0c6d98976c706792255d157f4b8d142d16d..b781e739bfe13f50f98e2616e5c6a9bb8f7da5f4:/lisp/diff.el diff --git a/lisp/diff.el b/lisp/diff.el index 2d681b8af2..358ad9a4c2 100644 --- a/lisp/diff.el +++ b/lisp/diff.el @@ -1,6 +1,6 @@ ;;; diff.el --- Run `diff' in compilation-mode. -;; Copyright (C) 1992, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc. ;; Keywords: unix, tools @@ -17,8 +17,9 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. ;;; Commentary: @@ -30,18 +31,27 @@ (require 'compile) -;;; This is duplicated in vc.el. -(defvar diff-switches "-c" - "*A string or list of strings specifying switches to be be passed to diff.") +(defgroup diff nil + "Comparing files with `diff'." + :group 'tools) -(defvar diff-command "diff" - "*The command to use to run diff.") +;;;###autoload +(defcustom diff-switches "-c" + "*A string or list of strings specifying switches to be be passed to diff." + :type '(choice string (repeat string)) + :group 'diff) + +;;;###autoload +(defcustom diff-command "diff" + "*The command to use to run diff." + :type 'string + :group 'diff) (defvar diff-regexp-alist '( ;; -u format: @@ -OLDSTART,OLDEND +NEWSTART,NEWEND @@ ("^@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@$" 1 2) - + ;; -c format: *** OLDSTART,OLDEND **** ("^\\*\\*\\* \\([0-9]+\\),[0-9]+ \\*\\*\\*\\*$" 1 nil) ;; --- NEWSTART,NEWEND ---- @@ -57,7 +67,7 @@ ;; -n format: {a,d,c}OLDSTART LINES-CHANGED ("^[adc]\\([0-9]+\\)\\( [0-9]+\\)?$" 1) ) - "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference + "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference sections in \\[diff] output. If REGEXP matches, the OLD-IDX'th subexpression gives the line number in the old file, and NEW-IDX'th subexpression gives the line number in the new file. If OLD-IDX or NEW-IDX @@ -151,14 +161,29 @@ is nil, REGEXP matches only half a section.") ;; We have found as many new loci as the user wants, ;; or the user wanted a specific diff, and we're past it. (setq found-desired t))) - (if found-desired - (setq compilation-parsing-end (point)) - ;; Set to point-max, not point, so we don't perpetually - ;; parse the last bit of text when it isn't a diff header. - (setq compilation-parsing-end (point-max))) + (set-marker compilation-parsing-end + (if found-desired (point) + ;; Set to point-max, not point, so we don't perpetually + ;; parse the last bit of text when it isn't a diff header. + (point-max))) (message "Parsing differences...done")) (setq compilation-error-list (nreverse compilation-error-list))) +(defun diff-process-setup () + "Set up \`compilation-exit-message-function' for \`diff'." + ;; Avoid frightening people with "abnormally terminated" + ;; if diff finds differences. + (set (make-local-variable 'compilation-exit-message-function) + (lambda (status code msg) + (cond ((not (eq status 'exit)) + (cons msg code)) + ((zerop code) + '("finished (no differences)\n" . "no differences")) + ((= code 1) + '("finished\n" . "differences found")) + (t + (cons msg code)))))) + ;;;###autoload (defun diff (old new &optional switches) "Find and display the differences between OLD and NEW files. @@ -196,8 +221,9 @@ With prefix arg, prompt for diff switches." (let ((old-alt (file-local-copy old)) (new-alt (file-local-copy new)) buf) - (unwind-protect - (let ((command + (save-excursion + (let ((compilation-process-setup-function 'diff-process-setup) + (command (mapconcat 'identity (append (list diff-command) ;; Use explicitly specified switches @@ -219,20 +245,7 @@ With prefix arg, prompt for diff switches." (compile-internal command "No more differences" "Diff" 'diff-parse-differences)) - (pop-to-buffer buf) - ;; Avoid frightening people with "abnormally terminated" - ;; if diff finds differences. - (set (make-local-variable 'compilation-exit-message-function) - (lambda (proc msg) - (let ((code (process-exit-status proc))) - (if (eq (process-status proc) 'exit) - (cond ((zerop code) - '("finished (no differences)\n" . "finished")) - ((= code 1) - '("finished\n" . "finished")) - (t - (cons msg code))) - (cons msg code))))) + (set-buffer buf) (set (make-local-variable 'diff-old-file) old) (set (make-local-variable 'diff-new-file) new) (set (make-local-variable 'diff-old-temp-file) old-alt) @@ -243,6 +256,10 @@ With prefix arg, prompt for diff switches." (delete-file diff-old-temp-file)) (if diff-new-temp-file (delete-file diff-new-temp-file))))) + ;; When async processes aren't available, the compilation finish + ;; function doesn't get chance to run. Invoke it by hand. + (or (fboundp 'start-process) + (funcall compilation-finish-function nil nil)) buf)))) ;;;###autoload @@ -288,11 +305,11 @@ The backup file is the first file given to `diff'." (base-versions (concat (file-name-sans-versions (file-name-nondirectory backupname)) ".~")) - (bv-length (length base-versions))) + ;; This is a fluid var for backup-extract-version. + (backup-extract-version-start (length base-versions))) (concat dir (car (sort (file-name-all-completions base-versions dir) - ;; bv-length is a fluid var for backup-extract-version: (function (lambda (fn1 fn2) (> (backup-extract-version fn1)