X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3afbc435ac942072f42bf795dea22131b03c8d93..adbf7978dddf948e85d41cd69cc81234e508b9c3:/lisp/ediff-vers.el diff --git a/lisp/ediff-vers.el b/lisp/ediff-vers.el index 4c502813c1..9ae720e9bc 100644 --- a/lisp/ediff-vers.el +++ b/lisp/ediff-vers.el @@ -1,8 +1,9 @@ ;;; ediff-vers.el --- version control interface to Ediff -;;; Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996, 1997, 2002, 2003, 2004, +;; 2005 Free Software Foundation, Inc. -;; Author: Michael Kifer +;; Author: Michael Kifer ;; This file is part of GNU Emacs. @@ -18,8 +19,8 @@ ;; 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, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -35,25 +36,45 @@ (and noninteractive (eval-when-compile - (load "pcl-cvs" 'noerror) - (load "rcs" 'noerror) - ;; On 8+3 MS-DOS filesystems, generic-x.el is loaded - ;; instead of (the missing) generic-sc.el. Since the - ;; version of Emacs which supports MS-DOS doesn't have - ;; generic-sc, we simply avoid loading it. - (or (and (fboundp 'msdos-long-file-names) - (not (msdos-long-file-names))) - (load "generic-sc" 'noerror)) - (load "vc" 'noerror))) + (let ((load-path (cons (expand-file-name ".") load-path))) + (load "pcl-cvs" 'noerror) + (load "rcs" 'noerror) + ;; On 8+3 MS-DOS filesystems, generic-x.el is loaded + ;; instead of (the missing) generic-sc.el. Since the + ;; version of Emacs which supports MS-DOS doesn't have + ;; generic-sc, we simply avoid loading it. + (or (and (fboundp 'msdos-long-file-names) + (not (msdos-long-file-names))) + (load "generic-sc" 'noerror)) + ;; (load "vc" 'noerror) ; this sometimes causes compiler error + (or (featurep 'ediff-init) + (load "ediff-init.el" nil nil 'nosuffix)) + ))) ;; end pacifier - + ;; VC.el support + +(defun ediff-vc-latest-version (file) + "Return the version level of the latest version of FILE in repository." + (if (fboundp 'vc-latest-version) + (vc-latest-version file) + (or (vc-file-getprop file 'vc-latest-version) + (cond ((vc-backend file) + (vc-call state file) + (vc-file-getprop file 'vc-latest-version)) + (t (error "File %s is not under version control" file)))) + )) + + (defun ediff-vc-internal (rev1 rev2 &optional startup-hooks) -;; Run Ediff on versions of the current buffer. -;; If REV2 is "" then compare current buffer with REV1. -;; If the current buffer is named `F', the version is named `F.~REV~'. -;; If `F.~REV~' already exists, it is used instead of being re-created. + ;; Run Ediff on versions of the current buffer. + ;; If REV1 is "", use the latest version of the current buffer's file. + ;; If REV2 is "" then compare current buffer with REV1. + ;; If the current buffer is named `F', the version is named `F.~REV~'. + ;; If `F.~REV~' already exists, it is used instead of being re-created. (let (file1 file2 rev1buf rev2buf) + (if (string= rev1 "") + (setq rev1 (ediff-vc-latest-version (buffer-file-name)))) (save-window-excursion (save-excursion (vc-version-other-window rev1) @@ -73,12 +94,12 @@ rev1buf rev2buf startup-hooks 'ediff-revision))) - + ;; RCS.el support (defun rcs-ediff-view-revision (&optional rev) ;; View previous RCS revision of current file. ;; With prefix argument, prompts for a revision name. - (interactive (list (if current-prefix-arg + (interactive (list (if current-prefix-arg (read-string "Revision: ")))) (let* ((filename (buffer-file-name (current-buffer))) (switches (append '("-p") @@ -96,10 +117,10 @@ (apply 'call-process "co" nil t nil ;; -q: quiet (no diagnostics) (append switches rcs-default-co-switches - (list "-q" filename))))) + (list "-q" filename))))) (message "") - buff))) - + buff))) + (defun ediff-rcs-get-output-buffer (file name) ;; Get a buffer for RCS output for FILE, make it writable and clean it up. ;; Optional NAME is name to use instead of `*RCS-output*'. @@ -123,7 +144,7 @@ (current-buffer) (rcs-ediff-view-revision rev2)) rev1buf (rcs-ediff-view-revision rev1))) - + ;; rcs.el doesn't create temp version files, so we don't have to delete ;; anything in startup hooks to ediff-buffers (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision) @@ -157,7 +178,7 @@ ;;; Merge with Version Control -(defun ediff-vc-merge-internal (rev1 rev2 ancestor-rev +(defun ediff-vc-merge-internal (rev1 rev2 ancestor-rev &optional startup-hooks merge-buffer-file) ;; If ANCESTOR-REV non-nil, merge with ancestor (let (buf1 buf2 ancestor-buf) @@ -175,9 +196,9 @@ (setq ancestor-rev (vc-workfile-version buffer-file-name))) (vc-version-other-window ancestor-rev) (setq ancestor-buf (current-buffer)))) - (setq startup-hooks - (cons - `(lambda () + (setq startup-hooks + (cons + `(lambda () (delete-file ,(buffer-file-name buf1)) (or ,(string= rev2 "") (delete-file ,(buffer-file-name buf2))) @@ -246,7 +267,7 @@ ;; PCL-CVS.el support - +;; MK: Check. This function doesn't seem to be used any more by pcvs or pcl-cvs (defun cvs-run-ediff-on-file-descriptor (tin) ;; This is a replacement for cvs-emerge-mode ;; Runs after cvs-update. @@ -258,11 +279,11 @@ (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 @@ -284,12 +305,14 @@ (if (stringp tmp-file) (delete-file tmp-file)) (if (stringp ancestor-file) (delete-file ancestor-file)))) + +(provide 'ediff-vers) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1) ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body)) ;;; End: -(provide 'ediff-vers) - +;;; arch-tag: bbb34f0c-2a90-426a-a77a-c75f479ebbbf ;;; ediff-vers.el ends here