Say there is no maintainer.
[bpt/emacs.git] / lisp / diff.el
index 73b783a..a5fa702 100644 (file)
@@ -1,7 +1,8 @@
-;;; diff.el --- Run `diff' in compilation-mode.
+;;; diff.el --- run `diff' in compilation-mode
 
-;; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 1994, 1996, 2001 Free Software Foundation, Inc.
 
+;; Maintainer: FSF
 ;; Keywords: unix, tools
 
 ;; This file is part of GNU Emacs.
 
 (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
   '(
     ;; -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
-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
-is nil, REGEXP matches only half a section.")
+  "Alist of regular expressions to match difference sections in \\[diff] output.
+Each element has the form (REGEXP OLD-IDX NEW-IDX).
+Any text that REGEXP matches identifies one difference hunk
+or the header of a hunk.
+
+The OLD-IDX'th subexpression of REGEXP 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
+is nil, REGEXP matches only half a hunk.")
 
 (defvar diff-old-file nil
   "This is the old file name in the comparison in this buffer.")
@@ -152,11 +166,11 @@ 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)))
 
@@ -176,11 +190,12 @@ is nil, REGEXP matches only half a section.")
                (cons msg code))))))
 
 ;;;###autoload
-(defun diff (old new &optional switches)
+(defun diff (old new &optional switches no-async)
   "Find and display the differences between OLD and NEW files.
 Interactively the current buffer's file name is the default for NEW
 and a backup file for NEW is the default for OLD.
-With prefix arg, prompt for diff switches."
+With prefix arg, prompt for diff switches.
+If NO-ASYNC is non-nil, call diff synchronously."
   (interactive
    (nconc
     (let (oldf newf)
@@ -189,14 +204,14 @@ 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: ("
+                       (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: ("
+                       (concat "Diff original file: (default "
                                (file-name-nondirectory oldf) ") ")
                        (file-name-directory oldf) oldf t)
                     (read-file-name "Diff original file: "
@@ -235,7 +250,8 @@ With prefix arg, prompt for diff switches."
          (setq buf
                (compile-internal command
                                  "No more differences" "Diff"
-                                 'diff-parse-differences))
+                                 'diff-parse-differences
+                                 nil nil nil nil nil nil no-async))
          (set-buffer buf)
          (set (make-local-variable 'diff-old-file) old)
          (set (make-local-variable 'diff-new-file) new)
@@ -281,30 +297,7 @@ The backup file is the first file given to `diff'."
   (let ((handler (find-file-name-handler fn 'diff-latest-backup-file)))
     (if handler
        (funcall handler 'diff-latest-backup-file fn)
-      ;; First try simple backup, then the highest numbered of the
-      ;; numbered backups.
-      ;; Ignore the value of version-control because we look for existing
-      ;; backups, which maybe were made earlier or by another user with
-      ;; a different value of version-control.
-      (setq fn (file-chase-links (expand-file-name fn)))
-      (or
-       (let ((bak (make-backup-file-name fn)))
-        (if (file-exists-p bak) bak))
-       ;; We use BACKUPNAME to cope with backups stored in a different dir.
-       (let* ((backupname (car (find-backup-file-name fn)))
-             (dir (file-name-directory backupname))
-             (base-versions (concat (file-name-sans-versions
-                                     (file-name-nondirectory backupname))
-                                    ".~"))
-             (bv-length (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)
-                            (backup-extract-version fn2))))))))))))
+      (file-newest-backup fn))))
 
 (provide 'diff)