fix live process/dead buffer bub on w32
[bpt/emacs.git] / lisp / diff.el
index 1ebb774..358ad9a 100644 (file)
@@ -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:
 
 
 (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
   '(
@@ -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,19 +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 (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)))))
+         (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)
@@ -242,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
@@ -287,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)