diff lisp/ediff/ediff-mult.el @ 185:3d6bfa290dbd r20-3b19

Import from CVS: tag r20-3b19
author cvs
date Mon, 13 Aug 2007 09:55:28 +0200
parents bfd6434d15b3
children
line wrap: on
line diff
--- a/lisp/ediff/ediff-mult.el	Mon Aug 13 09:54:24 2007 +0200
+++ b/lisp/ediff/ediff-mult.el	Mon Aug 13 09:55:28 2007 +0200
@@ -155,10 +155,15 @@
 ;; history var to use for filtering groups
 (defvar ediff-filtering-regexp-history nil "")
 
-;; This has the form ((ctl-buf file1 file2) (stl-buf file1 file2) ...)
-;; If ctl-buf is nil, the file-pair wasn't processed yet. If it is
+;; 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
+;; . eq-status)) ...)
+;; If ctl-buf is nil, the file-pair hasn't processed yet. If it is
 ;; killed-buffer object, the file pair has been processed. If it is a live
-;; buffer, this means ediff is still working on the pair
+;; buffer, this means ediff is still working on the pair.
+;; Eq-status of a file is t if the file equals some other file in the same
+;; group.
 (ediff-defvar-local ediff-meta-list nil "")
 
 
@@ -204,40 +209,40 @@
 ;;; API for ediff-meta-list
 
 ;; group buffer/regexp
-(defun ediff-get-group-buffer (meta-list)
+(defsubst ediff-get-group-buffer (meta-list)
   (nth 0 (car meta-list)))
 
-(defun ediff-get-group-regexp (meta-list)
+(defsubst ediff-get-group-regexp (meta-list)
   (nth 1 (car meta-list)))
 ;; group objects
-(defun ediff-get-group-objA (meta-list)
+(defsubst ediff-get-group-objA (meta-list)
   (nth 2 (car meta-list)))
-(defun ediff-get-group-objB (meta-list)
+(defsubst ediff-get-group-objB (meta-list)
   (nth 3 (car meta-list)))
-(defun ediff-get-group-objC (meta-list)
+(defsubst ediff-get-group-objC (meta-list)
   (nth 4 (car meta-list)))
-(defun ediff-get-group-merge-autostore-dir (meta-list)
+(defsubst ediff-get-group-merge-autostore-dir (meta-list)
   (nth 5 (car meta-list)))
 
 ;; session buffer
-(defun ediff-get-session-buffer (elt)
+(defsubst ediff-get-session-buffer (elt)
   (nth 0 elt))
-(defun ediff-get-session-status (elt)
+(defsubst ediff-get-session-status (elt)
   (nth 1 elt))
-(defun ediff-set-session-status (session-info new-status)
+(defsubst ediff-set-session-status (session-info new-status)
   (setcar (cdr session-info) new-status))
 ;; session objects
-(defun ediff-get-session-objA (elt)
+(defsubst ediff-get-session-objA (elt)
   (nth 2 elt))
-(defun ediff-get-session-objB (elt)
+(defsubst ediff-get-session-objB (elt)
   (nth 3 elt))
-(defun ediff-get-session-objC (elt)
+(defsubst ediff-get-session-objC (elt)
   (nth 4 elt))
-(defun ediff-get-session-objA-name (elt)
+(defsubst ediff-get-session-objA-name (elt)
   (car (nth 2 elt)))
-(defun ediff-get-session-objB-name (elt)
+(defsubst ediff-get-session-objB-name (elt)
   (car (nth 3 elt)))
-(defun ediff-get-session-objC-name (elt)
+(defsubst ediff-get-session-objC-name (elt)
   (car (nth 4 elt)))
 ;; equality indicators
 (defsubst ediff-get-file-eqstatus (elt)
@@ -245,6 +250,15 @@
 (defsubst ediff-set-file-eqstatus (elt value)
   (setcar (cdr elt) value))
 
+;; 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)) 
+       (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))
+	   (file-directory-p (ediff-get-session-objC-name session-info)) t)))
+
 ;; set up the keymap in the meta buffer
 (defun ediff-setup-meta-map()
   (setq ediff-meta-buffer-map (make-sparse-keymap))
@@ -1122,22 +1136,33 @@
 	(marksym ?*)
 	(numMarked 0)
 	(sessionNum 0)
-	elt)
+	(diff-buffer ediff-meta-diff-buffer)
+	session-buf elt)
     (while meta-list
       (setq elt (car meta-list)
 	    meta-list (cdr meta-list)
 	    sessionNum (1+ sessionNum))
-      (if (eq (ediff-get-session-status elt) marksym)
-	  (save-excursion
-	    (setq numMarked (1+ numMarked))
-	    (funcall operation elt sessionNum))))
+      (cond ((eq (ediff-get-session-status elt) marksym)
+	     (save-excursion
+	       (setq numMarked (1+ numMarked))
+	       (funcall operation elt sessionNum)))
+	    ((and  (ediff-meta-session-p elt) 
+		   (ediff-buffer-live-p 
+		    (setq session-buf (ediff-get-session-buffer elt))))
+	     (setq numMarked
+		   (+ numMarked 
+		      (ediff-with-current-buffer session-buf
+			;; pass meta-diff along
+			(setq ediff-meta-diff-buffer diff-buffer)
+			;; collect diffs in child group
+			(ediff-operate-on-marked-sessions operation)))))))
     (ediff-update-meta-buffer grp-buf) ; just in case
     numMarked
     ))
 
 (defun ediff-append-custom-diff (session sessionNum)
   (or (ediff-collect-diffs-metajob)
-      (error "Sorry, I don't do this for everyone..."))
+      (error "Hmm, I'd hate to do it to you ..."))
   (let ((session-buf (ediff-get-session-buffer session))
 	(meta-diff-buff ediff-meta-diff-buffer)
 	(metajob ediff-metajob-name)
@@ -1256,9 +1281,7 @@
       ;; First handle sessions involving directories (which are themselves
       ;; session groups)
       ;; After that handle individual sessions
-      (cond ((and (file-directory-p file1) 
-		  (stringp file2) (file-directory-p file2)
-		  (if (stringp file3) (file-directory-p file1) t))
+      (cond ((ediff-meta-session-p info)
 	     ;; do ediff/ediff-merge on subdirectories
 	     (if (ediff-buffer-live-p session-buf)
 		 (ediff-show-meta-buffer session-buf)