aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Kifer2002-03-05 05:34:19 +0000
committerMichael Kifer2002-03-05 05:34:19 +0000
commitc3912d548fb1e6d97b07e47a91f2e0e1da5e27e2 (patch)
tree236a904f0ae2a5e2db9979d2f51dd2f731ee50b5
parent31ade731e6dc0c0a4c124f93a1f0018e245a27a2 (diff)
downloademacs-c3912d548fb1e6d97b07e47a91f2e0e1da5e27e2.tar.gz
emacs-c3912d548fb1e6d97b07e47a91f2e0e1da5e27e2.zip
* ediff-init.el: comments.
* ediff-hook.el: Got rid of autoloads. Not needed, since the hook is loaded. * ediff-mult.el (ediff-intersect-directories, ediff-prepare-meta-buffer,ediff-get-directory-files-under-revision): cleanup. (ediff-draw-dir-diffs): now supports the "C" command in directory difference buffer. (ediff-dir-diff-copy-file): new function that implements copying of files from one Ediff dir to another (ediff-bury-dir-diffs-buffer): kills the buffer instead. (ediff-append-custom-diff): better error msgs. * ediff-util.el (ediff-compute-custom-diffs-maybe): buglet fix. (ediff-inferior-compare-regions): Use ediff-clone-buffer-for-region-comparison. Better and simpler interface. * ediff.el (ediff-directories-internal): Cleanup. (ediff-clone-buffer-for-region-comparison): Better interface.
-rw-r--r--lisp/ChangeLog24
-rw-r--r--lisp/ediff-init.el3
-rw-r--r--lisp/ediff-mult.el366
-rw-r--r--lisp/ediff-util.el66
-rw-r--r--lisp/ediff.el64
5 files changed, 326 insertions, 197 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 59a852f2057..899d1a9fffa 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,27 @@
12002-03-05 Michael Kifer <kifer@cs.stonybrook.edu>
2
3 * ediff-init.el: comments.
4
5 * ediff-hook.el: Got rid of autoloads. Not needed, since the hook
6 is loaded.
7
8 * ediff-mult.el (ediff-intersect-directories,
9 ediff-prepare-meta-buffer,ediff-get-directory-files-under-revision):
10 cleanup.
11 (ediff-draw-dir-diffs): now supports the "C" command in directory
12 difference buffer.
13 (ediff-dir-diff-copy-file): new function that implements copying
14 of files from one Ediff dir to another
15 (ediff-bury-dir-diffs-buffer): kills the buffer instead.
16 (ediff-append-custom-diff): better error msgs.
17
18 * ediff-util.el (ediff-compute-custom-diffs-maybe): buglet fix.
19 (ediff-inferior-compare-regions): Use
20 ediff-clone-buffer-for-region-comparison. Better and simpler interface.
21
22 * ediff.el (ediff-directories-internal): Cleanup.
23 (ediff-clone-buffer-for-region-comparison): Better interface.
24
12002-03-04 Richard M. Stallman <rms@gnu.org> 252002-03-04 Richard M. Stallman <rms@gnu.org>
2 26
3 * emacs-lisp/easy-mmode.el (define-minor-mode): 27 * emacs-lisp/easy-mmode.el (define-minor-mode):
diff --git a/lisp/ediff-init.el b/lisp/ediff-init.el
index ae6d05ab40a..cfa1ce9da7d 100644
--- a/lisp/ediff-init.el
+++ b/lisp/ediff-init.el
@@ -344,12 +344,13 @@ It needs to be killed when we quit the session.")
344 (ediff-patch-metajob metajob) 344 (ediff-patch-metajob metajob)
345 ;; add more here 345 ;; add more here
346 )) 346 ))
347;; jobs suitable for the operation of collecting diffs into a multifile patch
347(defsubst ediff-collect-diffs-metajob (&optional metajob) 348(defsubst ediff-collect-diffs-metajob (&optional metajob)
348 (memq (or metajob ediff-metajob-name) 349 (memq (or metajob ediff-metajob-name)
349 '(ediff-directories 350 '(ediff-directories
350 ediff-directory-revisions
351 ediff-merge-directories 351 ediff-merge-directories
352 ediff-merge-directories-with-ancestor 352 ediff-merge-directories-with-ancestor
353 ediff-directory-revisions
353 ediff-merge-directory-revisions 354 ediff-merge-directory-revisions
354 ediff-merge-directory-revisions-with-ancestor 355 ediff-merge-directory-revisions-with-ancestor
355 ;; add more here 356 ;; add more here
diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el
index b8e576d72b7..83dde656a15 100644
--- a/lisp/ediff-mult.el
+++ b/lisp/ediff-mult.el
@@ -40,19 +40,20 @@
40;; 3. Provide a list of pairs or triples of file names (or buffers, 40;; 3. Provide a list of pairs or triples of file names (or buffers,
41;; depending on the particular Ediff operation you want to invoke) 41;; depending on the particular Ediff operation you want to invoke)
42;; in the following format: 42;; in the following format:
43;; (descriptor (obj1 obj2 obj3) (...) ...) 43;; (descriptor-header (nil nil (obj1 nil) (obj2 nil) (obj3 nil))
44;; (...) ...)
45;; The function ediff-make-new-meta-list-element can be used to create
46;; 2nd and subsequent elements of that list.
44;; Actually, the format of this list is pretty much up to the 47;; Actually, the format of this list is pretty much up to the
45;; developer. The only thing is that it must be a list of lists, 48;; developer. The only thing is that it must be a list of lists,
46;; and the first list must describe the meta session, and subsequent 49;; and the first list must describe the meta session, and subsequent
47;; elements must describe individual sessions. 50;; elements must describe individual sessions.
48;; This descriptor must be a list of two, three, or four elements (nil 51;; This descriptor-header must be a list of SIX elements (nil or
49;; or string). The function ediff-redraw-registry-buffer displays the 52;; string). The function ediff-redraw-registry-buffer displays the
50;; second through last of these in the registry buffer. 53;; 1st - 4th of these in the registry buffer.
51;; Also, keep in mind that the function ediff-prepare-meta-buffer 54;; Also, keep in mind that the function ediff-prepare-meta-buffer
52;; (which see) prepends the session group buffer to the descriptor, and 55;; (which see) prepends the session group buffer to the descriptor, so
53;; nil in front of each subsequent list (i.e., the above list 56;; the descriptor becomes 7-long.
54;; will become
55;; ((meta-buf descriptor) (nil obj1 obj2 obj3) (nil ...) ...)
56;; Ediff expects that your function (in 2 above) will arrange to 57;; Ediff expects that your function (in 2 above) will arrange to
57;; replace this prepended nil (via setcar) with the actual ediff 58;; replace this prepended nil (via setcar) with the actual ediff
58;; control buffer associated with an appropriate Ediff session. 59;; control buffer associated with an appropriate Ediff session.
@@ -225,9 +226,14 @@ buffers."
225 226
226;;; API for ediff-meta-list 227;;; API for ediff-meta-list
227 228
229;; A meta-list is either ediff-meta-list, which contains a header and the list
230;; of ediff sessions or ediff-dir-difference-list, which is a header followed
231;; by the list of differences among the directories (i.e., files that are not
232;; in all directories). The header is the same in all meta lists, but the rest
233;; is different.
228;; Structure of the meta-list: 234;; Structure of the meta-list:
229;; (HEADER SESSION1 SESSION2 ...) 235;; (HEADER SESSION1 SESSION2 ...)
230;; HEADER: (GROUP-BUF REGEXP OBJA OBJB OBJC SAVE-DIR) 236;; HEADER: (GROUP-BUF REGEXP OBJA OBJB OBJC SAVE-DIR COMPARISON-FUNC)
231;; OBJA - first directory 237;; OBJA - first directory
232;; OBJB - second directory 238;; OBJB - second directory
233;; OBJC - third directory 239;; OBJC - third directory
@@ -247,11 +253,14 @@ buffers."
247 (nth 4 (car meta-list))) 253 (nth 4 (car meta-list)))
248(defsubst ediff-get-group-merge-autostore-dir (meta-list) 254(defsubst ediff-get-group-merge-autostore-dir (meta-list)
249 (nth 5 (car meta-list))) 255 (nth 5 (car meta-list)))
256(defsubst ediff-get-group-comparison-func (meta-list)
257 (nth 6 (car meta-list)))
250 258
251;; ELT is a session meta descriptor (what is being preserved as 259;; ELT is a session meta descriptor (what is being preserved as
252;; 'ediff-meta-info) 260;; 'ediff-meta-info)
253;; The structure is: (SESSION-CTL-BUFFER STATUS OBJA OBJB OBJC) 261;; The structure is: (SESSION-CTL-BUFFER STATUS OBJA OBJB OBJC)
254;; STATUS is ?I, ?*, ?H 262;; STATUS is ?I (hidden or invalid), ?* (marked for operation), ?H (hidden)
263;; nil (nothing)
255;; OBJA/B/C is (FILENAME EQSTATUS) 264;; OBJA/B/C is (FILENAME EQSTATUS)
256;; EQSTATUS is ?= or nil (?= means that this file is equal to some other 265;; EQSTATUS is ?= or nil (?= means that this file is equal to some other
257;; file in this session) 266;; file in this session)
@@ -281,6 +290,20 @@ buffers."
281(defsubst ediff-set-file-eqstatus (elt value) 290(defsubst ediff-set-file-eqstatus (elt value)
282 (setcar (cdr elt) value)) 291 (setcar (cdr elt) value))
283 292
293;; Create a new element for the meta list out of obj1/2/3, which usually are
294;; files
295;;
296;; The first nil in such an is later replaced with the session buffer. The
297;; second nil is reserved for session status.
298;;
299;; Also, session objects A/B/C are turned into lists of the form (obj nil).
300;; This nill is a placeholder for eq-indicator. It is either nil or =.
301;; If it is discovered that this file is = to some other
302;; file in the same session, eq-indicator is changed to `='.
303;; Curently, the eq-indicator is used only for 2 and 3-file jobs.
304(defun ediff-make-new-meta-list-element (obj1 obj2 obj3)
305 (list nil nil (list obj1 nil) (list obj2 nil) (list obj3 nil)))
306
284;; The activity marker is either or + (active session, i.e., ediff is currently 307;; The activity marker is either or + (active session, i.e., ediff is currently
285;; run in it), or - (finished session, i.e., we've ran ediff in it and then 308;; run in it), or - (finished session, i.e., we've ran ediff in it and then
286;; exited). Return nil, if session is neither active nor finished 309;; exited). Return nil, if session is neither active nor finished
@@ -331,6 +354,7 @@ buffers."
331 ;; modify ediff-meta-buffer-map here 354 ;; modify ediff-meta-buffer-map here
332 (run-hooks 'ediff-meta-buffer-keymap-setup-hook)) 355 (run-hooks 'ediff-meta-buffer-keymap-setup-hook))
333 356
357
334(defun ediff-meta-mode () 358(defun ediff-meta-mode ()
335 "This mode controls all operations on Ediff session groups. 359 "This mode controls all operations on Ediff session groups.
336It is entered through one of the following commands: 360It is entered through one of the following commands:
@@ -363,6 +387,10 @@ Commands:
363(define-key ediff-dir-diffs-buffer-map "n" 'next-line) 387(define-key ediff-dir-diffs-buffer-map "n" 'next-line)
364(define-key ediff-dir-diffs-buffer-map "\C-?" 'previous-line) 388(define-key ediff-dir-diffs-buffer-map "\C-?" 'previous-line)
365(define-key ediff-dir-diffs-buffer-map "p" 'previous-line) 389(define-key ediff-dir-diffs-buffer-map "p" 'previous-line)
390(define-key ediff-dir-diffs-buffer-map "C" 'ediff-dir-diff-copy-file)
391(if ediff-emacs-p
392 (define-key ediff-dir-diffs-buffer-map [mouse-2] 'ediff-dir-diff-copy-file)
393 (define-key ediff-dir-diffs-buffer-map [button2] 'ediff-dir-diff-copy-file))
366(define-key ediff-dir-diffs-buffer-map [delete] 'previous-line) 394(define-key ediff-dir-diffs-buffer-map [delete] 'previous-line)
367(define-key ediff-dir-diffs-buffer-map [backspace] 'previous-line) 395(define-key ediff-dir-diffs-buffer-map [backspace] 'previous-line)
368 396
@@ -440,6 +468,16 @@ behavior."
440 (ediff-update-meta-buffer (current-buffer) 'must-redraw)) 468 (ediff-update-meta-buffer (current-buffer) 'must-redraw))
441 469
442 470
471;; These are used to encode membership of files in directory1/2/3
472;; Membership code of a file is a product of codes for the directories where
473;; this file is in
474(defvar ediff-membership-code1 2)
475(defvar ediff-membership-code2 3)
476(defvar ediff-membership-code3 5)
477(defvar ediff-product-of-memcodes (* ediff-membership-code1
478 ediff-membership-code2
479 ediff-membership-code3))
480
443;; DIR1, DIR2, DIR3 are directories. DIR3 can be nil. 481;; DIR1, DIR2, DIR3 are directories. DIR3 can be nil.
444;; OUTPUT-DIR is a directory for auto-storing the results of merge jobs. 482;; OUTPUT-DIR is a directory for auto-storing the results of merge jobs.
445;; Can be nil. 483;; Can be nil.
@@ -448,21 +486,23 @@ behavior."
448;; included in the intersection. However, a regular file that is a dir in dir3 486;; included in the intersection. However, a regular file that is a dir in dir3
449;; is included, since dir3 files are supposed to be ancestors for merging. 487;; is included, since dir3 files are supposed to be ancestors for merging.
450;; Returns a list of the form: 488;; Returns a list of the form:
451;; ((dir1 dir2 dir3) (f1 f2 f3) (f1 f2 f3) ...) 489;; (DIFF-LIST META-HEADER (f1 f2 f3) (f1 f2 f3) ...)
452;; dir3, f3 can be nil if intersecting only 2 directories. 490;; dir3, f3 can be nil if intersecting only 2 directories.
453;; If COMPARISON-FUNC is given, use it. Otherwise, use string= 491;; If COMPARISON-FUNC is given, use it. Otherwise, use string=
454;; DIFF-VAR contains the name of the variable in which to return the 492;; DIFF-LIST is of the form:
455;; difference list (which represents the differences among the contents of 493;; (META-HEADER (file . num) (file . num)...)
456;; directories). The diff list is of the form:
457;; ((dir1 dir2 dir3) (file . num) (file . num)...)
458;; where num encodes the set of dirs where the file is found: 494;; where num encodes the set of dirs where the file is found:
459;; 2 - only dir1; 3 - only dir2; 5 - only dir3; 6 - dir1&2; 10 - dir1&3; etc. 495;; 2 - only dir1; 3 - only dir2; 5 - only dir3; 6 - dir1&2; 10 - dir1&3; etc.
496;; META-HEADER is of the form
497;; It contains the meta info about this ediff operation
498;; (regexp dir1 dir2 dir3 merge-auto-store-dir comparison-func)
499;; Later the meta-buffer is prepended to this list.
460(defun ediff-intersect-directories (jobname 500(defun ediff-intersect-directories (jobname
461 diff-var regexp dir1 dir2 501 regexp dir1 dir2
462 &optional 502 &optional
463 dir3 merge-autostore-dir comparison-func) 503 dir3 merge-autostore-dir comparison-func)
464 (setq comparison-func (or comparison-func 'string=)) 504 (setq comparison-func (or comparison-func 'string=))
465 (let (lis1 lis2 lis3 common auxdir1 auxdir2 auxdir3 difflist) 505 (let (lis1 lis2 lis3 common auxdir1 auxdir2 auxdir3 common-part difflist)
466 506
467 (setq auxdir1 (file-name-as-directory dir1) 507 (setq auxdir1 (file-name-as-directory dir1)
468 lis1 (directory-files auxdir1 nil regexp) 508 lis1 (directory-files auxdir1 nil regexp)
@@ -514,39 +554,56 @@ behavior."
514 (setq difflist (mapcar (lambda (elt) (cons elt 1)) difflist)) 554 (setq difflist (mapcar (lambda (elt) (cons elt 1)) difflist))
515 555
516 ;; check for files belonging to lis1/2/3 556 ;; check for files belonging to lis1/2/3
557 ;; Each elt is of the norm (file . number)
558 ;; Number encodes the directories to which file belongs.
559 ;; It is a product of a subset of ediff-membership-code1=2,
560 ;; ediff-membership-code2=3, and ediff-membership-code3=5.
561 ;; If file belongs to dir 1 only, the membership code is 2.
562 ;; If it is in dir1 and dir3, then the membership code is 2*5=10;
563 ;; if it is in dir1 and dir2, then the membership code is 2*3=6, etc.
517 (mapcar (lambda (elt) 564 (mapcar (lambda (elt)
518 (if (member (car elt) lis1) 565 (if (member (car elt) lis1)
519 (setcdr elt (* (cdr elt) 2))) 566 (setcdr elt (* (cdr elt) ediff-membership-code1)))
520 (if (member (car elt) lis2) 567 (if (member (car elt) lis2)
521 (setcdr elt (* (cdr elt) 3))) 568 (setcdr elt (* (cdr elt) ediff-membership-code2)))
522 (if (member (car elt) lis3) 569 (if (member (car elt) lis3)
523 (setcdr elt (* (cdr elt) 5))) 570 (setcdr elt (* (cdr elt) ediff-membership-code3)))
524 ) 571 )
525 difflist) 572 difflist)
526 (setq difflist (cons (list regexp auxdir1 auxdir2 auxdir3) difflist)) 573 (setq difflist (cons
574 ;; diff metalist header
575 (list regexp
576 auxdir1 auxdir2 auxdir3
577 merge-autostore-dir
578 comparison-func)
579 difflist))
527 580
528 ;; return the difference list back to the calling function 581 (setq common-part
529 (set diff-var difflist) 582 (cons
530 583 ;; metalist header
584 (list regexp
585 auxdir1 auxdir2 auxdir3
586 merge-autostore-dir
587 comparison-func)
588 (mapcar
589 (lambda (elt)
590 (ediff-make-new-meta-list-element
591 (concat auxdir1 elt)
592 (concat auxdir2 elt)
593 (if lis3
594 (progn
595 ;; The following is done because: In merging with
596 ;; ancestor, we don't intersect with lis3. So, it is
597 ;; possible that elt is a file in auxdir1/2 but a
598 ;; directory in auxdir3 Or elt may not exist in auxdir3 at
599 ;; all. In the first case, we add a slash at the end. In
600 ;; the second case, we insert nil.
601 (setq elt (ediff-add-slash-if-directory auxdir3 elt))
602 (if (file-exists-p (concat auxdir3 elt))
603 (concat auxdir3 elt))))))
604 common)))
531 ;; return result 605 ;; return result
532 (cons (list regexp auxdir1 auxdir2 auxdir3 merge-autostore-dir) 606 (cons common-part difflist)
533 (mapcar
534 (lambda (elt)
535 (list (concat auxdir1 elt)
536 (concat auxdir2 elt)
537 (if lis3
538 (progn
539 ;; The following is done because:
540 ;; In merging with ancestor, we don't intersect
541 ;; with lis3. So, it is possible that elt is a
542 ;; file in auxdir1/2 but a directory in auxdir3
543 ;; Or elt may not exist in auxdir3 at all.
544 ;; In the first case, we add a slash at the end.
545 ;; In the second case, we insert nil.
546 (setq elt (ediff-add-slash-if-directory auxdir3 elt))
547 (if (file-exists-p (concat auxdir3 elt))
548 (concat auxdir3 elt))))))
549 common))
550 )) 607 ))
551 608
552;; find directory files that are under revision. Include subdirectories, since 609;; find directory files that are under revision. Include subdirectories, since
@@ -592,9 +649,13 @@ behavior."
592 (setq common (sort (ediff-copy-list common) 'string-lessp)) 649 (setq common (sort (ediff-copy-list common) 'string-lessp))
593 650
594 ;; return result 651 ;; return result
595 (cons (list regexp auxdir1 nil nil merge-autostore-dir) 652 (cons
596 (mapcar (lambda (elt) (list (concat auxdir1 elt) nil nil)) 653 ;; header -- has 6 elements. Meta buffer is prepended later by
597 common)) 654 ;; ediff-prepare-meta-buffer
655 (list regexp auxdir1 nil nil merge-autostore-dir nil)
656 (mapcar (lambda (elt) (ediff-make-new-meta-list-element
657 (concat auxdir1 elt) nil nil))
658 common))
598 )) 659 ))
599 660
600 661
@@ -657,30 +718,11 @@ behavior."
657 ;; meta-buffs. 718 ;; meta-buffs.
658 (define-key 719 (define-key
659 ediff-meta-buffer-map "M" 'ediff-show-meta-buff-from-registry)) 720 ediff-meta-buffer-map "M" 'ediff-show-meta-buff-from-registry))
660 ;; Initialize the meta list -- don't do this for registry. 721 ;; Initialize the meta list -- we don't do this for registry.
661 ;;
662 ;; We prepend '(nil nil) to all elts of meta-list, except the first.
663 ;; The first nil will later be replaced by the session buffer. The
664 ;; second is reserved for session status.
665 ;;
666 ;; (car ediff-meta-list) gets cons'ed with the session group buffer.
667 ;; Also, session objects A/B/C are turned into lists of the form
668 ;; (obj eq-indicator). Eq-indicator is either nil or =. Initialized to
669 ;; nil. If later it is discovered that this file is = to some other
670 ;; file in the same session, eq-indicator is changed to `='.
671 ;; For now, the eq-indicator is used only for 2 and 3-file jobs.
672 (setq ediff-meta-list 722 (setq ediff-meta-list
723 ;; add meta-buffer to the list header
673 (cons (cons meta-buffer (car meta-list)) 724 (cons (cons meta-buffer (car meta-list))
674 (mapcar 725 (cdr meta-list))))
675 (lambda (elt)
676 (cons nil
677 (cons nil
678 ;; convert each obj to (obj nil),
679 ;; where nil is the initial value
680 ;; for eq-indicator -- see above
681 (mapcar (lambda (obj) (list obj nil))
682 elt))))
683 (cdr meta-list)))))
684 726
685 (or (eq meta-buffer ediff-registry-buffer) 727 (or (eq meta-buffer ediff-registry-buffer)
686 (setq ediff-session-registry 728 (setq ediff-session-registry
@@ -1048,52 +1090,46 @@ behavior."
1048 (if dir3 (insert "*** Directory C: " dir3 "\n")) 1090 (if dir3 (insert "*** Directory C: " dir3 "\n"))
1049 (insert "\n"))) 1091 (insert "\n")))
1050 1092
1051(defun ediff-draw-dir-diffs (diff-list) 1093(defun ediff-draw-dir-diffs (diff-list &optional buf-name)
1052 (if (null diff-list) (error "Lost difference info on these directories")) 1094 (if (null diff-list) (error "Lost difference info on these directories"))
1053 (let* ((buf-name (ediff-unique-buffer-name 1095 (setq buf-name
1054 "*Ediff File Group Differences" "*")) 1096 (or buf-name
1055 (regexp (ediff-get-group-regexp diff-list)) 1097 (ediff-unique-buffer-name "*Ediff File Group Differences" "*")))
1098 (let* ((regexp (ediff-get-group-regexp diff-list))
1056 (dir1 (ediff-abbreviate-file-name (ediff-get-group-objA diff-list))) 1099 (dir1 (ediff-abbreviate-file-name (ediff-get-group-objA diff-list)))
1057 (dir2 (ediff-abbreviate-file-name (ediff-get-group-objB diff-list))) 1100 (dir2 (ediff-abbreviate-file-name (ediff-get-group-objB diff-list)))
1058 (dir3 (ediff-get-group-objC diff-list)) 1101 (dir3 (ediff-get-group-objC diff-list))
1059 (dir3 (if (stringp dir3) (ediff-abbreviate-file-name dir3))) 1102 (dir3 (if (stringp dir3) (ediff-abbreviate-file-name dir3)))
1060 (meta-buf (ediff-get-group-buffer diff-list)) 1103 (meta-buf (ediff-get-group-buffer diff-list))
1061 (underline (make-string 26 ?-)) 1104 (underline (make-string 26 ?-))
1062 file code 1105 file membership-code saved-point
1063 buffer-read-only) 1106 buffer-read-only)
1064 ;; skip the directory part 1107 ;; skip the directory part
1065 (setq diff-list (cdr diff-list)) 1108 (setq diff-list (cdr diff-list))
1066 (setq ediff-dir-diffs-buffer (get-buffer-create buf-name)) 1109 (setq ediff-dir-diffs-buffer (get-buffer-create buf-name))
1067 (ediff-with-current-buffer ediff-dir-diffs-buffer 1110 (ediff-with-current-buffer ediff-dir-diffs-buffer
1111 (setq saved-point (point))
1068 (use-local-map ediff-dir-diffs-buffer-map) 1112 (use-local-map ediff-dir-diffs-buffer-map)
1069 (erase-buffer) 1113 (erase-buffer)
1070 (setq ediff-meta-buffer meta-buf) 1114 (setq ediff-meta-buffer meta-buf)
1071 (insert "\t\t*** Directory Differences ***\n") 1115 (insert "\t\t*** Directory Differences ***\n")
1072 (insert " 1116 (insert "
1073Useful commands: 1117Useful commands:
1074 `q': hide this buffer 1118 C,button2: over file name -- copy this file to directory that doesn't have it
1075 n,SPC: next line 1119 q: hide this buffer
1076 p,DEL: previous line\n\n") 1120 n,SPC: next line
1077 1121 p,DEL: previous line\n\n")
1122
1123 (insert (format "\n*** Directory A: %s\n" dir1))
1124 (if dir2 (insert (format "*** Directory B: %s\n" dir2)))
1125 (if dir3 (insert (format "*** Directory C: %s\n" dir3)))
1078 (if (and (stringp regexp) (> (length regexp) 0)) 1126 (if (and (stringp regexp) (> (length regexp) 0))
1079 (insert 1127 (insert
1080 (format "\n*** Filter-through regular expression: %s\n" regexp))) 1128 (format "*** Filter-through regular expression: %s\n" regexp)))
1081 (insert "\n") 1129 (insert "\n")
1082 (insert (format "\n%-27s%-26s" 1130 (insert (format "\n%-27s%-26s" "Directory A" "Directory B"))
1083 (ediff-truncate-string-left
1084 (ediff-abbreviate-file-name
1085 (file-name-as-directory dir1))
1086 25)
1087 (ediff-truncate-string-left
1088 (ediff-abbreviate-file-name
1089 (file-name-as-directory dir2))
1090 25)))
1091 (if dir3 1131 (if dir3
1092 (insert (format " %-25s\n" 1132 (insert (format " %-25s\n" "Directory C"))
1093 (ediff-truncate-string-left
1094 (ediff-abbreviate-file-name
1095 (file-name-as-directory dir3))
1096 25)))
1097 (insert "\n")) 1133 (insert "\n"))
1098 (insert (format "%s%s" underline underline)) 1134 (insert (format "%s%s" underline underline))
1099 (if (stringp dir3) 1135 (if (stringp dir3)
@@ -1105,47 +1141,64 @@ Useful commands:
1105 1141
1106 (while diff-list 1142 (while diff-list
1107 (setq file (car (car diff-list)) 1143 (setq file (car (car diff-list))
1108 code (cdr (car diff-list)) 1144 membership-code (cdr (car diff-list))
1109 diff-list (cdr diff-list)) 1145 diff-list (cdr diff-list))
1110 (if (= (mod code 2) 0) ; dir1 1146 (if (= (mod membership-code ediff-membership-code1) 0) ; dir1
1111 (insert (format "%-27s" 1147 (let ((beg (point)))
1112 (ediff-truncate-string-left 1148 (insert (format "%-27s"
1113 (ediff-abbreviate-file-name 1149 (ediff-truncate-string-left
1114 (if (file-directory-p (concat dir1 file)) 1150 (ediff-abbreviate-file-name
1115 (file-name-as-directory file) 1151 (if (file-directory-p (concat dir1 file))
1116 file)) 1152 (file-name-as-directory file)
1117 24))) 1153 file))
1154 24)))
1155 ;; format of meta info in the dir-diff-buffer:
1156 ;; (filename-tail filename-full otherdir1 otherdir2 otherdir3)
1157 (ediff-set-meta-overlay
1158 beg (point)
1159 (list meta-buf file (concat dir1 file) dir1 dir2 dir3)))
1118 (insert (format "%-27s" "---"))) 1160 (insert (format "%-27s" "---")))
1119 (if (= (mod code 3) 0) ; dir2 1161 (if (= (mod membership-code ediff-membership-code2) 0) ; dir2
1120 (insert (format "%-26s" 1162 (let ((beg (point)))
1121 (ediff-truncate-string-left 1163 (insert (format "%-26s"
1122 (ediff-abbreviate-file-name 1164 (ediff-truncate-string-left
1123 (if (file-directory-p (concat dir2 file)) 1165 (ediff-abbreviate-file-name
1124 (file-name-as-directory file) 1166 (if (file-directory-p (concat dir2 file))
1125 file)) 1167 (file-name-as-directory file)
1126 24))) 1168 file))
1169 24)))
1170 (ediff-set-meta-overlay
1171 beg (point)
1172 (list meta-buf file (concat dir2 file) dir1 dir2 dir3)))
1127 (insert (format "%-26s" "---"))) 1173 (insert (format "%-26s" "---")))
1128 (if (stringp dir3) 1174 (if (stringp dir3)
1129 (if (= (mod code 5) 0) ; dir3 1175 (if (= (mod membership-code ediff-membership-code3) 0) ; dir3
1130 (insert (format " %-25s" 1176 (let ((beg (point)))
1131 (ediff-truncate-string-left 1177 (insert (format " %-25s"
1132 (ediff-abbreviate-file-name 1178 (ediff-truncate-string-left
1133 (if (file-directory-p (concat dir3 file)) 1179 (ediff-abbreviate-file-name
1134 (file-name-as-directory file) 1180 (if (file-directory-p (concat dir3 file))
1135 file)) 1181 (file-name-as-directory file)
1136 24))) 1182 file))
1183 24)))
1184 (ediff-set-meta-overlay
1185 beg (point)
1186 (list meta-buf file (concat dir3 file) dir1 dir2 dir3)))
1137 (insert (format " %-25s" "---")))) 1187 (insert (format " %-25s" "---"))))
1138 (insert "\n")) 1188 (insert "\n"))
1139 (setq buffer-read-only t) 1189 (setq buffer-read-only t)
1140 (set-buffer-modified-p nil)) ; eval in diff buffer 1190 (set-buffer-modified-p nil)
1191 (goto-char saved-point)) ; end eval in diff buffer
1141 )) 1192 ))
1142 1193
1143(defun ediff-bury-dir-diffs-buffer () 1194(defun ediff-bury-dir-diffs-buffer ()
1144 "Bury the directory difference buffer. Display the meta buffer instead." 1195 "Bury the directory difference buffer. Display the meta buffer instead."
1145 (interactive) 1196 (interactive)
1197 ;; ediff-meta-buffer is set in ediff-draw-dir-diffs so the directory
1198 ;; difference buffer remembers the meta buffer
1146 (let ((buf ediff-meta-buffer) 1199 (let ((buf ediff-meta-buffer)
1147 wind) 1200 wind)
1148 (bury-buffer) 1201 (ediff-kill-buffer-carefully ediff-dir-diffs-buffer)
1149 (if (setq wind (ediff-get-visible-buffer-window buf)) 1202 (if (setq wind (ediff-get-visible-buffer-window buf))
1150 (select-window wind) 1203 (select-window wind)
1151 (set-window-buffer (selected-window) buf)))) 1204 (set-window-buffer (selected-window) buf))))
@@ -1164,6 +1217,70 @@ Useful commands:
1164 (set-window-buffer (selected-window) buf) 1217 (set-window-buffer (selected-window) buf)
1165 (goto-char (point-min)))) 1218 (goto-char (point-min))))
1166 1219
1220;; Format of meta info in dir-diff-buffer:
1221;; (filename-tail filename-full otherdir1 otherdir2)
1222(defun ediff-dir-diff-copy-file ()
1223 "Copy file described at point to directories where this file is missing."
1224 (interactive)
1225 (let* ((pos (ediff-event-point last-command-event))
1226 (info (ediff-get-meta-info (current-buffer) pos 'noerror))
1227 (meta-buf (car info))
1228 (file-tail (nth 1 info))
1229 (file-abs (nth 2 info))
1230 (otherdir1 (nth 3 info))
1231 (otherfile1 (if otherdir1 (concat otherdir1 file-tail)))
1232 (otherdir2 (nth 4 info))
1233 (otherfile2 (if otherdir2 (concat otherdir2 file-tail)))
1234 (otherdir3 (nth 5 info))
1235 (otherfile3 (if otherdir3 (concat otherdir3 file-tail)))
1236 meta-list dir-diff-list
1237 )
1238 (if (null info)
1239 (error "No file suitable for copying described at this location"))
1240 (ediff-with-current-buffer meta-buf
1241 (setq meta-list ediff-meta-list
1242 dir-diff-list ediff-dir-difference-list))
1243
1244 ;; copy file to directories where it doesn't exist, update
1245 ;; ediff-dir-difference-list and redisplay
1246 (mapcar
1247 (lambda (otherfile-struct)
1248 (let ((otherfile (car otherfile-struct))
1249 (file-mem-code (cdr otherfile-struct)))
1250 (if otherfile
1251 (or (file-exists-p otherfile)
1252 (if (y-or-n-p
1253 (format "Copy %s to %s ? " file-abs otherfile))
1254 (let* ((file-diff-record (assoc file-tail dir-diff-list))
1255 (new-mem-code
1256 (* (cdr file-diff-record) file-mem-code)))
1257 (copy-file file-abs otherfile)
1258 (setcdr file-diff-record new-mem-code)
1259 (ediff-draw-dir-diffs dir-diff-list (buffer-name))
1260 (sit-for 0)
1261 ;; if file is in all three dirs or in two dirs and only
1262 ;; two dirs are involved, delete this file's record
1263 (if (or (= new-mem-code ediff-product-of-memcodes)
1264 (and (> new-mem-code ediff-membership-code3)
1265 (null otherfile3)))
1266 (delq file-diff-record dir-diff-list))
1267 ))))
1268 ))
1269 ;; 2,3,5 are numbers used to encode membership of a file in
1270 ;; dir1/2/3. See ediff-intersect-directories.
1271 (list (cons otherfile1 2) (cons otherfile2 3) (cons otherfile3 5)))
1272
1273 (if (and (file-exists-p otherfile1)
1274 (file-exists-p otherfile2)
1275 (or (not otherfile3) (file-exists-p otherfile3)))
1276 ;; update ediff-meta-list by direct modification
1277 (nconc meta-list
1278 (list (ediff-make-new-meta-list-element
1279 otherfile1 otherfile2 otherfile3)))
1280 )
1281 (ediff-update-meta-buffer meta-buf 'must-redraw)
1282 ))
1283
1167(defun ediff-up-meta-hierarchy () 1284(defun ediff-up-meta-hierarchy ()
1168 "Go to the parent session group buffer." 1285 "Go to the parent session group buffer."
1169 (interactive) 1286 (interactive)
@@ -1404,6 +1521,8 @@ Useful commands:
1404 (save-excursion 1521 (save-excursion
1405 (setq numMarked (1+ numMarked)) 1522 (setq numMarked (1+ numMarked))
1406 (funcall operation elt sessionNum))) 1523 (funcall operation elt sessionNum)))
1524 ;; The following goes into a session represented by a subdirectory
1525 ;; and applies operation to marked sessions there
1407 ((and (ediff-meta-session-p elt) 1526 ((and (ediff-meta-session-p elt)
1408 (ediff-buffer-live-p 1527 (ediff-buffer-live-p
1409 (setq session-buf (ediff-get-session-buffer elt)))) 1528 (setq session-buf (ediff-get-session-buffer elt))))
@@ -1420,7 +1539,7 @@ Useful commands:
1420 1539
1421(defun ediff-append-custom-diff (session sessionNum) 1540(defun ediff-append-custom-diff (session sessionNum)
1422 (or (ediff-collect-diffs-metajob) 1541 (or (ediff-collect-diffs-metajob)
1423 (error "Hmm, I'd hate to do it to you ...")) 1542 (error "Can't compute multifile patch in this context"))
1424 (let ((session-buf (ediff-get-session-buffer session)) 1543 (let ((session-buf (ediff-get-session-buffer session))
1425 (meta-diff-buff ediff-meta-diff-buffer) 1544 (meta-diff-buff ediff-meta-diff-buffer)
1426 (metajob ediff-metajob-name) 1545 (metajob ediff-metajob-name)
@@ -1433,14 +1552,17 @@ Useful commands:
1433 (setq custom-diff-buf ediff-custom-diff-buffer))))) 1552 (setq custom-diff-buf ediff-custom-diff-buffer)))))
1434 1553
1435 (or (ediff-buffer-live-p meta-diff-buff) 1554 (or (ediff-buffer-live-p meta-diff-buff)
1436 (error "Ediff: something wrong--no multiple diffs buffer")) 1555 (error "Ediff: something wrong--killed multiple diff's buffer"))
1437 1556
1438 (cond ((ediff-buffer-live-p custom-diff-buf) 1557 (cond ((ediff-buffer-live-p custom-diff-buf)
1558 ;; for live session buffers we do them first because the user may
1559 ;; have changed them with respect to the underlying files
1439 (save-excursion 1560 (save-excursion
1440 (set-buffer meta-diff-buff) 1561 (set-buffer meta-diff-buff)
1441 (goto-char (point-max)) 1562 (goto-char (point-max))
1442 (insert-buffer custom-diff-buf) 1563 (insert-buffer custom-diff-buf)
1443 (insert "\n"))) 1564 (insert "\n")))
1565 ;; if ediff session is not live, run diff directly on the files
1444 ((memq metajob '(ediff-directories 1566 ((memq metajob '(ediff-directories
1445 ediff-merge-directories 1567 ediff-merge-directories
1446 ediff-merge-directories-with-ancestor)) 1568 ediff-merge-directories-with-ancestor))
@@ -1460,7 +1582,8 @@ Useful commands:
1460 (insert-buffer tmp-buf) 1582 (insert-buffer tmp-buf)
1461 (insert "\n"))) 1583 (insert "\n")))
1462 (t 1584 (t
1463 (error "Can't make context diff for Session %d" sessionNum ))) 1585 (ediff-kill-buffer-carefully meta-diff-buff)
1586 (error "Session %d compares versions of file. Such session must be active to enable multifile patch collection" sessionNum )))
1464 )) 1587 ))
1465 1588
1466(defun ediff-collect-custom-diffs () 1589(defun ediff-collect-custom-diffs ()
@@ -1475,6 +1598,7 @@ all marked sessions must be active."
1475 (get-buffer-create 1598 (get-buffer-create
1476 (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*")))) 1599 (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*"))))
1477 (ediff-with-current-buffer ediff-meta-diff-buffer 1600 (ediff-with-current-buffer ediff-meta-diff-buffer
1601 (setq buffer-read-only nil)
1478 (erase-buffer)) 1602 (erase-buffer))
1479 (if (> (ediff-operate-on-marked-sessions 'ediff-append-custom-diff) 0) 1603 (if (> (ediff-operate-on-marked-sessions 'ediff-append-custom-diff) 0)
1480 ;; did something 1604 ;; did something
diff --git a/lisp/ediff-util.el b/lisp/ediff-util.el
index e1dbdc7f336..be9fbb424d3 100644
--- a/lisp/ediff-util.el
+++ b/lisp/ediff-util.el
@@ -3302,6 +3302,7 @@ Without an argument, it saves customized diff argument, if available
3302 ) 3302 )
3303 (save-buffer))) 3303 (save-buffer)))
3304 3304
3305;; This function operates only from an ediff control buffer
3305(defun ediff-compute-custom-diffs-maybe () 3306(defun ediff-compute-custom-diffs-maybe ()
3306 (let ((buf-A-file-name (buffer-file-name ediff-buffer-A)) 3307 (let ((buf-A-file-name (buffer-file-name ediff-buffer-A))
3307 (buf-B-file-name (buffer-file-name ediff-buffer-B)) 3308 (buf-B-file-name (buffer-file-name ediff-buffer-B))
@@ -3317,6 +3318,9 @@ Without an argument, it saves customized diff argument, if available
3317 (setq ediff-custom-diff-buffer 3318 (setq ediff-custom-diff-buffer
3318 (get-buffer-create 3319 (get-buffer-create
3319 (ediff-unique-buffer-name "*ediff-custom-diff" "*")))) 3320 (ediff-unique-buffer-name "*ediff-custom-diff" "*"))))
3321 (ediff-with-current-buffer ediff-custom-diff-buffer
3322 (setq buffer-read-only nil)
3323 (erase-buffer))
3320 (ediff-exec-process 3324 (ediff-exec-process
3321 ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize 3325 ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize
3322 ediff-custom-diff-options file-A file-B) 3326 ediff-custom-diff-options file-A file-B)
@@ -3373,6 +3377,7 @@ Ediff Control Panel to restore highlighting."
3373 3377
3374 (cond ((ediff-merge-job) 3378 (cond ((ediff-merge-job)
3375 (setq bufB ediff-buffer-C) 3379 (setq bufB ediff-buffer-C)
3380 ;; ask which buffer to compare to the merge buffer
3376 (while (cond ((eq answer ?A) 3381 (while (cond ((eq answer ?A)
3377 (setq bufA ediff-buffer-A 3382 (setq bufA ediff-buffer-A
3378 possibilities '(?B)) 3383 possibilities '(?B))
@@ -3387,10 +3392,12 @@ Ediff Control Panel to restore highlighting."
3387 (sit-for 2) 3392 (sit-for 2)
3388 t)) 3393 t))
3389 (let ((cursor-in-echo-area t)) 3394 (let ((cursor-in-echo-area t))
3390 (message "Which buffer to compare to the merge buffer (A/B)? ") 3395 (message
3396 "Which buffer to compare to the merge buffer (A or B)? ")
3391 (setq answer (capitalize (read-char-exclusive)))))) 3397 (setq answer (capitalize (read-char-exclusive))))))
3392 3398
3393 ((ediff-3way-comparison-job) 3399 ((ediff-3way-comparison-job)
3400 ;; ask which two buffers to compare
3394 (while (cond ((memq answer possibilities) 3401 (while (cond ((memq answer possibilities)
3395 (setq possibilities (delq answer possibilities)) 3402 (setq possibilities (delq answer possibilities))
3396 (setq bufA 3403 (setq bufA
@@ -3407,7 +3414,7 @@ Ediff Control Panel to restore highlighting."
3407 t)) 3414 t))
3408 (let ((cursor-in-echo-area t)) 3415 (let ((cursor-in-echo-area t))
3409 (message "Enter the 1st buffer you want to compare (%s): " 3416 (message "Enter the 1st buffer you want to compare (%s): "
3410 (mapconcat 'char-to-string possibilities "/")) 3417 (mapconcat 'char-to-string possibilities " or "))
3411 (setq answer (capitalize (read-char-exclusive))))) 3418 (setq answer (capitalize (read-char-exclusive)))))
3412 (setq answer "") ; silence error msg 3419 (setq answer "") ; silence error msg
3413 (while (cond ((memq answer possibilities) 3420 (while (cond ((memq answer possibilities)
@@ -3433,9 +3440,9 @@ Ediff Control Panel to restore highlighting."
3433 bufB ediff-buffer-B 3440 bufB ediff-buffer-B
3434 possibilities nil))) 3441 possibilities nil)))
3435 3442
3443 (setq bufA (ediff-clone-buffer-for-region-comparison
3444 (buffer-name bufA) "-Region.A-"))
3436 (ediff-with-current-buffer bufA 3445 (ediff-with-current-buffer bufA
3437 (or (mark t)
3438 (error "You forgot to specify a region in buffer %s" (buffer-name)))
3439 (setq begA (region-beginning) 3446 (setq begA (region-beginning)
3440 endA (region-end)) 3447 endA (region-end))
3441 (goto-char begA) 3448 (goto-char begA)
@@ -3445,9 +3452,10 @@ Ediff Control Panel to restore highlighting."
3445 (end-of-line) 3452 (end-of-line)
3446 (or (eobp) (forward-char)) ; include the newline char 3453 (or (eobp) (forward-char)) ; include the newline char
3447 (setq endA (point))) 3454 (setq endA (point)))
3455
3456 (setq bufB (ediff-clone-buffer-for-region-comparison
3457 (buffer-name bufB) "-Region.B-"))
3448 (ediff-with-current-buffer bufB 3458 (ediff-with-current-buffer bufB
3449 (or (mark t)
3450 (error "You forgot to specify a region in buffer %s" (buffer-name)))
3451 (setq begB (region-beginning) 3459 (setq begB (region-beginning)
3452 endB (region-end)) 3460 endB (region-end))
3453 (goto-char begB) 3461 (goto-char begB)
@@ -3458,52 +3466,6 @@ Ediff Control Panel to restore highlighting."
3458 (or (eobp) (forward-char)) ; include the newline char 3466 (or (eobp) (forward-char)) ; include the newline char
3459 (setq endB (point))) 3467 (setq endB (point)))
3460 3468
3461 (ediff-unselect-and-select-difference
3462 ediff-current-difference 'unselect-only)
3463 (ediff-paint-background-regions 'unhighlight)
3464
3465 (ediff-with-current-buffer bufA
3466 (goto-char begA)
3467 (set-mark endA)
3468 (narrow-to-region begA endA)
3469 ;; (ediff-activate-mark)
3470 )
3471 ;; (sit-for 0)
3472 (ediff-with-current-buffer bufB
3473 (goto-char begB)
3474 (set-mark endB)
3475 (narrow-to-region begB endB)
3476 ;; (ediff-activate-mark)
3477 )
3478 ;; (sit-for 0)
3479
3480 ;; At this point, possibilities contains either the window char A/B/C
3481 ;; that was not selected, or it is nil. We delete the window that is not
3482 ;; selected.
3483 (if possibilities
3484 (ediff-with-current-buffer ctl-buf
3485 (let* ((wind-to-delete (eval
3486 (ediff-get-symbol-from-alist
3487 (car possibilities)
3488 ediff-window-alist)))
3489 (frame (window-frame wind-to-delete)))
3490 (delete-window wind-to-delete)
3491 (select-frame frame)
3492 (balance-windows))))
3493 (or (y-or-n-p
3494 "Please check regions selected for comparison. Continue? ")
3495 (setq quit-now t))
3496
3497 (ediff-with-current-buffer bufA
3498 (widen))
3499 (ediff-with-current-buffer bufB
3500 (widen))
3501 (if quit-now
3502 (ediff-with-current-buffer ctl-buf
3503 (ediff-recenter)
3504 (sit-for 0)
3505 (error "All right. Make up your mind and come back...")))
3506
3507 (ediff-regions-internal 3469 (ediff-regions-internal
3508 bufA begA endA bufB begB endB 3470 bufA begA endA bufB begB endB
3509 nil ; setup-hook 3471 nil ; setup-hook
diff --git a/lisp/ediff.el b/lisp/ediff.el
index d07075bbac8..05f0fcbabfa 100644
--- a/lisp/ediff.el
+++ b/lisp/ediff.el
@@ -6,8 +6,8 @@
6;; Created: February 2, 1994 6;; Created: February 2, 1994
7;; Keywords: comparing, merging, patching, tools, unix 7;; Keywords: comparing, merging, patching, tools, unix
8 8
9(defconst ediff-version "2.76.1" "The current version of Ediff") 9(defconst ediff-version "2.77" "The current version of Ediff")
10(defconst ediff-date "January 4, 2002" "Date of last update") 10(defconst ediff-date "March 5, 2002" "Date of last update")
11 11
12 12
13;; This file is part of GNU Emacs. 13;; This file is part of GNU Emacs.
@@ -154,7 +154,7 @@
154;; Last directory used by an Ediff command for the ancestor file. 154;; Last directory used by an Ediff command for the ancestor file.
155(defvar ediff-last-dir-ancestor nil) 155(defvar ediff-last-dir-ancestor nil)
156;; Last directory used by an Ediff command as the output directory for merge. 156;; Last directory used by an Ediff command as the output directory for merge.
157(defvar ediff-last-merge-autostore-dir) 157(defvar ediff-last-merge-autostore-dir nil)
158 158
159 159
160;; Used as a startup hook to set `_orig' patch file read-only. 160;; Used as a startup hook to set `_orig' patch file read-only.
@@ -688,8 +688,11 @@ names. Only the files that are under revision control are taken into account."
688 (or (stringp merge-autostore-dir) 688 (or (stringp merge-autostore-dir)
689 (error "%s: Directory for storing merged files must be a string" 689 (error "%s: Directory for storing merged files must be a string"
690 jobname))) 690 jobname)))
691 (let (diffs ; var where ediff-intersect-directories returns the diff list 691 (let (;; dir-diff-struct is of the form (common-list diff-list)
692 file-list meta-buf) 692 ;; It is a structure where ediff-intersect-directories returns
693 ;; commonalities and differences among directories
694 dir-diff-struct
695 meta-buf)
693 (if (and ediff-autostore-merges 696 (if (and ediff-autostore-merges
694 (ediff-merge-metajob jobname) 697 (ediff-merge-metajob jobname)
695 (not merge-autostore-dir)) 698 (not merge-autostore-dir))
@@ -715,9 +718,9 @@ names. Only the files that are under revision control are taken into account."
715 "Directory for saving merged files = Ancestor Directory. Sure? ") 718 "Directory for saving merged files = Ancestor Directory. Sure? ")
716 (error "Directory merge aborted"))))) 719 (error "Directory merge aborted")))))
717 720
718 (setq file-list (ediff-intersect-directories 721 (setq dir-diff-struct (ediff-intersect-directories
719 jobname 'diffs 722 jobname
720 regexp dir1 dir2 dir3 merge-autostore-dir)) 723 regexp dir1 dir2 dir3 merge-autostore-dir))
721 (setq startup-hooks 724 (setq startup-hooks
722 ;; this sets various vars in the meta buffer inside 725 ;; this sets various vars in the meta buffer inside
723 ;; ediff-prepare-meta-buffer 726 ;; ediff-prepare-meta-buffer
@@ -725,11 +728,12 @@ names. Only the files that are under revision control are taken into account."
725 ;; tell what to do if the user clicks on a session record 728 ;; tell what to do if the user clicks on a session record
726 (setq ediff-session-action-function (quote ,action)) 729 (setq ediff-session-action-function (quote ,action))
727 ;; set ediff-dir-difference-list 730 ;; set ediff-dir-difference-list
728 (setq ediff-dir-difference-list (quote ,diffs))) 731 (setq ediff-dir-difference-list
732 (cdr (quote ,dir-diff-struct))))
729 startup-hooks)) 733 startup-hooks))
730 (setq meta-buf (ediff-prepare-meta-buffer 734 (setq meta-buf (ediff-prepare-meta-buffer
731 'ediff-filegroup-action 735 'ediff-filegroup-action
732 file-list 736 (car dir-diff-struct)
733 "*Ediff Session Group Panel" 737 "*Ediff Session Group Panel"
734 'ediff-redraw-directory-group-buffer 738 'ediff-redraw-directory-group-buffer
735 jobname 739 jobname
@@ -839,10 +843,10 @@ If WIND-B is nil, use window next to WIND-A."
839 end-B (window-end)))) 843 end-B (window-end))))
840 (setq buffer-A 844 (setq buffer-A
841 (ediff-clone-buffer-for-window-comparison 845 (ediff-clone-buffer-for-window-comparison
842 buffer-A wind-A "-Window1-") 846 buffer-A wind-A "-Window.A-")
843 buffer-B 847 buffer-B
844 (ediff-clone-buffer-for-window-comparison 848 (ediff-clone-buffer-for-window-comparison
845 buffer-B wind-B "-Window2-")) 849 buffer-B wind-B "-Window.B-"))
846 (ediff-regions-internal 850 (ediff-regions-internal
847 buffer-A beg-A end-A buffer-B beg-B end-B 851 buffer-A beg-A end-A buffer-B beg-B end-B
848 startup-hooks job-name word-mode nil))) 852 startup-hooks job-name word-mode nil)))
@@ -853,18 +857,32 @@ If WIND-B is nil, use window next to WIND-A."
853 buff-name 857 buff-name
854 (concat buff-name region-name 858 (concat buff-name region-name
855 (symbol-name (gensym))))) 859 (symbol-name (gensym)))))
856 (wind (ediff-get-visible-buffer-window buff-name))) 860 (wind (ediff-get-visible-buffer-window buff-name))
861 (pop-up-windows t)
862 other-wind
863 msg-buf)
857 (ediff-with-current-buffer cloned-buff 864 (ediff-with-current-buffer cloned-buff
858 (setq ediff-temp-indirect-buffer t)) 865 (setq ediff-temp-indirect-buffer t))
859 (if (window-live-p wind) 866 (if (window-live-p wind)
860 (set-window-buffer wind cloned-buff)) 867 (set-window-buffer wind cloned-buff))
861 (pop-to-buffer cloned-buff) 868 (pop-to-buffer cloned-buff)
862 (message 869 (with-temp-buffer
863 "Mark a region in buffer %s; then type %s. Use %s to abort." 870 (erase-buffer)
864 (buffer-name cloned-buff) 871 (insert
865 (ediff-format-bindings-of 'exit-recursive-edit) 872 (format "\n ******* Mark a region in buffer %s *******\n"
866 (ediff-format-bindings-of 'abort-recursive-edit)) 873 (buffer-name cloned-buff)))
867 (recursive-edit) 874 (insert
875 (format "\n\t When done, type %s Use %s to abort\n "
876 (ediff-format-bindings-of 'exit-recursive-edit)
877 (ediff-format-bindings-of 'abort-recursive-edit)))
878 (goto-char (point-min))
879 (setq msg-buf (current-buffer))
880 (other-window 1)
881 (set-window-buffer (selected-window) msg-buf)
882 (shrink-window-if-larger-than-buffer)
883 (select-window wind)
884 (recursive-edit)
885 )
868 cloned-buff)) 886 cloned-buff))
869 887
870(defun ediff-clone-buffer-for-window-comparison (buff wind region-name) 888(defun ediff-clone-buffer-for-window-comparison (buff wind region-name)
@@ -910,9 +928,9 @@ lines. For large regions, use `ediff-regions-linewise'."
910 928
911 929
912 (let ((buffer-A 930 (let ((buffer-A
913 (ediff-clone-buffer-for-region-comparison buffer-A "-Region1-")) 931 (ediff-clone-buffer-for-region-comparison buffer-A "-Region.A-"))
914 (buffer-B 932 (buffer-B
915 (ediff-clone-buffer-for-region-comparison buffer-B "-Region2-")) 933 (ediff-clone-buffer-for-region-comparison buffer-B "-Region.B-"))
916 reg-A-beg reg-A-end reg-B-beg reg-B-end) 934 reg-A-beg reg-A-end reg-B-beg reg-B-end)
917 (save-excursion 935 (save-excursion
918 (set-buffer buffer-A) 936 (set-buffer buffer-A)
@@ -954,9 +972,9 @@ lines. For small regions, use `ediff-regions-wordwise'."
954 (error "Buffer %S doesn't exist" buffer-B)) 972 (error "Buffer %S doesn't exist" buffer-B))
955 973
956 (let ((buffer-A 974 (let ((buffer-A
957 (ediff-clone-buffer-for-region-comparison buffer-A "-Region1-")) 975 (ediff-clone-buffer-for-region-comparison buffer-A "-Region.A-"))
958 (buffer-B 976 (buffer-B
959 (ediff-clone-buffer-for-region-comparison buffer-B "-Region2-")) 977 (ediff-clone-buffer-for-region-comparison buffer-B "-Region.B-"))
960 reg-A-beg reg-A-end reg-B-beg reg-B-end) 978 reg-A-beg reg-A-end reg-B-beg reg-B-end)
961 (save-excursion 979 (save-excursion
962 (set-buffer buffer-A) 980 (set-buffer buffer-A)