X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/de9dc5e59c015110136c91f8d292f337d1de4f09..975900f996d539e230371efdc11fe149a5c4d5aa:/lisp/diff.el diff --git a/lisp/diff.el b/lisp/diff.el index 76b1b5e60a..75ae34d5f2 100644 --- a/lisp/diff.el +++ b/lisp/diff.el @@ -1,6 +1,7 @@ ;;; diff.el --- run `diff' in compilation-mode -;; Copyright (C) 1992, 1994, 1996, 2001, 2004 Free Software Foundation, Inc. +;; Copyright (C) 1992, 1994, 1996, 2001, 2002, 2003, 2004, +;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: unix, tools @@ -9,7 +10,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, @@ -19,8 +20,8 @@ ;; 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, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -36,7 +37,7 @@ ;;;###autoload (defcustom diff-switches "-c" - "*A string or list of strings specifying switches to be be passed to diff." + "*A string or list of strings specifying switches to be passed to diff." :type '(choice string (repeat string)) :group 'diff) @@ -61,14 +62,16 @@ (defun diff-sentinel (code) "Code run when the diff process exits. -CODE is the exit code of the process. It should be 0 iff no diffs were found." +CODE is the exit code of the process. It should be 0 only if no diffs +were found." (if diff-old-temp-file (delete-file diff-old-temp-file)) (if diff-new-temp-file (delete-file diff-new-temp-file)) (save-excursion (goto-char (point-max)) - (insert (format "\nDiff finished%s. %s\n" - (if (equal 0 code) " (no differences)" "") - (current-time-string))))) + (let ((inhibit-read-only t)) + (insert (format "\nDiff finished%s. %s\n" + (if (equal 0 code) " (no differences)" "") + (current-time-string)))))) ;;;###autoload (defun diff (old new &optional switches no-async) @@ -82,15 +85,15 @@ With prefix arg, prompt for diff switches." (setq newf (buffer-file-name) newf (if (and newf (file-exists-p newf)) (read-file-name - (concat "Diff new file: (default " - (file-name-nondirectory newf) ") ") + (concat "Diff new file (default " + (file-name-nondirectory newf) "): ") nil newf t) (read-file-name "Diff new file: " nil nil t))) (setq oldf (file-newest-backup newf) oldf (if (and oldf (file-exists-p oldf)) (read-file-name - (concat "Diff original file: (default " - (file-name-nondirectory oldf) ") ") + (concat "Diff original file (default " + (file-name-nondirectory oldf) "): ") (file-name-directory oldf) oldf t) (read-file-name "Diff original file: " (file-name-directory newf) nil t))) @@ -118,7 +121,8 @@ With prefix arg, prompt for diff switches." (set-buffer buf) (setq buffer-read-only nil) (buffer-disable-undo (current-buffer)) - (erase-buffer) + (let ((inhibit-read-only t)) + (erase-buffer)) (buffer-enable-undo (current-buffer)) (diff-mode) (set (make-local-variable 'revert-buffer-function) @@ -127,21 +131,35 @@ With prefix arg, prompt for diff switches." (set (make-local-variable 'diff-old-temp-file) old-alt) (set (make-local-variable 'diff-new-temp-file) new-alt) (setq default-directory thisdir) - (insert command "\n") + (let ((inhibit-read-only t)) + (insert command "\n")) (if (and (not no-async) (fboundp 'start-process)) (progn (setq proc (start-process "Diff" buf shell-file-name shell-command-switch command)) + (set-process-filter proc 'diff-process-filter) (set-process-sentinel proc (lambda (proc msg) (with-current-buffer (process-buffer proc) (diff-sentinel (process-exit-status proc)))))) ;; Async processes aren't available. - (diff-sentinel - (call-process shell-file-name nil buf nil - shell-command-switch command)))) + (let ((inhibit-read-only t)) + (diff-sentinel + (call-process shell-file-name nil buf nil + shell-command-switch command))))) buf)) +(defun diff-process-filter (proc string) + (with-current-buffer (process-buffer proc) + (let ((moving (= (point) (process-mark proc)))) + (save-excursion + ;; Insert the text, advancing the process marker. + (goto-char (process-mark proc)) + (let ((inhibit-read-only t)) + (insert string)) + (set-marker (process-mark proc) (point))) + (if moving (goto-char (process-mark proc)))))) + ;;;###autoload (defun diff-backup (file &optional switches) "Diff this file with its backup file or vice versa.