]> code.delx.au - gnu-emacs/blobdiff - lisp/diff.el
(mh-version): Use mh-e-RCS-id rather than mh-e-version
[gnu-emacs] / lisp / diff.el
index a6793dca51f76605572418218346318c64887f7a..4e8f829fdaf5f21af424cecce87e55303fa6a233 100644 (file)
@@ -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:
 
 (defvar diff-switches "-c"
   "*A string or list of strings specifying switches to be be passed to diff.")
 
+(defvar diff-command "diff"
+  "*The command to use to run 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 ----
@@ -54,7 +58,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
@@ -196,7 +200,7 @@ With prefix arg, prompt for diff switches."
     (unwind-protect
        (let ((command
               (mapconcat 'identity
-                         (append '("diff")
+                         (append (list diff-command)
                                  ;; Use explicitly specified switches
                                  (if switches
                                      (if (consp switches)
@@ -217,6 +221,18 @@ With prefix arg, prompt for diff switches."
                                  "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 (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)
@@ -254,9 +270,9 @@ The backup file is the first file given to `diff'."
 
 (defun diff-latest-backup-file (fn)    ; actually belongs into files.el
   "Return the latest existing backup of FILE, or nil."
-  (let ((handler (find-file-name-handler fn)))
+  (let ((handler (find-file-name-handler fn 'diff-latest-backup-file)))
     (if handler
-       (funcall handler fn)
+       (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
@@ -266,8 +282,12 @@ The backup file is the first file given to `diff'."
       (or
        (let ((bak (make-backup-file-name fn)))
         (if (file-exists-p bak) bak))
-       (let* ((dir (file-name-directory fn))
-             (base-versions (concat (file-name-nondirectory fn) ".~"))
+       ;; 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