(defvar rcs-default-co-switches)
(defvar sc-mode)
(defvar cvs-shell)
(defvar cvs-program)
(defvar cvs-cookie-handle)
(defvar ediff-temp-file-prefix)
(and noninteractive
(eval-when-compile
(load "pcl-cvs" 'noerror)
(load "rcs" 'noerror)
(load "generic-sc" 'noerror)
(load "vc" 'noerror)))
(defun ediff-vc-internal (rev1 rev2 &optional startup-hooks)
(let (file1 file2 rev1buf rev2buf)
(save-excursion
(vc-version-other-window rev1)
(setq rev1buf (current-buffer)
file1 (buffer-file-name)))
(save-excursion
(or (string= rev2 "") (vc-version-other-window rev2))
(setq rev2buf (current-buffer)
file2 (buffer-file-name)))
(setq startup-hooks
(cons (` (lambda ()
(delete-file (, file1))
(or (, (string= rev2 "")) (delete-file (, file2)))
))
startup-hooks))
(ediff-buffers
rev1buf rev2buf
startup-hooks
'ediff-revision)))
(defun rcs-ediff-view-revision (&optional rev)
(interactive (list (if current-prefix-arg
(read-string "Revision: "))))
(let* ((filename (buffer-file-name (current-buffer)))
(switches (append '("-p")
(if rev (list (concat "-r" rev)) nil)))
(buff (concat (file-name-nondirectory filename) ".~" rev "~")))
(message "Working ...")
(setq filename (expand-file-name filename))
(with-output-to-temp-buffer buff
(let ((output-buffer (ediff-rcs-get-output-buffer filename buff)))
(delete-windows-on output-buffer)
(save-excursion
(set-buffer output-buffer)
(apply 'call-process "co" nil t nil
(append switches rcs-default-co-switches
(list "-q" filename)))))
(message "")
buff)))
(defun ediff-rcs-get-output-buffer (file name)
(let* ((default-major-mode 'fundamental-mode) (buf (get-buffer-create name)))
(save-excursion
(set-buffer buf)
(setq buffer-read-only nil
default-directory (file-name-directory (expand-file-name file)))
(erase-buffer))
buf))
(defun ediff-rcs-internal (rev1 rev2 &optional startup-hooks)
(let ((rev2buf (if (string= rev2 "")
(current-buffer)
(rcs-ediff-view-revision rev2)))
(rev1buf (rcs-ediff-view-revision rev1)))
(ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)
))
(defun generic-sc-get-latest-rev ()
(cond ((eq sc-mode 'CCASE)
(eval "main/LATEST"))
(t (eval ""))))
(defun ediff-generic-sc-internal (rev1 rev2 &optional startup-hooks)
(let (rev1buf rev2buf)
(save-excursion
(if (or (not rev1) (string= rev1 ""))
(setq rev1 (generic-sc-get-latest-rev)))
(sc-visit-previous-revision rev1)
(setq rev1buf (current-buffer)))
(save-excursion
(or (string= rev2 "") (sc-visit-previous-revision rev2))
(setq rev2buf (current-buffer)))
(ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)))
(defun ediff-vc-merge-internal (rev1 rev2 ancestor-rev
&optional startup-hooks merge-buffer-file)
(let (buf1 buf2 ancestor-buf)
(save-excursion
(vc-version-other-window rev1)
(setq buf1 (current-buffer)))
(save-excursion
(or (string= rev2 "")
(vc-version-other-window rev2))
(setq buf2 (current-buffer)))
(if ancestor-rev
(save-excursion
(or (string= ancestor-rev "")
(vc-version-other-window ancestor-rev))
(setq ancestor-buf (current-buffer))))
(setq startup-hooks
(cons
(` (lambda ()
(delete-file (, (buffer-file-name buf1)))
(or (, (string= rev2 ""))
(delete-file (, (buffer-file-name buf2))))
(or (, (string= ancestor-rev ""))
(, (not ancestor-rev))
(delete-file (, (buffer-file-name ancestor-buf))))
))
startup-hooks))
(if ancestor-rev
(ediff-merge-buffers-with-ancestor
buf1 buf2 ancestor-buf
startup-hooks 'ediff-merge-revisions-with-ancestor merge-buffer-file)
(ediff-merge-buffers
buf1 buf2 startup-hooks 'ediff-merge-revisions merge-buffer-file))
))
(defun ediff-rcs-merge-internal (rev1 rev2 ancestor-rev
&optional
startup-hooks merge-buffer-file)
(let (buf1 buf2 ancestor-buf)
(setq buf1 (rcs-ediff-view-revision rev1)
buf2 (if (string= rev2 "")
(current-buffer)
(rcs-ediff-view-revision rev2))
ancestor-buf (if ancestor-rev
(if (string= ancestor-rev "")
(current-buffer)
(rcs-ediff-view-revision ancestor-rev))))
(if ancestor-rev
(ediff-merge-buffers-with-ancestor
buf1 buf2 ancestor-buf
startup-hooks 'ediff-merge-revisions-with-ancestor merge-buffer-file)
(ediff-merge-buffers
buf1 buf2 startup-hooks 'ediff-merge-revisions merge-buffer-file))))
(defun ediff-generic-sc-merge-internal (rev1 rev2 ancestor-rev
&optional
startup-hooks merge-buffer-file)
(let (buf1 buf2 ancestor-buf)
(save-excursion
(if (string= rev1 "")
(setq rev1 (generic-sc-get-latest-rev)))
(sc-visit-previous-revision rev1)
(setq buf1 (current-buffer)))
(save-excursion
(or (string= rev2 "")
(sc-visit-previous-revision rev2))
(setq buf2 (current-buffer)))
(if ancestor-rev
(save-excursion
(or (string= ancestor-rev "")
(sc-visit-previous-revision ancestor-rev))
(setq ancestor-buf (current-buffer))))
(if ancestor-rev
(ediff-merge-buffers-with-ancestor
buf1 buf2 ancestor-buf
startup-hooks 'ediff-merge-revisions-with-ancestor merge-buffer-file)
(ediff-merge-buffers
buf1 buf2 startup-hooks 'ediff-merge-revisions merge-buffer-file))))
(defun ediff-pcl-cvs-internal (rev1 rev2 &optional startup-hooks)
(let ((orig-buf (current-buffer))
orig-file-name buf1 buf2 file1 file2)
(or (setq orig-file-name (buffer-file-name (current-buffer)))
(error "Current buffer is not visiting any file"))
(if (string= rev1 "") (setq rev1 nil)) (setq buf1 (ediff-pcl-cvs-view-revision orig-file-name rev1)
buf2 (if (string= rev2 "")
orig-buf
(ediff-pcl-cvs-view-revision orig-file-name rev2))
file1 (buffer-file-name buf1)
file2 (buffer-file-name buf2))
(setq startup-hooks
(cons (` (lambda ()
(delete-file (, file1))
(or (, (string= rev2 "")) (delete-file (, file2)))
))
startup-hooks))
(ediff-buffers buf1 buf2 startup-hooks 'ediff-revision)))
(defun ediff-pcl-cvs-merge-internal (rev1 rev2 ancestor-rev
&optional
startup-hooks merge-buffer-file)
(let ((orig-buf (current-buffer))
orig-file-name buf1 buf2 ancestor-buf)
(or (setq orig-file-name (buffer-file-name (current-buffer)))
(error "Current buffer is not visiting any file"))
(if (string= rev1 "") (setq rev1 nil))
(setq buf1 (ediff-pcl-cvs-view-revision orig-file-name rev1))
(setq buf2 (if (string= rev2 "")
orig-buf
(ediff-pcl-cvs-view-revision orig-file-name rev2)))
(if (stringp ancestor-rev)
(setq ancestor-buf
(if (string= ancestor-rev "")
orig-buf
(ediff-pcl-cvs-view-revision orig-file-name ancestor-rev))))
(setq startup-hooks
(cons
(` (lambda ()
(delete-file (, (buffer-file-name buf1)))
(or (, (string= rev2 ""))
(delete-file (, (buffer-file-name buf2))))
(or (, (string= ancestor-rev ""))
(, (not ancestor-rev))
(delete-file (, (buffer-file-name ancestor-buf))))
))
startup-hooks))
(if ancestor-buf
(ediff-merge-buffers-with-ancestor
buf1 buf2 ancestor-buf startup-hooks
'ediff-merge-revisions-with-ancestor merge-buffer-file)
(ediff-merge-buffers
buf1 buf2 startup-hooks 'ediff-merge-revisions merge-buffer-file))
))
(defun ediff-pcl-cvs-view-revision (file rev)
(let ((temp-name (make-temp-name
(concat ediff-temp-file-prefix
"ediff_" rev))))
(cvs-kill-buffer-visiting temp-name)
(if rev
(message "Retrieving revision %s..." rev)
(message "Retrieving latest revision..."))
(let ((res (call-process cvs-shell nil nil nil "-c"
(concat cvs-program " update -p "
(if rev
(concat "-r " rev " ")
"")
file
" > " temp-name))))
(if (and res (not (and (integerp res) (zerop res))))
(error "Failed to retrieve revision: %s" res))
(if rev
(message "Retrieving revision %s... Done." rev)
(message "Retrieving latest revision... Done."))
(find-file-noselect temp-name))))
(defun cvs-run-ediff-on-file-descriptor (tin)
(let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
(type (cvs-fileinfo->type fileinfo))
(tmp-file
(cvs-retrieve-revision-to-tmpfile fileinfo))
(default-directory
(file-name-as-directory (cvs-fileinfo->dir fileinfo)))
ancestor-file)
(or (memq type '(MERGED CONFLICT MODIFIED))
(error
"Can only merge `Modified', `Merged' or `Conflict' files"))
(cond ((memq type '(MERGED CONFLICT))
(setq ancestor-file
(cvs-retrieve-revision-to-tmpfile
fileinfo
(cvs-fileinfo->base-revision fileinfo)))
(ediff-merge-buffers-with-ancestor
(find-file-noselect tmp-file)
(find-file-noselect (cvs-fileinfo->backup-file fileinfo))
(find-file-noselect ancestor-file)
nil 'ediff-merge-revisions-with-ancestor))
((eq type 'MODIFIED)
(ediff-buffers
(find-file-noselect tmp-file)
(find-file-noselect (cvs-fileinfo->full-path fileinfo))
nil 'ediff-revisions)))
(if (stringp tmp-file) (delete-file tmp-file))
(if (stringp ancestor-file) (delete-file ancestor-file))))
(provide 'ediff-vers)