;;; 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
;; 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 ----
;; -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
(unwind-protect
(let ((command
(mapconcat 'identity
- (append '("diff")
+ (append (list diff-command)
;; Use explicitly specified switches
(if switches
(if (consp 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)
(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 'diff-latest-backup-file fn)
;; First try simple backup, then the highest numbered of the
(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