50 |
(load "ediff-init.el" nil nil 'nosuffix)) |
(load "ediff-init.el" nil nil 'nosuffix)) |
51 |
))) |
))) |
52 |
;; end pacifier |
;; end pacifier |
53 |
|
|
54 |
;; VC.el support |
;; VC.el support |
55 |
|
|
56 |
|
(defun ediff-vc-latest-version (file) |
57 |
|
"Return the version level of the latest version of FILE in repository." |
58 |
|
(if (fboundp 'vc-latest-version) |
59 |
|
(vc-latest-version file) |
60 |
|
(or (vc-file-getprop file 'vc-latest-version) |
61 |
|
(cond ((vc-backend file) |
62 |
|
(vc-call state file) |
63 |
|
(vc-file-getprop file 'vc-latest-version)) |
64 |
|
(t (error "File %s is not under version control" file)))) |
65 |
|
)) |
66 |
|
|
67 |
|
|
68 |
(defun ediff-vc-internal (rev1 rev2 &optional startup-hooks) |
(defun ediff-vc-internal (rev1 rev2 &optional startup-hooks) |
69 |
;; Run Ediff on versions of the current buffer. |
;; Run Ediff on versions of the current buffer. |
70 |
;; If REV2 is "" then compare current buffer with REV1. |
;; If REV1 is "", use the latest version of the current buffer's file. |
71 |
;; If the current buffer is named `F', the version is named `F.~REV~'. |
;; If REV2 is "" then compare current buffer with REV1. |
72 |
;; If `F.~REV~' already exists, it is used instead of being re-created. |
;; If the current buffer is named `F', the version is named `F.~REV~'. |
73 |
|
;; If `F.~REV~' already exists, it is used instead of being re-created. |
74 |
(let (file1 file2 rev1buf rev2buf) |
(let (file1 file2 rev1buf rev2buf) |
75 |
|
(if (string= rev1 "") |
76 |
|
(setq rev1 (ediff-vc-latest-version (buffer-file-name)))) |
77 |
(save-window-excursion |
(save-window-excursion |
78 |
(save-excursion |
(save-excursion |
79 |
(vc-version-other-window rev1) |
(vc-version-other-window rev1) |
93 |
rev1buf rev2buf |
rev1buf rev2buf |
94 |
startup-hooks |
startup-hooks |
95 |
'ediff-revision))) |
'ediff-revision))) |
96 |
|
|
97 |
;; RCS.el support |
;; RCS.el support |
98 |
(defun rcs-ediff-view-revision (&optional rev) |
(defun rcs-ediff-view-revision (&optional rev) |
99 |
;; View previous RCS revision of current file. |
;; View previous RCS revision of current file. |
100 |
;; With prefix argument, prompts for a revision name. |
;; With prefix argument, prompts for a revision name. |
101 |
(interactive (list (if current-prefix-arg |
(interactive (list (if current-prefix-arg |
102 |
(read-string "Revision: ")))) |
(read-string "Revision: ")))) |
103 |
(let* ((filename (buffer-file-name (current-buffer))) |
(let* ((filename (buffer-file-name (current-buffer))) |
104 |
(switches (append '("-p") |
(switches (append '("-p") |
116 |
(apply 'call-process "co" nil t nil |
(apply 'call-process "co" nil t nil |
117 |
;; -q: quiet (no diagnostics) |
;; -q: quiet (no diagnostics) |
118 |
(append switches rcs-default-co-switches |
(append switches rcs-default-co-switches |
119 |
(list "-q" filename))))) |
(list "-q" filename))))) |
120 |
(message "") |
(message "") |
121 |
buff))) |
buff))) |
122 |
|
|
123 |
(defun ediff-rcs-get-output-buffer (file name) |
(defun ediff-rcs-get-output-buffer (file name) |
124 |
;; Get a buffer for RCS output for FILE, make it writable and clean it up. |
;; Get a buffer for RCS output for FILE, make it writable and clean it up. |
125 |
;; Optional NAME is name to use instead of `*RCS-output*'. |
;; Optional NAME is name to use instead of `*RCS-output*'. |
143 |
(current-buffer) |
(current-buffer) |
144 |
(rcs-ediff-view-revision rev2)) |
(rcs-ediff-view-revision rev2)) |
145 |
rev1buf (rcs-ediff-view-revision rev1))) |
rev1buf (rcs-ediff-view-revision rev1))) |
146 |
|
|
147 |
;; rcs.el doesn't create temp version files, so we don't have to delete |
;; rcs.el doesn't create temp version files, so we don't have to delete |
148 |
;; anything in startup hooks to ediff-buffers |
;; anything in startup hooks to ediff-buffers |
149 |
(ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision) |
(ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision) |
177 |
|
|
178 |
;;; Merge with Version Control |
;;; Merge with Version Control |
179 |
|
|
180 |
(defun ediff-vc-merge-internal (rev1 rev2 ancestor-rev |
(defun ediff-vc-merge-internal (rev1 rev2 ancestor-rev |
181 |
&optional startup-hooks merge-buffer-file) |
&optional startup-hooks merge-buffer-file) |
182 |
;; If ANCESTOR-REV non-nil, merge with ancestor |
;; If ANCESTOR-REV non-nil, merge with ancestor |
183 |
(let (buf1 buf2 ancestor-buf) |
(let (buf1 buf2 ancestor-buf) |
195 |
(setq ancestor-rev (vc-workfile-version buffer-file-name))) |
(setq ancestor-rev (vc-workfile-version buffer-file-name))) |
196 |
(vc-version-other-window ancestor-rev) |
(vc-version-other-window ancestor-rev) |
197 |
(setq ancestor-buf (current-buffer)))) |
(setq ancestor-buf (current-buffer)))) |
198 |
(setq startup-hooks |
(setq startup-hooks |
199 |
(cons |
(cons |
200 |
`(lambda () |
`(lambda () |
201 |
(delete-file ,(buffer-file-name buf1)) |
(delete-file ,(buffer-file-name buf1)) |
202 |
(or ,(string= rev2 "") |
(or ,(string= rev2 "") |
203 |
(delete-file ,(buffer-file-name buf2))) |
(delete-file ,(buffer-file-name buf2))) |
278 |
(default-directory |
(default-directory |
279 |
(file-name-as-directory (cvs-fileinfo->dir fileinfo))) |
(file-name-as-directory (cvs-fileinfo->dir fileinfo))) |
280 |
ancestor-file) |
ancestor-file) |
281 |
|
|
282 |
(or (memq type '(MERGED CONFLICT MODIFIED)) |
(or (memq type '(MERGED CONFLICT MODIFIED)) |
283 |
(error |
(error |
284 |
"Can only merge `Modified', `Merged' or `Conflict' files")) |
"Can only merge `Modified', `Merged' or `Conflict' files")) |
285 |
|
|
286 |
(cond ((memq type '(MERGED CONFLICT)) |
(cond ((memq type '(MERGED CONFLICT)) |
287 |
(setq ancestor-file |
(setq ancestor-file |
288 |
(cvs-retrieve-revision-to-tmpfile |
(cvs-retrieve-revision-to-tmpfile |