]> code.delx.au - gnu-emacs/blobdiff - lisp/ediff-mult.el
*** empty log message ***
[gnu-emacs] / lisp / ediff-mult.el
index e49ab14d2db8dcd849440b73df5fc57a65f80eab..536fdf4d47bbc0437702d4647c60160aad4c3d1c 100644 (file)
@@ -27,7 +27,7 @@
 ;; The present file contains all the infrastructure needed for that.
 ;;
 ;; Generally, to implement a new multisession capability within Ediff,
-;; you need to tell it 
+;; you need to tell it
 ;;
 ;;     1. How to display the session group buffer.
 ;;        This function must indicate which Ediff sessions are active (+) and
@@ -53,8 +53,8 @@
 ;;        HEADER must be a list of SIX elements (nil or string):
 ;;             (regexp metaobj1 metaobj2 metaobj3 merge-save-buffer
 ;;              comparison-function)
-;;         The function ediff-redraw-registry-buffer displays the 
-;;        1st - 4th of these in the registry buffer. 
+;;         The function ediff-redraw-registry-buffer displays the
+;;        1st - 4th of these in the registry buffer.
 ;;         For some jobs some of the members of the header might be nil.
 ;;         The meaning of metaobj1, metaobj2, and metaobj3 depend on the job.
 ;;         Typically these are directories where the files to be compared are
@@ -80,7 +80,7 @@
 ;;         (whose name is obj1).
 ;;         The nil's are placeholders, which are used internally by ediff.
 ;;     4. Write a function that makes a call to ediff-prepare-meta-buffer
-;;        passing all this info. 
+;;        passing all this info.
 ;;        You may be able to use ediff-directories-internal as a template.
 ;;     5. If you intend to add several related pieces of functionality,
 ;;        you may want to keep the function in 4 as an internal version
@@ -88,7 +88,7 @@
 ;;        with different parameters.
 ;;        See how ediff-directories, ediff-merge-directories, and
 ;;        ediff-merge-directories-with-ancestor all use
-;;        ediff-directories-internal. 
+;;        ediff-directories-internal.
 ;;
 ;; A useful addition here could be session groups selected by patterns
 ;; (which are different in each directory).  For instance, one may want to
@@ -96,7 +96,7 @@
 ;; which may be in the same or different directories.  Or, one may want to
 ;; compare all files of the form {something} to files of the form {something}~.
 ;;
-;; Implementing this requires writing an collating function, which should pair
+;; Implementing this requires writing a collating function, which should pair
 ;; up appropriate files.  It will also require a generalization of the
 ;; functions that do the layout of the meta- and differences buffers and of
 ;; ediff-filegroup-action.
@@ -167,9 +167,15 @@ directories.")
 ;; buffer used to collect custom diffs from individual sessions in the group
 (ediff-defvar-local ediff-meta-diff-buffer nil "")
 
-;; history var to use for filtering groups
+;; history var to use for filtering groups of files
 (defvar ediff-filtering-regexp-history nil "")
 
+(defcustom ediff-default-filtering-regexp nil
+  "The default regular expression used as a filename filter in multifile comparisons.
+Should be a sexp. For instance (car ediff-filtering-regexp-history) or nil."
+  :type 'sexp
+  :group 'ediff-mult)
+
 ;; This has the form ((meta-buf regexp dir1 dir2 dir3 merge-auto-store-dir)
 ;; (ctl-buf session-status (file1 . eq-status) (file2 . eq-status) (file3
 ;; . eq-status)) (ctl-buf session-status (file1 . eq-status) (file2
@@ -207,7 +213,7 @@ It is used by commands such as ediff-directories.
 This hook can be used to save the previous window config, which can be restored
 on ediff-quit, ediff-suspend, or ediff-quit-session-group-hook."
   :type 'hook
-  :group 'ediff-hook) 
+  :group 'ediff-hook)
 (defcustom ediff-after-session-group-setup-hook nil
   "*Hooks run just after a meta-buffer controlling a session group, such as
 ediff-directories, is run."
@@ -322,7 +328,7 @@ buffers."
 ;; OBJA, OBJB, OBJC are usually directories involved, but can be different for
 ;; different jobs. For instance, multifile patch has only OBJA, which is the
 ;; patch buffer.
-(defun ediff-make-new-meta-list-header (regexp 
+(defun ediff-make-new-meta-list-header (regexp
                                        objA objB objC
                                        merge-auto-store-dir
                                        comparison-func)
@@ -340,7 +346,7 @@ buffers."
 ;; checks if the session is a meta session
 (defun ediff-meta-session-p (session-info)
   (and (stringp (ediff-get-session-objA-name session-info))
-       (file-directory-p (ediff-get-session-objA-name session-info)) 
+       (file-directory-p (ediff-get-session-objA-name session-info))
        (stringp (ediff-get-session-objB-name session-info))
        (file-directory-p (ediff-get-session-objB-name session-info))
        (if (stringp (ediff-get-session-objC-name session-info))
@@ -468,7 +474,7 @@ Moves in circular fashion.  With numeric prefix arg, skip this many items."
 ;;;    (while (ediff-get-session-status
 ;;;        (ediff-get-meta-info (current-buffer) pos 'noerror))
 ;;;      (setq pos (ediff-previous-meta-overlay-start pos)))
-    
+
     (if pos (goto-char pos))
     (if (eq ediff-metajob-name 'ediff-registry)
        (if (and (ediff-get-meta-info (current-buffer) pos 'noerror)
@@ -505,7 +511,8 @@ behavior."
 ;; DIR1, DIR2, DIR3 are directories.  DIR3 can be nil.
 ;; OUTPUT-DIR is a directory for auto-storing the results of merge jobs.
 ;;           Can be nil.
-;; REGEXP is a regexp used to filter out files in the directories.
+;; REGEXP is nil or a filter regexp; only file names that match the regexp
+;; are considered.
 ;; If a file is a directory in dir1 but not dir2 (or vice versa), it is not
 ;; included in the intersection.  However, a regular file that is a dir in dir3
 ;; is included, since dir3 files are supposed to be ancestors for merging.
@@ -545,19 +552,19 @@ behavior."
          lis1          (directory-files auxdir1 nil regexp)
          lis1          (delete "."  lis1)
          lis1          (delete ".." lis1)
-         lis1          (mapcar 
+         lis1          (mapcar
                         (lambda (elt)
                           (ediff-add-slash-if-directory auxdir1 elt))
                         lis1)
          auxdir2       (file-name-as-directory dir2)
-         lis2          (mapcar 
+         lis2          (mapcar
                         (lambda (elt)
                           (ediff-add-slash-if-directory auxdir2 elt))
                         (directory-files auxdir2 nil regexp)))
 
     (if (stringp dir3)
        (setq auxdir3   (file-name-as-directory dir3)
-             lis3      (mapcar 
+             lis3      (mapcar
                         (lambda (elt)
                           (ediff-add-slash-if-directory auxdir3 elt))
                         (directory-files auxdir3 nil regexp))))
@@ -614,16 +621,16 @@ behavior."
                                                     merge-autostore-dir
                                                     comparison-func)
                    difflist))
-    
+
     (setq common-part
-         (cons 
+         (cons
           ;; metalist header
           (ediff-make-new-meta-list-header regexp
                                            auxdir1 auxdir2 auxdir3
                                            merge-autostore-dir
                                            comparison-func)
           (mapcar
-           (lambda (elt) 
+           (lambda (elt)
              (ediff-make-new-meta-list-element
               (concat auxdir1 elt)
               (concat auxdir2 elt)
@@ -686,9 +693,9 @@ behavior."
     (setq common (sort (ediff-copy-list common) 'string-lessp))
 
     ;; return result
-    (cons 
+    (cons
      ;; header -- has 6 elements. Meta buffer is prepended later by
-     ;; ediff-prepare-meta-buffer 
+     ;; ediff-prepare-meta-buffer
      (ediff-make-new-meta-list-header regexp
                                      auxdir1 nil nil
                                      merge-autostore-dir nil)
@@ -696,7 +703,7 @@ behavior."
                            (concat auxdir1 elt) nil nil))
             common))
     ))
-      
+
 
 ;; If file groups selected by patterns will ever be implemented, this
 ;; comparison function might become useful.
@@ -733,7 +740,7 @@ behavior."
 (defun ediff-prepare-meta-buffer (action-func meta-list
                                  meta-buffer-name redraw-function
                                  jobname &optional startup-hooks)
-  (let* ((meta-buffer-name 
+  (let* ((meta-buffer-name
          (ediff-unique-buffer-name meta-buffer-name "*"))
         (meta-buffer (get-buffer-create meta-buffer-name)))
     (ediff-with-current-buffer meta-buffer
@@ -748,7 +755,7 @@ behavior."
 
       ;; comes after ediff-meta-action-function is set
       (ediff-setup-meta-map)
-      
+
       (if (eq ediff-metajob-name 'ediff-registry)
          (progn
            (setq ediff-registry-buffer meta-buffer
@@ -762,14 +769,14 @@ behavior."
              ;; add meta-buffer to the list header
              (cons (cons meta-buffer (car meta-list))
                    (cdr meta-list))))
-       
+
       (or (eq meta-buffer ediff-registry-buffer)
          (setq ediff-session-registry
                (cons meta-buffer ediff-session-registry)))
-       
+
       ;; redraw-function uses ediff-meta-list
       (funcall redraw-function ediff-meta-list)
-      
+
       ;; set read-only/non-modified
       (setq buffer-read-only t)
       (set-buffer-modified-p nil)
@@ -788,15 +795,15 @@ behavior."
 
            (or (ediff-one-filegroup-metajob jobname)
                (ediff-draw-dir-diffs ediff-dir-difference-list))
-           (define-key 
+           (define-key
              ediff-meta-buffer-map "h" 'ediff-mark-for-hiding-at-pos)
            (define-key ediff-meta-buffer-map "x" 'ediff-hide-marked-sessions)
-           (define-key 
+           (define-key
              ediff-meta-buffer-map "m" 'ediff-mark-for-operation-at-pos)
            (define-key ediff-meta-buffer-map "u" nil)
            (define-key
              ediff-meta-buffer-map "um" 'ediff-unmark-all-for-operation)
-           (define-key 
+           (define-key
              ediff-meta-buffer-map "uh" 'ediff-unmark-all-for-hiding)
            (cond ((ediff-collect-diffs-metajob jobname)
                   (define-key
@@ -826,7 +833,7 @@ behavior."
 ;; Insert session status at point.  Status is either ?H (marked for hiding), or
 ;; ?I (hidden or invalid), or ?* (meaning marked for an operation; currently,
 ;; such op can only be checking for equality)), or SPC (meaning neither marked
-;; nor invalid) 
+;; nor invalid)
 (defun ediff-insert-session-status-in-meta-buffer (session)
   (insert
    (cond ((ediff-get-session-status session)) ; session has status: ?H, ?I, ?*
@@ -900,14 +907,14 @@ behavior."
        (map-extents 'delete-extent)   ; xemacs
        (mapcar 'delete-overlay (overlays-in 1 1))  ; emacs
        )
-      
+
       (insert (format ediff-meta-buffer-message
                      (ediff-abbrev-jobname ediff-metajob-name)))
 
       (setq regexp (ediff-get-group-regexp meta-list)
            merge-autostore-dir
            (ediff-get-group-merge-autostore-dir meta-list))
-      
+
       (cond ((ediff-collect-diffs-metajob)
             (insert
              "     P:\tcollect custom diffs of all marked sessions\n"))
@@ -938,7 +945,7 @@ behavior."
     ----------------------------------------------
 
 ")
-      
+
       ;; discard info on directories and regexp
       (setq meta-list (cdr meta-list)
            tmp-list meta-list)
@@ -951,7 +958,7 @@ behavior."
       (if empty
          (insert
           "     ******   ******   This session group has no members\n"))
-      
+
       ;; now organize file names like this:
       ;;     use-mark sizeA dateA  sizeB dateB  filename
       ;; make sure directories are displayed with a trailing slash.
@@ -1213,7 +1220,7 @@ Useful commands:
        (if (stringp dir3)
            (if (= (mod membership-code ediff-membership-code3) 0) ; dir3
                (let ((beg (point)))
-                 (insert (format " %-25s" 
+                 (insert (format " %-25s"
                                  (ediff-truncate-string-left
                                   (ediff-abbreviate-file-name
                                    (if (file-directory-p (concat dir3 file))
@@ -1327,7 +1334,7 @@ Useful commands:
       (ediff-show-meta-buffer
        ediff-parent-meta-buffer ediff-meta-session-number)
     (error "This session group has no parent")))
-  
+
 
 ;; argument is ignored
 (defun ediff-redraw-registry-buffer (&optional ignore)
@@ -1373,7 +1380,7 @@ Useful commands:
       (while registry-list
        (setq elt (car registry-list)
              registry-list (cdr registry-list))
-       
+
        (if (ediff-buffer-live-p elt)
            (if (ediff-with-current-buffer elt
                  (setq job-name ediff-metajob-name
@@ -1479,7 +1486,7 @@ Useful commands:
 ;;;      (error "Can't hide active session, %s" (buffer-name session-buf)))
          (t (ediff-set-session-status info ?H))))
   unmark)
-  
+
 
 (defun ediff-mark-for-operation-at-pos (unmark)
   "Mark session for a group operation.  With prefix arg, unmark."
@@ -1562,11 +1569,11 @@ Useful commands:
               (funcall operation elt sessionNum)))
            ;; The following goes into a session represented by a subdirectory
            ;; and applies operation to marked sessions there
-           ((and  (ediff-meta-session-p elt) 
-                  (ediff-buffer-live-p 
+           ((and  (ediff-meta-session-p elt)
+                  (ediff-buffer-live-p
                    (setq session-buf (ediff-get-session-buffer elt))))
             (setq numMarked
-                  (+ numMarked 
+                  (+ numMarked
                      (ediff-with-current-buffer session-buf
                        ;; pass meta-diff along
                        (setq ediff-meta-diff-buffer diff-buffer)
@@ -1602,7 +1609,7 @@ Useful commands:
             (insert-buffer custom-diff-buf)
             (insert "\n")))
          ;; if ediff session is not live, run diff directly on the files
-         ((memq metajob '(ediff-directories 
+         ((memq metajob '(ediff-directories
                           ediff-merge-directories
                           ediff-merge-directories-with-ancestor))
           ;; get diffs by calling shell command on ediff-custom-diff-program
@@ -1671,7 +1678,7 @@ all marked sessions must be active."
            ))
       (error "The patch buffer wasn't found"))))
 
-             
+
 ;; This function executes in meta buffer.  It knows where event happened.
 (defun ediff-filegroup-action ()
   "Execute appropriate action for a selected session."
@@ -1710,14 +1717,14 @@ all marked sessions must be active."
             ;; do ediff/ediff-merge on subdirectories
             (if (ediff-buffer-live-p session-buf)
                 (ediff-show-meta-buffer session-buf)
-              (setq regexp (read-string "Filter through regular expression: " 
+              (setq regexp (read-string "Filter through regular expression: "
                                         nil 'ediff-filtering-regexp-history))
               (ediff-directories-internal
                file1 file2 file3 regexp
                ediff-session-action-function
-               ediff-metajob-name 
+               ediff-metajob-name
                ;; make it update (car info) after startup
-               `(list (lambda () 
+               `(list (lambda ()
                         ;; child session group should know its parent
                         (setq ediff-parent-meta-buffer
                               (quote ,ediff-meta-buffer)
@@ -1732,13 +1739,13 @@ all marked sessions must be active."
                  (file-directory-p file1))
             (if (ediff-buffer-live-p session-buf)
                 (ediff-show-meta-buffer session-buf)
-              (setq regexp (read-string "Filter through regular expression: " 
+              (setq regexp (read-string "Filter through regular expression: "
                                         nil 'ediff-filtering-regexp-history))
               (ediff-directory-revisions-internal
                file1 regexp
                ediff-session-action-function ediff-metajob-name
                ;; make it update (car info) after startup
-               `(list (lambda () 
+               `(list (lambda ()
                         ;; child session group should know its parent and
                         ;; its number
                         (setq ediff-parent-meta-buffer
@@ -1762,8 +1769,8 @@ all marked sessions must be active."
                  "This session has no ancestor.  Merge without the ancestor? ")
                 (ediff-merge-files
                  file1 file2
-                 ;; provide startup hooks 
-                 `(list (lambda () 
+                 ;; provide startup hooks
+                 `(list (lambda ()
                             (add-hook
                              'ediff-after-quit-hook-internal
                              (lambda ()
@@ -1791,8 +1798,8 @@ all marked sessions must be active."
            ((ediff-one-filegroup-metajob)      ; needs 1 file arg
             (funcall ediff-session-action-function
                      file1
-                     ;; provide startup hooks 
-                     `(list (lambda () 
+                     ;; provide startup hooks
+                     `(list (lambda ()
                               (add-hook
                                'ediff-after-quit-hook-internal
                                (lambda ()
@@ -1820,8 +1827,8 @@ all marked sessions must be active."
            ((not (ediff-metajob3))      ; need 2 file args
             (funcall ediff-session-action-function
                      file1 file2
-                     ;; provide startup hooks 
-                     `(list (lambda () 
+                     ;; provide startup hooks
+                     `(list (lambda ()
                               (add-hook
                                'ediff-after-quit-hook-internal
                                (lambda ()
@@ -1849,8 +1856,8 @@ all marked sessions must be active."
            ((ediff-metajob3)      ; need 3 file args
             (funcall ediff-session-action-function
                      file1 file2 file3
-                     ;; arrange startup hooks 
-                     `(list (lambda () 
+                     ;; arrange startup hooks
+                     `(list (lambda ()
                               (add-hook
                                'ediff-after-quit-hook-internal
                                (lambda ()
@@ -1956,7 +1963,7 @@ all marked sessions must be active."
                 (set-window-buffer (selected-window) meta-buf)))
        ))
     (if (and (ediff-window-display-p)
-            (window-live-p 
+            (window-live-p
              (setq wind (ediff-get-visible-buffer-window meta-buf))))
        (progn
          (setq frame (window-frame wind))
@@ -2018,7 +2025,7 @@ all marked sessions must be active."
        ))
     (if (ediff-window-display-p)
        (progn
-         (setq frame 
+         (setq frame
                (window-frame
                 (ediff-get-visible-buffer-window ediff-registry-buffer)))
          (raise-frame frame)
@@ -2058,7 +2065,7 @@ all marked sessions must be active."
   (ediff-with-current-buffer (current-buffer)
     (if (ediff-buffer-live-p ediff-registry-buffer)
        (ediff-redraw-registry-buffer)
-      (ediff-prepare-meta-buffer 
+      (ediff-prepare-meta-buffer
        'ediff-registry-action
        ediff-session-registry
        "*Ediff Registry"
@@ -2066,7 +2073,7 @@ all marked sessions must be active."
        'ediff-registry))
     ))
 
-;; If meta-buf exists, it is redrawn along with parent. 
+;; If meta-buf exists, it is redrawn along with parent.
 ;; Otherwise, nothing happens.
 (defun ediff-cleanup-meta-buffer (meta-buffer)
   (if (ediff-buffer-live-p meta-buffer)
@@ -2134,7 +2141,7 @@ If this is a session registry buffer then just bury it."
     (if (ediff-buffer-live-p ediff-dir-diffs-buffer)
        (kill-buffer ediff-dir-diffs-buffer)))
   (kill-buffer buf))
-    
+
 
 ;; Obtain information on a meta record where the user clicked or typed
 ;; BUF is the buffer where this happened and POINT is the position
@@ -2356,4 +2363,5 @@ last-command-char is used to decide which action to take."
 ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
 ;;; End:
 
+;;; arch-tag: c8a76898-f96f-4d9c-be9d-129134017188
 ;;; ediff-mult.el ends here