comparison lisp/ediff/ediff-mult.el @ 181:bfd6434d15b3 r20-3b17

Import from CVS: tag r20-3b17
author cvs
date Mon, 13 Aug 2007 09:53:19 +0200
parents 34a5b81f86ba
children 3d6bfa290dbd
comparison
equal deleted inserted replaced
180:add28d59e586 181:bfd6434d15b3
91 ;;; Code: 91 ;;; Code:
92 92
93 (provide 'ediff-mult) 93 (provide 'ediff-mult)
94 94
95 (defgroup ediff-mult nil 95 (defgroup ediff-mult nil
96 "Multi-file and multi-buffer processing in ediff" 96 "Multi-file and multi-buffer processing in Ediff"
97 :prefix "ediff-" 97 :prefix "ediff-"
98 :group 'ediff) 98 :group 'ediff)
99 99
100 100
101 ;; compiler pacifier 101 ;; compiler pacifier
557 meta-buffer-name redraw-function 557 meta-buffer-name redraw-function
558 jobname &optional startup-hooks) 558 jobname &optional startup-hooks)
559 (let* ((meta-buffer-name 559 (let* ((meta-buffer-name
560 (ediff-unique-buffer-name meta-buffer-name "*")) 560 (ediff-unique-buffer-name meta-buffer-name "*"))
561 (meta-buffer (get-buffer-create meta-buffer-name))) 561 (meta-buffer (get-buffer-create meta-buffer-name)))
562 (ediff-eval-in-buffer meta-buffer 562 (ediff-with-current-buffer meta-buffer
563 563
564 ;; comes first 564 ;; comes first
565 (ediff-meta-mode) 565 (ediff-meta-mode)
566 566
567 (setq ediff-meta-action-function action-func 567 (setq ediff-meta-action-function action-func
660 (empty t) 660 (empty t)
661 (sessionNum 0) 661 (sessionNum 0)
662 regexp elt session-buf f1 f2 f3 pt 662 regexp elt session-buf f1 f2 f3 pt
663 merge-autostore-dir 663 merge-autostore-dir
664 point tmp-list buffer-read-only) 664 point tmp-list buffer-read-only)
665 (ediff-eval-in-buffer meta-buf 665 (ediff-with-current-buffer meta-buf
666 (setq point (point)) 666 (setq point (point))
667 (erase-buffer) 667 (erase-buffer)
668 (insert (format ediff-meta-buffer-message 668 (insert (format ediff-meta-buffer-message
669 (ediff-abbrev-jobname ediff-metajob-name))) 669 (ediff-abbrev-jobname ediff-metajob-name)))
670 670
826 file code 826 file code
827 buffer-read-only) 827 buffer-read-only)
828 ;; skip the directory part 828 ;; skip the directory part
829 (setq diff-list (cdr diff-list)) 829 (setq diff-list (cdr diff-list))
830 (setq ediff-dir-diffs-buffer (get-buffer-create buf-name)) 830 (setq ediff-dir-diffs-buffer (get-buffer-create buf-name))
831 (ediff-eval-in-buffer ediff-dir-diffs-buffer 831 (ediff-with-current-buffer ediff-dir-diffs-buffer
832 (use-local-map ediff-dir-diffs-buffer-map) 832 (use-local-map ediff-dir-diffs-buffer-map)
833 (erase-buffer) 833 (erase-buffer)
834 (setq ediff-meta-buffer meta-buf) 834 (setq ediff-meta-buffer meta-buf)
835 (insert "\t\t*** Directory Differences ***\n") 835 (insert "\t\t*** Directory Differences ***\n")
836 (insert " 836 (insert "
936 (error "This session group has no parent"))) 936 (error "This session group has no parent")))
937 937
938 938
939 ;; argument is ignored 939 ;; argument is ignored
940 (defun ediff-redraw-registry-buffer (&optional ignore) 940 (defun ediff-redraw-registry-buffer (&optional ignore)
941 (ediff-eval-in-buffer ediff-registry-buffer 941 (ediff-with-current-buffer ediff-registry-buffer
942 (let ((point (point)) 942 (let ((point (point))
943 elt bufAname bufBname bufCname cur-diff total-diffs pt 943 elt bufAname bufBname bufCname cur-diff total-diffs pt
944 job-name meta-list registry-list buffer-read-only) 944 job-name meta-list registry-list buffer-read-only)
945 (erase-buffer) 945 (erase-buffer)
946 (insert "This is a registry of all active Ediff sessions. 946 (insert "This is a registry of all active Ediff sessions.
973 (while registry-list 973 (while registry-list
974 (setq elt (car registry-list) 974 (setq elt (car registry-list)
975 registry-list (cdr registry-list)) 975 registry-list (cdr registry-list))
976 976
977 (if (ediff-buffer-live-p elt) 977 (if (ediff-buffer-live-p elt)
978 (if (ediff-eval-in-buffer elt 978 (if (ediff-with-current-buffer elt
979 (setq job-name ediff-metajob-name 979 (setq job-name ediff-metajob-name
980 meta-list ediff-meta-list) 980 meta-list ediff-meta-list)
981 (and ediff-metajob-name 981 (and ediff-metajob-name
982 (not (eq ediff-metajob-name 'ediff-registry)))) 982 (not (eq ediff-metajob-name 'ediff-registry))))
983 (progn 983 (progn
998 (ediff-get-group-objC meta-list)) 998 (ediff-get-group-objC meta-list))
999 (ediff-get-group-objC meta-list) 999 (ediff-get-group-objC meta-list)
1000 "")))) 1000 ""))))
1001 (ediff-set-meta-overlay pt (point) elt)) 1001 (ediff-set-meta-overlay pt (point) elt))
1002 (progn 1002 (progn
1003 (ediff-eval-in-buffer elt 1003 (ediff-with-current-buffer elt
1004 (setq bufAname (if (ediff-buffer-live-p ediff-buffer-A) 1004 (setq bufAname (if (ediff-buffer-live-p ediff-buffer-A)
1005 (buffer-name ediff-buffer-A) 1005 (buffer-name ediff-buffer-A)
1006 "!!!killed buffer!!!") 1006 "!!!killed buffer!!!")
1007 bufBname (if (ediff-buffer-live-p ediff-buffer-B) 1007 bufBname (if (ediff-buffer-live-p ediff-buffer-B)
1008 (buffer-name ediff-buffer-B) 1008 (buffer-name ediff-buffer-B)
1141 (let ((session-buf (ediff-get-session-buffer session)) 1141 (let ((session-buf (ediff-get-session-buffer session))
1142 (meta-diff-buff ediff-meta-diff-buffer) 1142 (meta-diff-buff ediff-meta-diff-buffer)
1143 (metajob ediff-metajob-name) 1143 (metajob ediff-metajob-name)
1144 tmp-buf custom-diff-buf) 1144 tmp-buf custom-diff-buf)
1145 (if (ediff-buffer-live-p session-buf) 1145 (if (ediff-buffer-live-p session-buf)
1146 (ediff-eval-in-buffer session-buf 1146 (ediff-with-current-buffer session-buf
1147 (if (eq ediff-control-buffer session-buf) ; individual session 1147 (if (eq ediff-control-buffer session-buf) ; individual session
1148 (progn 1148 (progn
1149 (ediff-compute-custom-diffs-maybe) 1149 (ediff-compute-custom-diffs-maybe)
1150 (setq custom-diff-buf ediff-custom-diff-buffer))))) 1150 (setq custom-diff-buf ediff-custom-diff-buffer)))))
1151 1151
1189 (interactive) 1189 (interactive)
1190 (or (ediff-buffer-live-p ediff-meta-diff-buffer) 1190 (or (ediff-buffer-live-p ediff-meta-diff-buffer)
1191 (setq ediff-meta-diff-buffer 1191 (setq ediff-meta-diff-buffer
1192 (get-buffer-create 1192 (get-buffer-create
1193 (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*")))) 1193 (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*"))))
1194 (ediff-eval-in-buffer ediff-meta-diff-buffer 1194 (ediff-with-current-buffer ediff-meta-diff-buffer
1195 (erase-buffer)) 1195 (erase-buffer))
1196 (if (> (ediff-operate-on-marked-sessions 'ediff-append-custom-diff) 0) 1196 (if (> (ediff-operate-on-marked-sessions 'ediff-append-custom-diff) 0)
1197 ;; did something 1197 ;; did something
1198 (display-buffer ediff-meta-diff-buffer 'not-this-window) 1198 (display-buffer ediff-meta-diff-buffer 'not-this-window)
1199 (beep) 1199 (beep)
1205 (let* ((pos (ediff-event-point last-command-event)) 1205 (let* ((pos (ediff-event-point last-command-event))
1206 (meta-buf (ediff-event-buffer last-command-event)) 1206 (meta-buf (ediff-event-buffer last-command-event))
1207 (info (ediff-get-meta-info meta-buf pos 'noerror)) 1207 (info (ediff-get-meta-info meta-buf pos 'noerror))
1208 (patchbuffer ediff-meta-patchbufer)) 1208 (patchbuffer ediff-meta-patchbufer))
1209 (if (ediff-buffer-live-p patchbuffer) 1209 (if (ediff-buffer-live-p patchbuffer)
1210 (ediff-eval-in-buffer patchbuffer 1210 (ediff-with-current-buffer patchbuffer
1211 (save-restriction 1211 (save-restriction
1212 (if (not info) 1212 (if (not info)
1213 (widen) 1213 (widen)
1214 (narrow-to-region 1214 (narrow-to-region
1215 (ediff-get-session-objB-name info) 1215 (ediff-get-session-objB-name info)
1247 (progn 1247 (progn
1248 (ediff-set-session-status info nil) 1248 (ediff-set-session-status info nil)
1249 (ediff-update-meta-buffer meta-buf)) 1249 (ediff-update-meta-buffer meta-buf))
1250 (error "Aborted")))) 1250 (error "Aborted"))))
1251 1251
1252 (ediff-eval-in-buffer meta-buf 1252 (ediff-with-current-buffer meta-buf
1253 (setq merge-autostore-dir 1253 (setq merge-autostore-dir
1254 (ediff-get-group-merge-autostore-dir ediff-meta-list)) 1254 (ediff-get-group-merge-autostore-dir ediff-meta-list))
1255 (goto-char pos) ; if the user clicked on session--move point there 1255 (goto-char pos) ; if the user clicked on session--move point there
1256 ;; First handle sessions involving directories (which are themselves 1256 ;; First handle sessions involving directories (which are themselves
1257 ;; session groups) 1257 ;; session groups)
1297 1297
1298 ;; From here on---only individual session handlers 1298 ;; From here on---only individual session handlers
1299 1299
1300 ;; handle an individual session with a live control buffer 1300 ;; handle an individual session with a live control buffer
1301 ((ediff-buffer-live-p session-buf) 1301 ((ediff-buffer-live-p session-buf)
1302 (ediff-eval-in-buffer session-buf 1302 (ediff-with-current-buffer session-buf
1303 (setq ediff-mouse-pixel-position (mouse-pixel-position)) 1303 (setq ediff-mouse-pixel-position (mouse-pixel-position))
1304 (ediff-recenter 'no-rehighlight))) 1304 (ediff-recenter 'no-rehighlight)))
1305 1305
1306 ((ediff-problematic-session-p info) 1306 ((ediff-problematic-session-p info)
1307 (beep) 1307 (beep)
1385 (buf (ediff-event-buffer last-command-event)) 1385 (buf (ediff-event-buffer last-command-event))
1386 (ctl-buf (ediff-get-meta-info buf pos))) 1386 (ctl-buf (ediff-get-meta-info buf pos)))
1387 1387
1388 (if (ediff-buffer-live-p ctl-buf) 1388 (if (ediff-buffer-live-p ctl-buf)
1389 ;; check if this is ediff-control-buffer or ediff-meta-buffer 1389 ;; check if this is ediff-control-buffer or ediff-meta-buffer
1390 (if (ediff-eval-in-buffer ctl-buf 1390 (if (ediff-with-current-buffer ctl-buf
1391 (eq (key-binding "q") 'ediff-quit-meta-buffer)) 1391 (eq (key-binding "q") 'ediff-quit-meta-buffer))
1392 ;; it's a meta-buffer -- last action should just display it 1392 ;; it's a meta-buffer -- last action should just display it
1393 (ediff-show-meta-buffer ctl-buf) 1393 (ediff-show-meta-buffer ctl-buf)
1394 ;; it's a session buffer -- invoke go back to session 1394 ;; it's a session buffer -- invoke go back to session
1395 (ediff-eval-in-buffer ctl-buf 1395 (ediff-with-current-buffer ctl-buf
1396 (setq ediff-mouse-pixel-position (mouse-pixel-position)) 1396 (setq ediff-mouse-pixel-position (mouse-pixel-position))
1397 (ediff-recenter 'no-rehighlight))) 1397 (ediff-recenter 'no-rehighlight)))
1398 (beep) 1398 (beep)
1399 (message "You've selected a stale session --- try again") 1399 (message "You've selected a stale session --- try again")
1400 (ediff-update-registry)) 1400 (ediff-update-registry))
1401 (ediff-eval-in-buffer buf 1401 (ediff-with-current-buffer buf
1402 (goto-char pos)) 1402 (goto-char pos))
1403 )) 1403 ))
1404 1404
1405 1405
1406 (defun ediff-show-meta-buffer (&optional meta-buf) 1406 (defun ediff-show-meta-buffer (&optional meta-buf)
1415 ((not (ediff-buffer-live-p meta-buf)) 1415 ((not (ediff-buffer-live-p meta-buf))
1416 (error 1416 (error
1417 "Can't find this session's group panel -- session itself is ok"))) 1417 "Can't find this session's group panel -- session itself is ok")))
1418 1418
1419 (ediff-cleanup-meta-buffer meta-buf) 1419 (ediff-cleanup-meta-buffer meta-buf)
1420 (ediff-eval-in-buffer meta-buf 1420 (ediff-with-current-buffer meta-buf
1421 (save-excursion 1421 (save-excursion
1422 (cond ((setq wind (ediff-get-visible-buffer-window meta-buf)) 1422 (cond ((setq wind (ediff-get-visible-buffer-window meta-buf))
1423 (or silent 1423 (or silent
1424 (message 1424 (message
1425 "Already showing the group panel for this session")) 1425 "Already showing the group panel for this session"))
1459 (interactive) 1459 (interactive)
1460 (let* ((pos (ediff-event-point last-command-event)) 1460 (let* ((pos (ediff-event-point last-command-event))
1461 (meta-buf (ediff-event-buffer last-command-event)) 1461 (meta-buf (ediff-event-buffer last-command-event))
1462 (info (ediff-get-meta-info meta-buf pos)) 1462 (info (ediff-get-meta-info meta-buf pos))
1463 (meta-or-session-buf info)) 1463 (meta-or-session-buf info))
1464 (ediff-eval-in-buffer meta-or-session-buf 1464 (ediff-with-current-buffer meta-or-session-buf
1465 (ediff-show-meta-buffer)))) 1465 (ediff-show-meta-buffer))))
1466 1466
1467 ;;;###autoload 1467 ;;;###autoload
1468 (defun ediff-show-registry () 1468 (defun ediff-show-registry ()
1469 "Display Ediff's registry." 1469 "Display Ediff's registry."
1472 (if (not (ediff-buffer-live-p ediff-registry-buffer)) 1472 (if (not (ediff-buffer-live-p ediff-registry-buffer))
1473 (error "No active Ediff sessions or corrupted session registry")) 1473 (error "No active Ediff sessions or corrupted session registry"))
1474 (let (wind frame) 1474 (let (wind frame)
1475 ;; for some reason, point moves in ediff-registry-buffer, so we preserve it 1475 ;; for some reason, point moves in ediff-registry-buffer, so we preserve it
1476 ;; explicitly 1476 ;; explicitly
1477 (ediff-eval-in-buffer ediff-registry-buffer 1477 (ediff-with-current-buffer ediff-registry-buffer
1478 (save-excursion 1478 (save-excursion
1479 (cond ((setq wind 1479 (cond ((setq wind
1480 (ediff-get-visible-buffer-window ediff-registry-buffer)) 1480 (ediff-get-visible-buffer-window ediff-registry-buffer))
1481 (message "Already showing the registry") 1481 (message "Already showing the registry")
1482 (set-window-buffer wind ediff-registry-buffer) 1482 (set-window-buffer wind ediff-registry-buffer)
1514 1514
1515 ;; If meta-buf doesn't exist, it is created. In that case, id doesn't have a 1515 ;; If meta-buf doesn't exist, it is created. In that case, id doesn't have a
1516 ;; parent meta-buf 1516 ;; parent meta-buf
1517 ;; Check if META-BUF exists before calling this function 1517 ;; Check if META-BUF exists before calling this function
1518 (defun ediff-update-meta-buffer (meta-buf) 1518 (defun ediff-update-meta-buffer (meta-buf)
1519 (ediff-eval-in-buffer (current-buffer) 1519 (ediff-with-current-buffer (current-buffer)
1520 (if (ediff-buffer-live-p meta-buf) 1520 (if (ediff-buffer-live-p meta-buf)
1521 (ediff-eval-in-buffer meta-buf 1521 (ediff-with-current-buffer meta-buf
1522 (funcall ediff-meta-redraw-function ediff-meta-list)) 1522 (funcall ediff-meta-redraw-function ediff-meta-list))
1523 ))) 1523 )))
1524 1524
1525 (defun ediff-update-registry () 1525 (defun ediff-update-registry ()
1526 (ediff-eval-in-buffer (current-buffer) 1526 (ediff-with-current-buffer (current-buffer)
1527 (if (ediff-buffer-live-p ediff-registry-buffer) 1527 (if (ediff-buffer-live-p ediff-registry-buffer)
1528 (ediff-redraw-registry-buffer) 1528 (ediff-redraw-registry-buffer)
1529 (ediff-prepare-meta-buffer 1529 (ediff-prepare-meta-buffer
1530 'ediff-registry-action 1530 'ediff-registry-action
1531 ediff-session-registry 1531 ediff-session-registry
1536 1536
1537 ;; If meta-buf exists, it is redrawn along with parent. 1537 ;; If meta-buf exists, it is redrawn along with parent.
1538 ;; Otherwise, nothing happens. 1538 ;; Otherwise, nothing happens.
1539 (defun ediff-cleanup-meta-buffer (meta-buffer) 1539 (defun ediff-cleanup-meta-buffer (meta-buffer)
1540 (if (ediff-buffer-live-p meta-buffer) 1540 (if (ediff-buffer-live-p meta-buffer)
1541 (ediff-eval-in-buffer meta-buffer 1541 (ediff-with-current-buffer meta-buffer
1542 (ediff-update-meta-buffer meta-buffer) 1542 (ediff-update-meta-buffer meta-buffer)
1543 (if (ediff-buffer-live-p ediff-parent-meta-buffer) 1543 (if (ediff-buffer-live-p ediff-parent-meta-buffer)
1544 (ediff-update-meta-buffer ediff-parent-meta-buffer))))) 1544 (ediff-update-meta-buffer ediff-parent-meta-buffer)))))
1545 1545
1546 ;; t if no session in progress 1546 ;; t if no session in progress
1548 (if (ediff-buffer-live-p meta-buffer) 1548 (if (ediff-buffer-live-p meta-buffer)
1549 (let ((lis ediff-meta-list) 1549 (let ((lis ediff-meta-list)
1550 (cont t) 1550 (cont t)
1551 buffer-read-only) 1551 buffer-read-only)
1552 (ediff-update-meta-buffer meta-buffer) 1552 (ediff-update-meta-buffer meta-buffer)
1553 (ediff-eval-in-buffer meta-buffer 1553 (ediff-with-current-buffer meta-buffer
1554 (setq lis (cdr lis)) ; discard the description part of meta-list 1554 (setq lis (cdr lis)) ; discard the description part of meta-list
1555 (while (and cont lis) 1555 (while (and cont lis)
1556 (if (ediff-buffer-live-p 1556 (if (ediff-buffer-live-p
1557 (ediff-get-group-buffer lis)) ; in progress 1557 (ediff-get-group-buffer lis)) ; in progress
1558 (setq cont nil)) 1558 (setq cont nil))
1594 (or dont-show-registry 1594 (or dont-show-registry
1595 (ediff-show-registry)))) 1595 (ediff-show-registry))))
1596 1596
1597 (defun ediff-dispose-of-meta-buffer (buf) 1597 (defun ediff-dispose-of-meta-buffer (buf)
1598 (setq ediff-session-registry (delq buf ediff-session-registry)) 1598 (setq ediff-session-registry (delq buf ediff-session-registry))
1599 (ediff-eval-in-buffer buf 1599 (ediff-with-current-buffer buf
1600 (if (ediff-buffer-live-p ediff-dir-diffs-buffer) 1600 (if (ediff-buffer-live-p ediff-dir-diffs-buffer)
1601 (kill-buffer ediff-dir-diffs-buffer))) 1601 (kill-buffer ediff-dir-diffs-buffer)))
1602 (kill-buffer buf)) 1602 (kill-buffer buf))
1603 1603
1604 1604
1607 ;; If optional NOERROR arg is given, don't report error and return nil if no 1607 ;; If optional NOERROR arg is given, don't report error and return nil if no
1608 ;; meta info is found on line. 1608 ;; meta info is found on line.
1609 (defun ediff-get-meta-info (buf point &optional noerror) 1609 (defun ediff-get-meta-info (buf point &optional noerror)
1610 (let (result olist tmp) 1610 (let (result olist tmp)
1611 (if (and point (ediff-buffer-live-p buf)) 1611 (if (and point (ediff-buffer-live-p buf))
1612 (ediff-eval-in-buffer buf 1612 (ediff-with-current-buffer buf
1613 (if ediff-xemacs-p 1613 (if ediff-xemacs-p
1614 (setq result 1614 (setq result
1615 (if (setq tmp (extent-at point buf 'ediff-meta-info)) 1615 (if (setq tmp (extent-at point buf 'ediff-meta-info))
1616 (ediff-overlay-get tmp 'ediff-meta-info))) 1616 (ediff-overlay-get tmp 'ediff-meta-info)))
1617 (setq olist (overlays-at point)) 1617 (setq olist (overlays-at point))
1700 (or (ediff-buffer-live-p session-buf) ; either an active patch session 1700 (or (ediff-buffer-live-p session-buf) ; either an active patch session
1701 (null session-buf) ; or it is a virgin session 1701 (null session-buf) ; or it is a virgin session
1702 (error 1702 (error
1703 "Patch has been already applied to this file--cannot be repeated!")) 1703 "Patch has been already applied to this file--cannot be repeated!"))
1704 1704
1705 (ediff-eval-in-buffer meta-patchbuf 1705 (ediff-with-current-buffer meta-patchbuf
1706 (save-restriction 1706 (save-restriction
1707 (widen) 1707 (widen)
1708 (narrow-to-region beg-marker end-marker) 1708 (narrow-to-region beg-marker end-marker)
1709 (ediff-patch-file-internal meta-patchbuf file startup-hooks))))) 1709 (ediff-patch-file-internal meta-patchbuf file startup-hooks)))))
1710 1710
1745 1745
1746 1746
1747 1747
1748 ;;; Local Variables: 1748 ;;; Local Variables:
1749 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) 1749 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
1750 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1) 1750 ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
1751 ;;; eval: (put 'ediff-eval-in-buffer 'edebug-form-spec '(form body)) 1751 ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
1752 ;;; End: 1752 ;;; End:
1753 1753
1754 ;;; ediff-mult.el ends here 1754 ;;; ediff-mult.el ends here