annotate lisp/diff.el @ 2402:61e1f8813d03

(vc-comment-to-changelog): A useful vc-checkin hook, added. (vc-checkout): Now rejects attempts to check out files via FTP. The `derived buffers' in the mode (the VC log buffer, status buffers, and most buffer output commands) now know which file buffer was their parent, and most commands will try to find such a parent buffer when executed from within a special buffer.
author Eric S. Raymond <esr@snark.thyrsus.com>
date Sun, 28 Mar 1993 06:40:46 +0000
parents 10e417efb12a
children 09e58f572f19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
1 ;;; diff.el --- Run `diff' in compilation-mode.
846
20674ae6bf52 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 811
diff changeset
2
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
3 ;; Copyright (C) 1992 Free Software Foundation, Inc.
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
4
2247
2c7997f249eb Add or correct keywords
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1215
diff changeset
5 ;; Keywords: unix, tools
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 669
diff changeset
6
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 ;; This file is part of GNU Emacs.
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 ;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 669
diff changeset
11 ;; the Free Software Foundation; either version 2, or (at your option)
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 ;; any later version.
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 ;; GNU Emacs is distributed in the hope that it will be useful,
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 ;; GNU General Public License for more details.
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 ;; You should have received a copy of the GNU General Public License
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20 ;; along with GNU Emacs; see the file COPYING. If not, write to
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22
2307
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2247
diff changeset
23 ;;; Commentary:
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2247
diff changeset
24
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2247
diff changeset
25 ;; This package helps you explore differences between files, using the
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2247
diff changeset
26 ;; UNIX command diff(1). The commands are `diff' and `diff-backup'.
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2247
diff changeset
27 ;; You can specify options with `diff-switches'.
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2247
diff changeset
28
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
29 ;;; Code:
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 669
diff changeset
30
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
31 (require 'compile)
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 669
diff changeset
32
1179
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
33 (defvar diff-switches "-c"
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
34 "*A string or list of strings specifying switches to be be passed to diff.")
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
35
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
36 (defvar diff-regexp-alist
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
37 '(
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
38 ;; -u format: @@ -OLDSTART,OLDEND +NEWSTART,NEWEND @@
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
39 ("^@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@$" 1 2)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
40
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
41 ;; -c format: *** OLDSTART,OLDEND ****
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
42 ("^\\*\\*\\* \\([0-9]+\\),[0-9]+ \\*\\*\\*\\*$" 1 nil)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
43 ;; --- NEWSTART,NEWEND ----
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
44 ("^--- \\([0-9]+\\),[0-9]+ ----$" nil 1)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
45
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
46 ;; plain diff format: OLDSTART[,OLDEND]{a,d,c}NEWSTART[,NEWEND]
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
47 ("^\\([0-9]+\\)\\(,[0-9]+\\)?[adc]\\([0-9]+\\)\\(,[0-9]+\\)?$" 1 3)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
48
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
49 ;; -e (ed) format: OLDSTART[,OLDEND]{a,d,c}
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
50 ("^\\([0-9]+\\)\\(,[0-9]+\\)?[adc]$" 1)
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
52 ;; -f format: {a,d,c}OLDSTART[ OLDEND]
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
53 ;; -n format: {a,d,c}OLDSTART LINES-CHANGED
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
54 ("^[adc]\\([0-9]+\\)\\( [0-9]+\\)?$" 1)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
55 )
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
56 "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
57 sections in \\[diff] output. If REGEXP matches, the OLD-IDX'th
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
58 subexpression gives the line number in the old file, and NEW-IDX'th
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
59 subexpression gives the line number in the new file. If OLD-IDX or NEW-IDX
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
60 is nil, REGEXP matches only half a section.")
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61
1134
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
62 (defvar diff-old-file nil
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
63 "This is the old file name in the comparison in this buffer.")
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
64 (defvar diff-new-file nil
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
65 "This is the new file name in the comparison in this buffer.")
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
66 (defvar diff-old-temp-file nil
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
67 "This is the name of a temp file to be deleted after diff finishes.")
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
68 (defvar diff-new-temp-file nil
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
69 "This is the name of a temp file to be deleted after diff finishes.")
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
70
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
71 ;; See compilation-parse-errors-function (compile.el).
907
48ca3bf4b5f8 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 894
diff changeset
72 (defun diff-parse-differences (limit-search find-at-least)
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
73 (setq compilation-error-list nil)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
74 (message "Parsing differences...")
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
75
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
76 ;; Don't reparse diffs already seen at last parse.
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
77 (goto-char compilation-parsing-end)
474
c3bbd755b7da *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 349
diff changeset
78
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
79 ;; Construct in REGEXP a regexp composed of all those in dired-regexp-alist.
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
80 (let ((regexp (mapconcat (lambda (elt)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
81 (concat "\\(" (car elt) "\\)"))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
82 diff-regexp-alist
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
83 "\\|"))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
84 ;; (GROUP-IDX OLD-IDX NEW-IDX)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
85 (groups (let ((subexpr 1))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
86 (mapcar (lambda (elt)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
87 (prog1
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
88 (cons subexpr
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
89 (mapcar (lambda (n)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
90 (and n
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
91 (+ subexpr n)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
92 (cdr elt)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
93 (setq subexpr (+ subexpr 1
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
94 (count-regexp-groupings
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
95 (car elt))))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
96 diff-regexp-alist)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
97
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
98 (new-error
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
99 (function (lambda (file subexpr)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
100 (setq compilation-error-list
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
101 (cons
1179
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
102 (cons (save-excursion
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
103 ;; Report location of message
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
104 ;; at beginning of line.
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
105 (goto-char
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
106 (match-beginning subexpr))
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
107 (beginning-of-line)
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
108 (point-marker))
7961d1af11a7 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 1134
diff changeset
109 ;; Report location of corresponding text.
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
110 (let ((line (string-to-int
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
111 (buffer-substring
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
112 (match-beginning subexpr)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
113 (match-end subexpr)))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
114 (save-excursion
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
115 (set-buffer (find-file-noselect file))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
116 (save-excursion
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
117 (goto-line line)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
118 (point-marker)))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
119 compilation-error-list)))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
120
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
121 (found-desired nil)
1215
92554bb95d51 (diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents: 1179
diff changeset
122 (num-loci-found 0)
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
123 g)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
124
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
125 (while (and (not found-desired)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
126 ;; We don't just pass LIMIT-SEARCH to re-search-forward
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
127 ;; because we want to find matches containing LIMIT-SEARCH
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
128 ;; but which extend past it.
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
129 (re-search-forward regexp nil t))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
130
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
131 ;; Find which individual regexp matched.
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
132 (setq g groups)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
133 (while (and g (null (match-beginning (car (car g)))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
134 (setq g (cdr g)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
135 (setq g (car g))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
136
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
137 (if (nth 1 g) ;OLD-IDX
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
138 (funcall new-error diff-old-file (nth 1 g)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
139 (if (nth 2 g) ;NEW-IDX
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
140 (funcall new-error diff-new-file (nth 2 g)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
141
1215
92554bb95d51 (diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents: 1179
diff changeset
142 (setq num-loci-found (1+ num-loci-found))
1134
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
143 (if (or (and find-at-least
1215
92554bb95d51 (diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents: 1179
diff changeset
144 (>= num-loci-found find-at-least))
907
48ca3bf4b5f8 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 894
diff changeset
145 (and limit-search (>= (point) limit-search)))
1215
92554bb95d51 (diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents: 1179
diff changeset
146 ;; We have found as many new loci as the user wants,
907
48ca3bf4b5f8 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 894
diff changeset
147 ;; or the user wanted a specific diff, and we're past it.
48ca3bf4b5f8 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 894
diff changeset
148 (setq found-desired t)))
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
149 (if found-desired
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
150 (setq compilation-parsing-end (point))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
151 ;; Set to point-max, not point, so we don't perpetually
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
152 ;; parse the last bit of text when it isn't a diff header.
1215
92554bb95d51 (diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents: 1179
diff changeset
153 (setq compilation-parsing-end (point-max)))
92554bb95d51 (diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents: 1179
diff changeset
154 (message "Parsing differences...done"))
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
155 (setq compilation-error-list (nreverse compilation-error-list)))
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 ;;;###autoload
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
158 (defun diff (old new &optional switches)
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159 "Find and display the differences between OLD and NEW files.
669
4c64c671426f *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 662
diff changeset
160 Interactively the current buffer's file name is the default for for NEW
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
161 and a backup file for NEW is the default for OLD.
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
162 With prefix arg, prompt for diff switches."
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 (interactive
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
164 (nconc
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
165 (let (oldf newf)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
166 (nreverse
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
167 (list
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
168 (setq newf (buffer-file-name)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
169 newf (if (and newf (file-exists-p newf))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
170 (read-file-name
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
171 (concat "Diff new file: ("
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
172 (file-name-nondirectory newf) ") ")
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
173 nil newf t)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
174 (read-file-name "Diff new file: " nil nil t)))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
175 (setq oldf (file-newest-backup newf)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
176 oldf (if (and oldf (file-exists-p oldf))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
177 (read-file-name
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
178 (concat "Diff original file: ("
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
179 (file-name-nondirectory oldf) ") ")
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
180 (file-name-directory oldf) oldf t)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
181 (read-file-name "Diff original file: "
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
182 (file-name-directory newf) nil t))))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
183 (if current-prefix-arg
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
184 (list (read-string "Diff switches: "
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
185 (if (stringp diff-switches)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
186 diff-switches
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
187 (mapconcat 'identity diff-switches " "))))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
188 nil)))
349
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 (setq new (expand-file-name new)
feacf757c5b2 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 old (expand-file-name old))
1134
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
191 (let ((old-alt (file-local-copy old))
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
192 (new-alt (file-local-copy new))
1110
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
193 buf)
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
194 (unwind-protect
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
195 (let ((command
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
196 (mapconcat 'identity
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
197 (append '("diff")
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
198 (if (consp diff-switches)
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
199 diff-switches
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
200 (list diff-switches))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
201 (if (or old-alt new-alt)
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
202 (list "-L" old "-L" new))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
203 (list (or old-alt old))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
204 (list (or new-alt new)))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
205 " ")))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
206 (setq buf
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
207 (compile-internal command
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
208 "No more differences" "Diff"
1112
1dba066c1e0a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1110
diff changeset
209 'diff-parse-differences))
1110
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
210 (save-excursion
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
211 (set-buffer buf)
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 907
diff changeset
212 (set (make-local-variable 'diff-old-file) old)
1134
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
213 (set (make-local-variable 'diff-new-file) new)
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
214 (set (make-local-variable 'diff-old-temp-file) old-alt)
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
215 (set (make-local-variable 'diff-new-temp-file) new-alt)
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
216 (set (make-local-variable 'compilation-finish-function)
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
217 (function (lambda (buff msg)
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
218 (if diff-old-temp-file
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
219 (delete-file diff-old-temp-file))
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
220 (if diff-new-temp-file
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
221 (delete-file diff-new-temp-file))))))
05c961416bb5 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 1112
diff changeset
222 buf))))
474
c3bbd755b7da *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 349
diff changeset
223
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
224 ;;;###autoload
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
225 (defun diff-backup (file &optional switches)
881
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
226 "Diff this file with its backup file or vice versa.
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
227 Uses the latest backup, if there are several numerical backups.
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
228 If this file is a backup, diff it with its original.
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
229 The backup file is the first file given to `diff'."
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
230 (interactive (list (read-file-name "Diff (file with backup): ")
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
231 (if current-prefix-arg
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
232 (read-string "Diff switches: "
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
233 (if (stringp diff-switches)
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
234 diff-switches
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
235 (mapconcat 'identity
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
236 diff-switches " ")))
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
237 nil)))
881
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
238 (let (bak ori)
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
239 (if (backup-file-name-p file)
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
240 (setq bak file
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
241 ori (file-name-sans-versions file))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
242 (setq bak (or (diff-latest-backup-file file)
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
243 (error "No backup found for %s" file))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
244 ori file))
894
41507a5a8fd7 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 881
diff changeset
245 (diff bak ori switches)))
474
c3bbd755b7da *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 349
diff changeset
246
881
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
247 (defun diff-latest-backup-file (fn) ; actually belongs into files.el
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
248 "Return the latest existing backup of FILE, or nil."
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
249 ;; First try simple backup, then the highest numbered of the
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
250 ;; numbered backups.
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
251 ;; Ignore the value of version-control because we look for existing
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
252 ;; backups, which maybe were made earlier or by another user with
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
253 ;; a different value of version-control.
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
254 (setq fn (expand-file-name fn))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
255 (or
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
256 (let ((bak (make-backup-file-name fn)))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
257 (if (file-exists-p bak) bak))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
258 (let* ((dir (file-name-directory fn))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
259 (base-versions (concat (file-name-nondirectory fn) ".~"))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
260 (bv-length (length base-versions)))
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
261 (concat dir
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
262 (car (sort
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
263 (file-name-all-completions base-versions dir)
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
264 ;; bv-length is a fluid var for backup-extract-version:
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
265 (function
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
266 (lambda (fn1 fn2)
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
267 (> (backup-extract-version fn1)
945558e05127 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 846
diff changeset
268 (backup-extract-version fn2))))))))))
474
c3bbd755b7da *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 349
diff changeset
269
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 474
diff changeset
270 ;;; diff.el ends here