Merged from emacs@sv.gnu.org.
[bpt/emacs.git] / lisp / ediff.el
index 35b28a3..14e1461 100644 (file)
@@ -1,14 +1,14 @@
 ;;; ediff.el --- a comprehensive visual interface to diff & patch
 
 ;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-;;   2003, 2004, 2005 Free Software Foundation, Inc.
+;;   2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
 ;; Created: February 2, 1994
 ;; Keywords: comparing, merging, patching, tools, unix
 
-(defconst ediff-version "2.80" "The current version of Ediff")
-(defconst ediff-date "July 8, 2005" "Date of last update")
+(defconst ediff-version "2.81.1" "The current version of Ediff")
+(defconst ediff-date "October 23, 2006" "Date of last update")
 
 
 ;; This file is part of GNU Emacs.
 
 ;;; Code:
 
-(provide 'ediff)
 
 ;; Compiler pacifier
 (defvar cvs-cookie-handle)
         (load "pcl-cvs" 'noerror)))
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
+    (provide 'ediff) ; to break recursive load cycle
     (or (featurep 'ediff-init)
        (load "ediff-init.el" nil nil 'nosuffix))
     (or (featurep 'ediff-mult)
                                           ediff-last-dir-B
                                         (file-name-directory f)))
                                 (progn
-                                  (setq file-name-history
-                                        (cons (ediff-abbreviate-file-name
-                                               (expand-file-name
-                                                (file-name-nondirectory f)
-                                                dir-B))
-                                              file-name-history))
+                                  (ediff-add-to-history
+                                   'file-name-history
+                                   (ediff-abbreviate-file-name
+                                    (expand-file-name
+                                     (file-name-nondirectory f)
+                                     dir-B)))
                                   (ediff-get-default-file-name f 1)))
           )))
   (ediff-files-internal file-A
                                                    ediff-last-dir-B
                                                  (file-name-directory f)))
                                          (progn
-                                           (setq file-name-history
-                                                 (cons
-                                                  (ediff-abbreviate-file-name
-                                                   (expand-file-name
-                                                    (file-name-nondirectory f)
-                                                    dir-B))
-                                                  file-name-history))
+                                           (ediff-add-to-history
+                                            'file-name-history
+                                            (ediff-abbreviate-file-name
+                                             (expand-file-name
+                                              (file-name-nondirectory f)
+                                              dir-B)))
                                            (ediff-get-default-file-name f 1))))
           (ediff-read-file-name "File C to compare"
                                 (setq dir-C (if ediff-use-last-dir
                                                 ediff-last-dir-C
                                               (file-name-directory ff)))
                                 (progn
-                                  (setq file-name-history
-                                        (cons (ediff-abbreviate-file-name
-                                               (expand-file-name
-                                                (file-name-nondirectory ff)
-                                                dir-C))
-                                              file-name-history))
+                                  (ediff-add-to-history
+                                   'file-name-history
+                                   (ediff-abbreviate-file-name
+                                    (expand-file-name
+                                     (file-name-nondirectory ff)
+                                     dir-C)))
                                   (ediff-get-default-file-name ff 2)))
           )))
   (ediff-files-internal file-A
@@ -504,12 +503,13 @@ expression; only file names that match the regexp are considered."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         f)
-     (list (setq f (ediff-read-file-name "Directory A to compare:" dir-A nil))
-          (ediff-read-file-name "Directory B to compare:"
-                                (if ediff-use-last-dir
-                                    ediff-last-dir-B
-                                  (ediff-strip-last-dir f))
-                                nil)
+     (list (setq f (read-directory-name
+                   "Directory A to compare:" dir-A nil 'must-match))
+          (read-directory-name "Directory B to compare:"
+                          (if ediff-use-last-dir
+                              ediff-last-dir-B
+                            (ediff-strip-last-dir f))
+                          nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -536,8 +536,8 @@ names.  Only the files that are under revision control are taken into account."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         )
-     (list (ediff-read-file-name
-           "Directory to compare with revision:" dir-A nil)
+     (list (read-directory-name
+           "Directory to compare with revision:" dir-A nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -565,17 +565,17 @@ regular expression; only file names that match the regexp are considered."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         f)
-     (list (setq f (ediff-read-file-name "Directory A to compare:" dir-A nil))
-          (setq f (ediff-read-file-name "Directory B to compare:"
-                                        (if ediff-use-last-dir
-                                            ediff-last-dir-B
-                                          (ediff-strip-last-dir f))
-                                        nil))
-          (ediff-read-file-name "Directory C to compare:"
-                                (if ediff-use-last-dir
-                                    ediff-last-dir-C
-                                  (ediff-strip-last-dir f))
-                                nil)
+     (list (setq f (read-directory-name "Directory A to compare:" dir-A nil))
+          (setq f (read-directory-name "Directory B to compare:"
+                                  (if ediff-use-last-dir
+                                      ediff-last-dir-B
+                                    (ediff-strip-last-dir f))
+                                  nil 'must-match))
+          (read-directory-name "Directory C to compare:"
+                          (if ediff-use-last-dir
+                              ediff-last-dir-C
+                            (ediff-strip-last-dir f))
+                          nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -601,12 +601,13 @@ expression; only file names that match the regexp are considered."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         f)
-     (list (setq f (ediff-read-file-name "Directory A to merge:" dir-A nil))
-          (ediff-read-file-name "Directory B to merge:"
-                                (if ediff-use-last-dir
-                                    ediff-last-dir-B
-                                  (ediff-strip-last-dir f))
-                                nil)
+     (list (setq f (read-directory-name "Directory A to merge:"
+                                       dir-A nil 'must-match))
+          (read-directory-name "Directory B to merge:"
+                          (if ediff-use-last-dir
+                              ediff-last-dir-B
+                            (ediff-strip-last-dir f))
+                          nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -637,17 +638,17 @@ only file names that match the regexp are considered."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         f)
-     (list (setq f (ediff-read-file-name "Directory A to merge:" dir-A nil))
-          (setq f (ediff-read-file-name "Directory B to merge:"
+     (list (setq f (read-directory-name "Directory A to merge:" dir-A nil))
+          (setq f (read-directory-name "Directory B to merge:"
                                 (if ediff-use-last-dir
                                     ediff-last-dir-B
                                   (ediff-strip-last-dir f))
-                                nil))
-          (ediff-read-file-name "Ancestor directory:"
+                                nil 'must-match))
+          (read-directory-name "Ancestor directory:"
                                 (if ediff-use-last-dir
                                     ediff-last-dir-C
                                   (ediff-strip-last-dir f))
-                                nil)
+                                nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -673,8 +674,8 @@ names.  Only the files that are under revision control are taken into account."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         )
-     (list (ediff-read-file-name
-           "Directory to merge with revisions:" dir-A nil)
+     (list (read-directory-name
+           "Directory to merge with revisions:" dir-A nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -703,8 +704,9 @@ names.  Only the files that are under revision control are taken into account."
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
         )
-     (list (ediff-read-file-name
-           "Directory to merge with revisions and ancestors:" dir-A nil)
+     (list (read-directory-name
+           "Directory to merge with revisions and ancestors:"
+           dir-A nil 'must-match)
           (read-string
            (if (stringp default-regexp)
                (format "Filter through regular expression (default %s): "
@@ -737,11 +739,6 @@ names.  Only the files that are under revision control are taken into account."
 (defun ediff-directories-internal (dir1 dir2 dir3 regexp action jobname
                                        &optional startup-hooks
                                        merge-autostore-dir)
-  ;; ediff-read-file-name is set to attach a previously entered file name if
-  ;; the currently entered file is a directory.  This code takes care of that.
-  (setq dir1 (if (file-directory-p dir1) dir1 (file-name-directory dir1))
-       dir2 (if (file-directory-p dir2) dir2 (file-name-directory dir2)))
-
   (if (stringp dir3)
       (setq dir3 (if (file-directory-p dir3) dir3 (file-name-directory dir3))))
 
@@ -767,7 +764,7 @@ names.  Only the files that are under revision control are taken into account."
             (ediff-merge-metajob jobname)
             (not merge-autostore-dir))
        (setq merge-autostore-dir
-             (read-file-name "Save merged files in directory: "
+             (read-directory-name "Save merged files in directory: "
                              (if ediff-use-last-dir
                                        ediff-last-merge-autostore-dir
                                      (ediff-strip-last-dir dir1))
@@ -827,7 +824,7 @@ names.  Only the files that are under revision control are taken into account."
             (ediff-merge-metajob jobname)
             (not merge-autostore-dir))
        (setq merge-autostore-dir
-             (read-file-name "Save merged files in directory: "
+             (read-directory-name "Save merged files in directory: "
                              (if ediff-use-last-dir
                                  ediff-last-merge-autostore-dir
                                (ediff-strip-last-dir dir1))
@@ -1109,12 +1106,12 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                           ediff-last-dir-B
                                         (file-name-directory f)))
                                 (progn
-                                  (setq file-name-history
-                                        (cons (ediff-abbreviate-file-name
-                                               (expand-file-name
-                                                (file-name-nondirectory f)
-                                                dir-B))
-                                              file-name-history))
+                                  (ediff-add-to-history
+                                   'file-name-history
+                                   (ediff-abbreviate-file-name
+                                    (expand-file-name
+                                     (file-name-nondirectory f)
+                                     dir-B)))
                                   (ediff-get-default-file-name f 1)))
           )))
   (setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
@@ -1153,13 +1150,12 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                                    ediff-last-dir-B
                                                  (file-name-directory f)))
                                          (progn
-                                           (setq file-name-history
-                                                 (cons
-                                                  (ediff-abbreviate-file-name
-                                                   (expand-file-name
-                                                    (file-name-nondirectory f)
-                                                    dir-B))
-                                                  file-name-history))
+                                           (ediff-add-to-history
+                                            'file-name-history
+                                            (ediff-abbreviate-file-name
+                                             (expand-file-name
+                                              (file-name-nondirectory f)
+                                              dir-B)))
                                            (ediff-get-default-file-name f 1))))
           (ediff-read-file-name "Ancestor file"
                                 (setq dir-ancestor
@@ -1167,12 +1163,12 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                           ediff-last-dir-ancestor
                                         (file-name-directory ff)))
                                 (progn
-                                  (setq file-name-history
-                                        (cons (ediff-abbreviate-file-name
-                                               (expand-file-name
-                                                (file-name-nondirectory ff)
-                                                dir-ancestor))
-                                              file-name-history))
+                                  (ediff-add-to-history
+                                   'file-name-history
+                                   (ediff-abbreviate-file-name
+                                    (expand-file-name
+                                     (file-name-nondirectory ff)
+                                     dir-ancestor)))
                                   (ediff-get-default-file-name ff 2)))
           )))
   (setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
@@ -1261,13 +1257,13 @@ buffer."
     (setq rev1
          (read-string
           (format
-           "Version 1 to merge (default: %s's working version): "
+           "Version 1 to merge (default %s's working version): "
            (if (stringp file)
                (file-name-nondirectory file) "current buffer")))
          rev2
          (read-string
           (format
-           "Version 2 to merge (default: %s): "
+           "Version 2 to merge (default %s): "
            (if (stringp file)
                (file-name-nondirectory file) "current buffer"))))
     (ediff-load-version-control)
@@ -1293,19 +1289,19 @@ buffer."
     (setq rev1
          (read-string
           (format
-           "Version 1 to merge (default: %s's working version): "
+           "Version 1 to merge (default %s's working version): "
            (if (stringp file)
                (file-name-nondirectory file) "current buffer")))
          rev2
          (read-string
           (format
-           "Version 2 to merge (default: %s): "
+           "Version 2 to merge (default %s): "
            (if (stringp file)
                (file-name-nondirectory file) "current buffer")))
          ancestor-rev
          (read-string
           (format
-           "Ancestor version (default: %s's base revision): "
+           "Ancestor version (default %s's base revision): "
            (if (stringp file)
                (file-name-nondirectory file) "current buffer"))))
     (ediff-load-version-control)
@@ -1374,7 +1370,7 @@ patch. If not given, the user is prompted according to the prefix argument."
    patch-buf
    (read-buffer
     "Which buffer to patch? "
-    (current-buffer))))
+    (ediff-other-buffer patch-buf))))
 
 
 ;;;###autoload
@@ -1411,11 +1407,11 @@ Uses `vc.el' or `rcs.el' depending on `ediff-version-control-package'."
   (let (rev1 rev2)
     (setq rev1
          (read-string
-          (format "Revision 1 to compare (default: %s's latest revision): "
+          (format "Revision 1 to compare (default %s's latest revision): "
                   (file-name-nondirectory file)))
          rev2
          (read-string
-          (format "Revision 2 to compare (default: %s's current state): "
+          (format "Revision 2 to compare (default %s's current state): "
                   (file-name-nondirectory file))))
     (ediff-load-version-control)
     (funcall
@@ -1533,6 +1529,9 @@ With optional NODE, goes to that node."
 
 (run-hooks 'ediff-load-hook)
 
+(provide 'ediff)
+
+
 ;;; Local Variables:
 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
 ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)