diff options
| author | Michael Kifer | 2002-03-05 05:34:19 +0000 |
|---|---|---|
| committer | Michael Kifer | 2002-03-05 05:34:19 +0000 |
| commit | c3912d548fb1e6d97b07e47a91f2e0e1da5e27e2 (patch) | |
| tree | 236a904f0ae2a5e2db9979d2f51dd2f731ee50b5 | |
| parent | 31ade731e6dc0c0a4c124f93a1f0018e245a27a2 (diff) | |
| download | emacs-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/ChangeLog | 24 | ||||
| -rw-r--r-- | lisp/ediff-init.el | 3 | ||||
| -rw-r--r-- | lisp/ediff-mult.el | 366 | ||||
| -rw-r--r-- | lisp/ediff-util.el | 66 | ||||
| -rw-r--r-- | lisp/ediff.el | 64 |
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 @@ | |||
| 1 | 2002-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 | |||
| 1 | 2002-03-04 Richard M. Stallman <rms@gnu.org> | 25 | 2002-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. |
| 336 | It is entered through one of the following commands: | 360 | It 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 " |
| 1073 | Useful commands: | 1117 | Useful 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) |