• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.9.5/emacs-92/emacs/lisp/

Lines Matching +defs:buffer +defs:file +defs:format

1 ;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff
8 ;; This file is part of GNU Emacs.
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
27 ;; Users are encouraged to add functionality to this file.
28 ;; The present file contains all the infrastructure needed for that.
33 ;; 1. How to display the session group buffer.
36 ;; See ediff-redraw-directory-group-buffer for an example.
37 ;; In all likelihood, ediff-redraw-directory-group-buffer can be used
41 ;; 3. Provide a list of pairs or triples of file names (or buffers,
43 ;; in the following format:
55 ;; (regexp metaobj1 metaobj2 metaobj3 merge-save-buffer
57 ;; The function ediff-redraw-registry-buffer displays the
58 ;; 1st - 4th of these in the registry buffer.
63 ;; Also, keep in mind that the function ediff-prepare-meta-buffer
64 ;; (which see) prepends the session group buffer to the descriptor, so
68 ;; control buffer associated with an appropriate Ediff session.
80 ;; that specify the patch corresponding to the file
83 ;; 4. Write a function that makes a call to ediff-prepare-meta-buffer
109 "Multi-file and multi-buffer processing in Ediff."
116 (let ((load-path (cons (expand-file-name ".") load-path)))
126 ;; meta-buffer
127 (ediff-defvar-local ediff-meta-buffer nil "")
128 (ediff-defvar-local ediff-parent-meta-buffer nil "")
129 ;; the registry buffer
130 (defvar ediff-registry-buffer nil)
132 (defconst ediff-meta-buffer-message "This is an Ediff Session Group Panel: %s
145 T:\ttoggle truncation of long file names
149 (ediff-defvar-local ediff-meta-buffer-map nil
150 "The keymap for the meta buffer.")
151 (defvar ediff-dir-diffs-buffer-map (make-sparse-keymap)
152 "The keymap to be installed in the buffer showing differences between
156 ;; meta buffer. This is usually ediff-registry-action or ediff-filegroup-action
158 ;; Tells ediff-update-meta-buffer how to redraw it
166 ;; buffer used to collect custom diffs from individual sessions in the group
167 (ediff-defvar-local ediff-meta-diff-buffer nil "")
185 ;; If ctl-buf is nil, the file-pair hasn't processed yet. If it is
186 ;; killed-buffer object, the file pair has been processed. If it is a live
187 ;; buffer, this means ediff is still working on the pair.
188 ;; Eq-status of a file is t if the file equals some other file in the same
197 (ediff-defvar-local ediff-dir-diffs-buffer nil "")
203 "*If non-nil, truncate long file names in the session group buffers.
226 "*Hooks run just after a meta-buffer controlling a session group, such as
235 "*Hooks run just after the registry buffer is shown."
239 "*Hooks run just after a session group buffer is shown."
242 (defcustom ediff-meta-buffer-keymap-setup-hook nil
243 "*Hooks run just after setting up the `ediff-meta-buffer-map'.
244 This keymap controls key bindings in the meta buffer and is a local variable.
250 ;; Buffer holding the multi-file patch. Local to the meta buffer
267 ;; group buffer/regexp
268 (defsubst ediff-get-group-buffer (meta-list)
291 ;; EQSTATUS is ?= or nil (?= means that this file is equal to some other
292 ;; file in this session)
293 ;; session buffer
294 (defsubst ediff-get-session-buffer (elt)
316 (defsubst ediff-get-file-eqstatus (elt)
318 (defsubst ediff-set-file-eqstatus (elt value)
324 ;; The first nil in such an element is later replaced with the session buffer.
329 ;; If it is discovered that this file is = to some other
330 ;; file in the same session, eq-indicator is changed to `='.
331 ;; Curently, the eq-indicator is used only for 2 and 3-file jobs.
338 ;; patch buffer.
349 (let ((session-buf (ediff-get-session-buffer session)))
351 ((ediff-buffer-live-p session-buf) ?+) ;active session
357 (file-directory-p (ediff-get-session-objA-name session-info))
359 (file-directory-p (ediff-get-session-objB-name session-info))
361 (file-directory-p (ediff-get-session-objC-name session-info)) t)))
363 ;; set up the keymap in the meta buffer
365 (setq ediff-meta-buffer-map (make-sparse-keymap))
366 (suppress-keymap ediff-meta-buffer-map)
367 (define-key ediff-meta-buffer-map "q" 'ediff-quit-meta-buffer)
368 (define-key ediff-meta-buffer-map "T" 'ediff-toggle-filename-truncation)
369 (define-key ediff-meta-buffer-map "R" 'ediff-show-registry)
370 (define-key ediff-meta-buffer-map "E" 'ediff-documentation)
371 (define-key ediff-meta-buffer-map "v" ediff-meta-action-function)
372 (define-key ediff-meta-buffer-map "\C-m" ediff-meta-action-function)
373 (define-key ediff-meta-buffer-map " " 'ediff-next-meta-item)
374 (define-key ediff-meta-buffer-map "n" 'ediff-next-meta-item)
375 (define-key ediff-meta-buffer-map "\C-?" 'ediff-previous-meta-item)
376 (define-key ediff-meta-buffer-map "p" 'ediff-previous-meta-item)
377 (define-key ediff-meta-buffer-map [delete] 'ediff-previous-meta-item)
378 (define-key ediff-meta-buffer-map [backspace] 'ediff-previous-meta-item)
381 (define-key ediff-meta-buffer-map "=" nil)
382 (define-key ediff-meta-buffer-map "==" 'ediff-meta-mark-equal-files)
383 (define-key ediff-meta-buffer-map "=m" 'ediff-meta-mark-equal-files)
384 (define-key ediff-meta-buffer-map "=h" 'ediff-meta-mark-equal-files)))
385 (if ediff-no-emacs-help-in-control-buffer
386 (define-key ediff-meta-buffer-map "\C-h" 'ediff-previous-meta-item))
388 (define-key ediff-meta-buffer-map [mouse-2] ediff-meta-action-function)
389 (define-key ediff-meta-buffer-map [button2] ediff-meta-action-function))
391 (use-local-map ediff-meta-buffer-map)
392 ;; modify ediff-meta-buffer-map here
393 (run-hooks 'ediff-meta-buffer-keymap-setup-hook))
415 \\{ediff-meta-buffer-map}"
423 ;; the keymap for the buffer showing directory differences
424 (suppress-keymap ediff-dir-diffs-buffer-map)
425 (define-key ediff-dir-diffs-buffer-map "q" 'ediff-bury-dir-diffs-buffer)
426 (define-key ediff-dir-diffs-buffer-map " " 'next-line)
427 (define-key ediff-dir-diffs-buffer-map "n" 'next-line)
428 (define-key ediff-dir-diffs-buffer-map "\C-?" 'previous-line)
429 (define-key ediff-dir-diffs-buffer-map "p" 'previous-line)
430 (define-key ediff-dir-diffs-buffer-map "C" 'ediff-dir-diff-copy-file)
432 (define-key ediff-dir-diffs-buffer-map [mouse-2] 'ediff-dir-diff-copy-file)
433 (define-key ediff-dir-diffs-buffer-map [button2] 'ediff-dir-diff-copy-file))
434 (define-key ediff-dir-diffs-buffer-map [delete] 'previous-line)
435 (define-key ediff-dir-diffs-buffer-map [backspace] 'previous-line)
438 "Move to the next item in Ediff registry or session group buffer.
458 (if (and (ediff-get-meta-info (current-buffer) pos 'noerror)
466 "Move to the previous item in Ediff registry or session group buffer.
485 ;;; (ediff-get-meta-info (current-buffer) pos 'noerror))
490 (if (and (ediff-get-meta-info (current-buffer) pos 'noerror)
497 (defsubst ediff-add-slash-if-directory (dir file)
498 (if (file-directory-p (concat dir file))
499 (file-name-as-directory file)
500 file))
503 "Toggle truncation of long file names in session group buffers.
508 (ediff-update-meta-buffer (current-buffer) 'must-redraw))
512 ;; Membership code of a file is a product of codes for the directories where
513 ;; this file is in
524 ;; REGEXP is nil or a filter regexp; only file names that match the regexp
526 ;; If a file is a directory in dir1 but not dir2 (or vice versa), it is not
527 ;; included in the intersection. However, a regular file that is a dir in dir3
542 ;; (META-HEADER (file . num) (file . num)...)
543 ;; where num encodes the set of dirs where the file is found:
548 ;; Later the meta-buffer is prepended to this list.
561 (setq auxdir1 (file-name-as-directory dir1)
569 auxdir2 (file-name-as-directory dir2)
579 (setq auxdir3 (file-name-as-directory dir3)
590 (file-name-as-directory merge-autostore-dir)))
595 ;; So, we intersect with lis3 only when we are doing 3-way file comparison
617 ;; Each elt is of the norm (file . number)
618 ;; Number encodes the directories to which file belongs.
621 ;; If file belongs to dir 1 only, the membership code is 2.
651 (expand-file-name (concat auxdir1 elt))
652 (expand-file-name (concat auxdir2 elt))
657 ;; possible that elt is a file in auxdir1/2 but a
662 (if (file-exists-p (concat auxdir3 elt))
663 (expand-file-name (concat auxdir3 elt)))))))
677 (setq auxdir1 (file-name-as-directory dir1)
682 (file-name-as-directory merge-autostore-dir)))
688 (cond ((file-directory-p (concat auxdir1 elt))
695 ((file-exists-p (concat auxdir1 elt ",v"))
697 ((file-exists-p (concat auxdir1 "RCS/" elt ",v"))
713 ;; header -- has 6 elements. Meta buffer is prepended later by
714 ;; ediff-prepare-meta-buffer
719 (expand-file-name (concat auxdir1 elt)) nil nil))
724 ;; If file groups selected by patterns will ever be implemented, this
754 ;; Prepare meta-buffer in accordance with the argument-function and
755 ;; redraw-function. Must return the created meta-buffer.
756 (defun ediff-prepare-meta-buffer (action-func meta-list
757 meta-buffer-name redraw-function
759 (let* ((meta-buffer-name
760 (ediff-unique-buffer-name meta-buffer-name "*"))
761 (meta-buffer (get-buffer-create meta-buffer-name)))
762 (ediff-with-current-buffer meta-buffer
770 ediff-meta-buffer meta-buffer)
777 (setq ediff-registry-buffer meta-buffer
779 ;; this func is used only from registry buffer, not from other
782 ediff-meta-buffer-map "M" 'ediff-show-meta-buff-from-registry))
785 ;; add meta-buffer to the list header
786 (cons (cons meta-buffer (car meta-list))
789 (or (eq meta-buffer ediff-registry-buffer)
791 (cons meta-buffer ediff-session-registry)))
797 (setq buffer-read-only t)
798 (set-buffer-modified-p nil)
807 ;; put meta buffer in (car ediff-dir-difference-list)
809 (cons (cons meta-buffer (car ediff-dir-difference-list))
815 ediff-meta-buffer-map "h" 'ediff-mark-for-hiding-at-pos)
816 (define-key ediff-meta-buffer-map "x" 'ediff-hide-marked-sessions)
818 ediff-meta-buffer-map "m" 'ediff-mark-for-operation-at-pos)
819 (define-key ediff-meta-buffer-map "u" nil)
821 ediff-meta-buffer-map "um" 'ediff-unmark-all-for-operation)
823 ediff-meta-buffer-map "uh" 'ediff-unmark-all-for-hiding)
826 ediff-meta-buffer-map "P" 'ediff-collect-custom-diffs))
829 ediff-meta-buffer-map "P" 'ediff-meta-show-patch)))
830 (define-key ediff-meta-buffer-map "^" 'ediff-up-meta-hierarchy)
831 (define-key ediff-meta-buffer-map "D" 'ediff-show-dir-diffs)))
836 ) ; eval in meta-buffer
837 meta-buffer))
839 ;; Insert the activity marker for session SESSION in the meta buffer at point
843 (defun ediff-insert-session-activity-marker-in-meta-buffer (session)
853 (defun ediff-insert-session-status-in-meta-buffer (session)
860 ;; in the meta buffer. If nil, use SPC
861 (defun ediff-replace-session-activity-marker-in-meta-buffer (point new-marker)
865 buffer-read-only)
869 () ; if marker shown in buffer is the same as new-marker, do nothing
872 (set-buffer-modified-p nil))))
875 ;; the meta buffer. If nil, use SPC
876 (defun ediff-replace-session-status-in-meta-buffer (point new-status)
880 buffer-read-only)
885 () ; if marker shown in buffer is the same as new-marker, do nothing
888 (set-buffer-modified-p nil))))
890 ;; insert all file info in meta buffer for a given session
891 (defun ediff-insert-session-info-in-meta-buffer (session-info sessionNum)
898 (ediff-insert-session-activity-marker-in-meta-buffer session-info)
900 (ediff-insert-session-status-in-meta-buffer session-info)
902 (ediff-meta-insert-file-info1 f1)
903 (ediff-meta-insert-file-info1 f2)
904 (ediff-meta-insert-file-info1 f3)
909 ;; must return meta-buffer
910 (defun ediff-redraw-directory-group-buffer (meta-list)
912 (let ((meta-buf (ediff-get-group-buffer meta-list))
916 point tmp-list buffer-read-only)
917 (ediff-with-current-buffer meta-buf
919 (erase-buffer)
927 (insert (format ediff-meta-buffer-message
952 (format "*** Filter-through regular expression: %s\n" regexp)))
953 (ediff-insert-dirs-in-meta-buffer meta-list)
956 (insert (format
978 ;; now organize file names like this:
987 (ediff-insert-session-info-in-meta-buffer elt sessionNum)))
988 (set-buffer-modified-p nil)
992 (defun ediff-update-markers-in-dir-meta-buffer (meta-list)
993 (let ((meta-buf (ediff-get-group-buffer meta-list))
994 session-info point overl buffer-read-only)
995 (ediff-with-current-buffer meta-buf
1011 (t (ediff-replace-session-activity-marker-in-meta-buffer
1014 (ediff-replace-session-status-in-meta-buffer
1019 (set-buffer-modified-p nil)
1023 (defun ediff-update-session-marker-in-dir-meta-buffer (session-num)
1024 (let (buffer-meta-overlays session-info overl buffer-read-only)
1035 ;; Splice overlay lists to get all buffer overlays
1037 (setq buffer-meta-overlays (overlay-lists)
1038 buffer-meta-overlays (append (car buffer-meta-overlays)
1039 (cdr buffer-meta-overlays)))
1050 buffer-meta-overlays))))
1054 "Bug in ediff-update-session-marker-in-dir-meta-buffer: no overlay with given number %S"
1058 (ediff-replace-session-activity-marker-in-meta-buffer
1061 (ediff-replace-session-status-in-meta-buffer
1071 ;; when the ancestor is a directory rather than a file, or when there is no
1072 ;; suitable ancestor file in the ancestor directory
1077 (cond ((and (stringp f1) (not (file-directory-p f1))
1078 (stringp f2) (not (file-directory-p f2))
1079 ;; either invalid file name or a directory
1080 (or (not (stringp f3)) (file-directory-p f3))
1086 (defun ediff-meta-insert-file-info1 (fileinfo)
1088 (feq (ediff-get-file-eqstatus fileinfo))
1092 file-modtime file-size)
1093 (cond ((not (stringp fname)) (setq file-size -2)) ; file doesn't exits
1094 ((ediff-listable-file fname)
1095 (if (file-exists-p fname)
1097 (setq file-size (ediff-file-size fname)
1098 file-modtime (ediff-file-modtime fname))
1099 (setq file-size -2))) ; file doesn't exist
1100 ( t (setq file-size -1))) ; remote file
1103 (format
1106 (format "%10s" (cond ((= file-size -1) "--")
1107 ((< file-size -1) "--")
1108 (t file-size)))
1109 (cond ((= file-size -1) "*remote file*")
1110 ((< file-size -1) "*file doesn't exist*")
1111 (t (ediff-format-date (decode-time file-modtime))))
1114 ;; abbreviate the file name, if file exists
1115 (if (and (not (stringp fname)) (< file-size -1))
1116 "-------" ; file doesn't exist
1118 (ediff-abbreviate-file-name fname)
1129 (format "0%d" num)
1133 (defun ediff-format-date (time)
1134 (format "%s %2d %4d %s:%s:%s"
1144 (defun ediff-insert-dirs-in-meta-buffer (meta-list)
1145 (let* ((dir1 (ediff-abbreviate-file-name (ediff-get-group-objA meta-list)))
1147 (dir2 (if (stringp dir2) (ediff-abbreviate-file-name dir2)))
1149 (dir3 (if (stringp dir3) (ediff-abbreviate-file-name dir3))))
1159 (ediff-unique-buffer-name "*Ediff File Group Differences" "*")))
1161 (dir1 (ediff-abbreviate-file-name (ediff-get-group-objA diff-list)))
1162 (dir2 (ediff-abbreviate-file-name (ediff-get-group-objB diff-list)))
1164 (dir3 (if (stringp dir3) (ediff-abbreviate-file-name dir3)))
1165 (meta-buf (ediff-get-group-buffer diff-list))
1167 file membership-code saved-point
1168 buffer-read-only)
1171 (setq ediff-dir-diffs-buffer (get-buffer-create buf-name))
1172 (ediff-with-current-buffer ediff-dir-diffs-buffer
1174 (use-local-map ediff-dir-diffs-buffer-map)
1175 (erase-buffer)
1176 (setq ediff-meta-buffer meta-buf)
1180 C,button2: over file name -- copy this file to directory that doesn't have it
1181 q: hide this buffer
1185 (insert (format "\n*** Directory A: %s\n" dir1))
1186 (if dir2 (insert (format "*** Directory B: %s\n" dir2)))
1187 (if dir3 (insert (format "*** Directory C: %s\n" dir3)))
1190 (format "*** Filter-through regular expression: %s\n" regexp)))
1192 (insert (format "\n%-27s%-26s" "Directory A" "Directory B"))
1194 (insert (format " %-25s\n" "Directory C"))
1196 (insert (format "%s%s" underline underline))
1198 (insert (format "%s\n\n" underline))
1205 (setq file (car (car diff-list))
1210 (insert (format "%-27s"
1212 (ediff-abbreviate-file-name
1213 (if (file-directory-p (concat dir1 file))
1214 (file-name-as-directory file)
1215 file))
1217 ;; format of meta info in the dir-diff-buffer:
1221 (list meta-buf file (concat dir1 file) dir1 dir2 dir3)))
1222 (insert (format "%-27s" "---")))
1225 (insert (format "%-26s"
1227 (ediff-abbreviate-file-name
1228 (if (file-directory-p (concat dir2 file))
1229 (file-name-as-directory file)
1230 file))
1234 (list meta-buf file (concat dir2 file) dir1 dir2 dir3)))
1235 (insert (format "%-26s" "---")))
1239 (insert (format " %-25s"
1241 (ediff-abbreviate-file-name
1242 (if (file-directory-p (concat dir3 file))
1243 (file-name-as-directory file)
1244 file))
1248 (list meta-buf file (concat dir3 file) dir1 dir2 dir3)))
1249 (insert (format " %-25s" "---"))))
1251 (setq buffer-read-only t)
1252 (set-buffer-modified-p nil)
1253 (goto-char saved-point)) ; end eval in diff buffer
1256 (defun ediff-bury-dir-diffs-buffer ()
1257 "Bury the directory difference buffer. Display the meta buffer instead."
1259 ;; ediff-meta-buffer is set in ediff-draw-dir-diffs so the directory
1260 ;; difference buffer remembers the meta buffer
1261 (let ((buf ediff-meta-buffer)
1263 (ediff-kill-buffer-carefully ediff-dir-diffs-buffer)
1264 (if (setq wind (ediff-get-visible-buffer-window buf))
1266 (set-window-buffer (selected-window) buf))))
1268 ;; executes in dir session group buffer
1269 ;; show buffer differences
1275 (or (ediff-buffer-live-p ediff-dir-diffs-buffer)
1277 (let ((buf ediff-dir-diffs-buffer))
1279 (set-window-buffer (selected-window) buf)
1282 ;; Format of meta info in dir-diff-buffer:
1284 (defun ediff-dir-diff-copy-file ()
1285 "Copy file described at point to directories where this file is missing."
1288 (info (ediff-get-meta-info (current-buffer) pos 'noerror))
1290 (file-tail (nth 1 info))
1291 (file-abs (nth 2 info))
1293 (otherfile1 (if otherdir1 (concat otherdir1 file-tail)))
1295 (otherfile2 (if otherdir2 (concat otherdir2 file-tail)))
1297 (otherfile3 (if otherdir3 (concat otherdir3 file-tail)))
1301 (error "No file suitable for copying described at this location"))
1302 (ediff-with-current-buffer meta-buf
1306 ;; copy file to directories where it doesn't exist, update
1311 (file-mem-code (cdr otherfile-struct)))
1313 (or (file-exists-p otherfile)
1315 (format "Copy %s to %s? " file-abs otherfile))
1316 (let* ((file-diff-record (assoc file-tail dir-diff-list))
1318 (* (cdr file-diff-record) file-mem-code)))
1319 (copy-file file-abs otherfile)
1320 (setcdr file-diff-record new-mem-code)
1321 (ediff-draw-dir-diffs dir-diff-list (buffer-name))
1323 ;; if file is in all three dirs or in two dirs and only
1324 ;; two dirs are involved, delete this file's record
1328 (delq file-diff-record dir-diff-list))
1331 ;; 2,3,5 are numbers used to encode membership of a file in
1335 (if (and (file-exists-p otherfile1)
1336 (file-exists-p otherfile2)
1337 (or (not otherfile3) (file-exists-p otherfile3)))
1341 (expand-file-name otherfile1)
1342 (expand-file-name otherfile2)
1344 (expand-file-name otherfile3)))))
1346 (ediff-update-meta-buffer meta-buf 'must-redraw)
1350 "Go to the parent session group buffer."
1352 (if (ediff-buffer-live-p ediff-parent-meta-buffer)
1353 (ediff-show-meta-buffer
1354 ediff-parent-meta-buffer ediff-meta-session-number)
1359 (defun ediff-redraw-registry-buffer (&optional ignore)
1360 (ediff-with-current-buffer ediff-registry-buffer
1363 job-name meta-list registry-list buffer-read-only)
1364 (erase-buffer)
1390 (if (not (ediff-buffer-live-p elt))
1403 (if (ediff-buffer-live-p elt)
1404 (if (ediff-with-current-buffer elt
1411 (insert (format " *group*\t%s: %s\n"
1412 (buffer-name elt)
1414 (insert (format "\t\t %s %s %s\n"
1415 (ediff-abbreviate-file-name
1417 (ediff-abbreviate-file-name
1422 (ediff-abbreviate-file-name
1429 (ediff-with-current-buffer elt
1430 (setq bufAname (if (ediff-buffer-live-p ediff-buffer-A)
1431 (buffer-name ediff-buffer-A)
1432 "!!!killed buffer!!!")
1433 bufBname (if (ediff-buffer-live-p ediff-buffer-B)
1434 (buffer-name ediff-buffer-B)
1435 "!!!killed buffer!!!")
1438 ((ediff-buffer-live-p ediff-buffer-C)
1439 (buffer-name ediff-buffer-C))
1440 (t "!!!killed buffer!!!")))
1441 (setq total-diffs (format "%-4d" ediff-number-of-differences)
1447 (t (format
1453 (buffer-name elt)
1454 (format ": %s" (ediff-abbrev-jobname job-name)))
1459 (set-buffer-modified-p nil)
1466 ;; PROP is either the ctl or meta buffer (used when we work with the registry)
1485 (meta-buf (ediff-event-buffer last-command-event))
1492 (ediff-update-meta-buffer meta-buf nil session-number))
1497 (let ((session-buf (ediff-get-session-buffer info))
1505 ;;; (if (ediff-buffer-live-p session-buf)
1506 ;;; (error "Can't hide active session, %s" (buffer-name session-buf)))
1515 (meta-buf (ediff-event-buffer last-command-event))
1522 (ediff-update-meta-buffer meta-buf nil session-number))
1543 (let ((grp-buf (ediff-get-group-buffer ediff-meta-list))
1552 session-buf (ediff-get-session-buffer elt))
1557 (if (and (eq to ?I) (buffer-live-p session-buf))
1562 (ediff-update-meta-buffer grp-buf 'must-redraw)
1575 (let ((grp-buf (ediff-get-group-buffer ediff-meta-list))
1580 (diff-buffer ediff-meta-diff-buffer)
1593 (ediff-buffer-live-p
1594 (setq session-buf (ediff-get-session-buffer elt))))
1597 (ediff-with-current-buffer session-buf
1599 (setq ediff-meta-diff-buffer diff-buffer)
1602 (ediff-update-meta-buffer grp-buf 'must-redraw) ; just in case
1609 (let ((session-buf (ediff-get-session-buffer session))
1610 (meta-diff-buff ediff-meta-diff-buffer)
1613 (if (ediff-buffer-live-p session-buf)
1614 (ediff-with-current-buffer session-buf
1615 (if (eq ediff-control-buffer session-buf) ; individual session
1618 (setq custom-diff-buf ediff-custom-diff-buffer)))))
1620 (or (ediff-buffer-live-p meta-diff-buff)
1621 (error "Ediff: something wrong--killed multiple diff's buffer"))
1623 (cond ((ediff-buffer-live-p custom-diff-buf)
1627 (set-buffer meta-diff-buff)
1629 (insert-buffer-substring custom-diff-buf)
1637 (set-buffer (setq tmp-buf (get-buffer-create ediff-tmp-buffer)))
1638 (erase-buffer)
1640 (format
1650 (set-buffer meta-diff-buff)
1652 (insert-buffer-substring tmp-buf)
1655 (ediff-kill-buffer-carefully meta-diff-buff)
1656 (error "Session %d compares versions of file. Such session must be active to enable multifile patch collection" sessionNum )))
1660 "Collect custom diffs of marked sessions in buffer `*Ediff Multifile Diffs*'.
1667 (or (ediff-buffer-live-p ediff-meta-diff-buffer)
1668 (setq ediff-meta-diff-buffer
1669 (get-buffer-create
1670 (ediff-unique-buffer-name "*Ediff Multifile Diffs" "*"))))
1671 (ediff-with-current-buffer ediff-meta-diff-buffer
1672 (setq buffer-read-only nil)
1673 (erase-buffer))
1677 (display-buffer ediff-meta-diff-buffer 'not-this-window)
1678 (ediff-with-current-buffer ediff-meta-diff-buffer
1679 (set-buffer-modified-p nil)
1680 (setq buffer-read-only t))
1682 (with-current-buffer ediff-meta-diff-buffer
1688 "Show the multi-file patch associated with this group session."
1691 (meta-buf (ediff-event-buffer last-command-event))
1694 (if (ediff-buffer-live-p patchbuffer)
1695 (ediff-with-current-buffer patchbuffer
1702 (set-buffer (get-buffer-create ediff-tmp-buffer))
1703 (erase-buffer)
1704 (insert-buffer-substring patchbuffer)
1706 (display-buffer ediff-tmp-buffer 'not-this-window)
1708 (error "The patch buffer wasn't found"))))
1711 ;; This function executes in meta buffer. It knows where event happened.
1716 (meta-buf (ediff-event-buffer last-command-event))
1719 (session-buf (ediff-get-session-buffer info))
1736 (ediff-update-meta-buffer meta-buf nil session-number))
1739 (ediff-with-current-buffer meta-buf
1748 (if (ediff-buffer-live-p session-buf)
1749 (ediff-show-meta-buffer session-buf)
1753 (format
1767 (setq ediff-parent-meta-buffer
1768 (quote ,ediff-meta-buffer)
1772 (setcar (quote ,info) ediff-meta-buffer))))))
1777 (file-directory-p file1))
1778 (if (ediff-buffer-live-p session-buf)
1779 (ediff-show-meta-buffer session-buf)
1789 (setq ediff-parent-meta-buffer
1790 (quote ,ediff-meta-buffer)
1794 (setcar (quote ,info) ediff-meta-buffer))))))
1798 ;; handle an individual session with a live control buffer
1799 ((ediff-buffer-live-p session-buf)
1800 (ediff-with-current-buffer session-buf
1815 (if (ediff-buffer-live-p ,(current-buffer))
1816 (ediff-show-meta-buffer
1817 ,(current-buffer) ,session-number)))
1819 (setq ediff-meta-buffer ,(current-buffer)
1822 (setq ediff-merge-store-file
1828 (file-name-nondirectory file1))
1831 ;; ediff-control-buffer back to the meta
1834 (quote ,info) ediff-control-buffer))))
1836 ((ediff-one-filegroup-metajob) ; needs 1 file arg
1844 (if (ediff-buffer-live-p
1845 ,(current-buffer))
1846 (ediff-show-meta-buffer
1847 ,(current-buffer)
1850 (setq ediff-meta-buffer ,(current-buffer)
1853 (setq ediff-merge-store-file
1859 (file-name-nondirectory file1))) )
1861 ;; ediff-control-buffer back to the meta
1864 (quote ,info) ediff-control-buffer)))))
1865 ((not (ediff-metajob3)) ; need 2 file args
1873 (if (ediff-buffer-live-p
1874 ,(current-buffer))
1875 (ediff-show-meta-buffer
1876 ,(current-buffer)
1879 (setq ediff-meta-buffer ,(current-buffer)
1882 (setq ediff-merge-store-file
1888 (file-name-nondirectory file1))) )
1890 ;; ediff-control-buffer back to the meta
1893 (quote ,info) ediff-control-buffer)))))
1894 ((ediff-metajob3) ; need 3 file args
1902 (if (ediff-buffer-live-p
1903 ,(current-buffer))
1904 (ediff-show-meta-buffer
1905 ,(current-buffer)
1908 (setq ediff-merge-store-file
1914 (file-name-nondirectory file1))) )
1915 (setq ediff-meta-buffer , (current-buffer)
1919 ;; the value of ediff-control-buffer back to
1923 ;; ediff-control-buffer
1925 (quote ,info) ediff-control-buffer)))))
1934 (buf (ediff-event-buffer last-command-event))
1937 (if (ediff-buffer-live-p ctl-buf)
1938 ;; check if this is ediff-control-buffer or ediff-meta-buffer
1939 (if (ediff-with-current-buffer ctl-buf
1940 (eq (key-binding "q") 'ediff-quit-meta-buffer))
1941 ;; it's a meta-buffer -- last action should just display it
1942 (ediff-show-meta-buffer ctl-buf t)
1943 ;; it's a session buffer -- invoke go back to session
1944 (ediff-with-current-buffer ctl-buf
1950 (ediff-with-current-buffer buf
1955 ;; If session number is t, means don't update meta buffer
1956 (defun ediff-show-meta-buffer (&optional meta-buf session-number)
1957 "Show the session group buffer."
1963 (setq meta-buf (or meta-buf ediff-meta-buffer))
1966 ((not (ediff-buffer-live-p meta-buf))
1971 (ediff-update-meta-buffer meta-buf nil session-number))
1974 (t (ediff-cleanup-meta-buffer meta-buf)))
1976 (ediff-with-current-buffer meta-buf
1978 (cond ((setq wind (ediff-get-visible-buffer-window meta-buf))
1982 (set-window-buffer wind meta-buf)
1985 (set-window-buffer ediff-window-C meta-buf)
1988 (set-window-buffer ediff-window-A meta-buf)
1991 (set-window-buffer ediff-window-B meta-buf)
1995 (ediff-get-visible-buffer-window ediff-registry-buffer))
1999 (set-window-buffer (selected-window) meta-buf))
2001 (set-window-buffer (selected-window) meta-buf)))
2005 (setq wind (ediff-get-visible-buffer-window meta-buf))))
2015 (defun ediff-show-current-session-meta-buffer ()
2017 (ediff-show-meta-buffer nil ediff-meta-session-number))
2020 "Display the session group buffer for a selected session group."
2023 (meta-buf (ediff-event-buffer last-command-event))
2026 (ediff-with-current-buffer meta-or-session-buf
2027 (ediff-show-meta-buffer nil t))))
2034 (if (not (ediff-buffer-live-p ediff-registry-buffer))
2037 ;; for some reason, point moves in ediff-registry-buffer, so we preserve it
2039 (ediff-with-current-buffer ediff-registry-buffer
2042 (ediff-get-visible-buffer-window ediff-registry-buffer))
2044 (set-window-buffer wind ediff-registry-buffer)
2047 (set-window-buffer ediff-window-C ediff-registry-buffer)
2050 (set-window-buffer ediff-window-A ediff-registry-buffer)
2053 (set-window-buffer ediff-window-B ediff-registry-buffer)
2056 (ediff-get-visible-buffer-window ediff-meta-buffer))
2060 (set-window-buffer (selected-window) ediff-registry-buffer))
2062 (set-window-buffer (selected-window) ediff-registry-buffer)))
2068 (ediff-get-visible-buffer-window ediff-registry-buffer)))
2081 ;; buffer. Otherwise, it will just go over the buffer and update activity marks
2084 (defun ediff-update-meta-buffer (meta-buf &optional must-redraw session-number)
2085 (if (ediff-buffer-live-p meta-buf)
2086 (ediff-with-current-buffer meta-buf
2088 (cond (must-redraw ; completely redraw the meta buffer
2091 (ediff-update-session-marker-in-dir-meta-buffer
2093 (t ; update what changed only, but scan the entire meta buffer
2094 (ediff-update-markers-in-dir-meta-buffer ediff-meta-list)))
2103 (ediff-with-current-buffer (current-buffer)
2104 (if (ediff-buffer-live-p ediff-registry-buffer)
2105 (ediff-redraw-registry-buffer)
2106 (ediff-prepare-meta-buffer
2110 'ediff-redraw-registry-buffer
2116 (defun ediff-cleanup-meta-buffer (meta-buffer)
2117 (if (ediff-buffer-live-p meta-buffer)
2118 (ediff-with-current-buffer meta-buffer
2119 (ediff-update-meta-buffer meta-buffer)
2120 (if (ediff-buffer-live-p ediff-parent-meta-buffer)
2121 (ediff-update-meta-buffer
2122 ediff-parent-meta-buffer nil ediff-meta-session-number)))))
2125 (defun ediff-safe-to-quit (meta-buffer)
2126 (if (ediff-buffer-live-p meta-buffer)
2129 buffer-read-only)
2130 ;;(ediff-update-meta-buffer meta-buffer)
2131 (ediff-with-current-buffer meta-buffer
2134 (if (ediff-buffer-live-p
2135 (ediff-get-group-buffer lis)) ; in progress
2140 (defun ediff-quit-meta-buffer ()
2141 "If the group has no active session, delete the meta buffer.
2142 If no session is in progress, ask to confirm before deleting meta buffer.
2143 Otherwise, bury the meta buffer.
2144 If this is a session registry buffer then just bury it."
2146 (let* ((buf (current-buffer))
2147 (dir-diffs-buffer ediff-dir-diffs-buffer)
2148 (meta-diff-buffer ediff-meta-diff-buffer)
2150 (parent-buf ediff-parent-meta-buffer)
2151 (dont-show-registry (eq buf ediff-registry-buffer)))
2153 (bury-buffer)
2154 ;;(ediff-cleanup-meta-buffer buf)
2159 (ediff-dispose-of-meta-buffer buf))
2161 (bury-buffer))
2165 (ediff-update-meta-buffer parent-buf nil session-number)
2166 (ediff-kill-buffer-carefully dir-diffs-buffer)
2167 (ediff-kill-buffer-carefully meta-diff-buffer)
2168 (if (ediff-buffer-live-p parent-buf)
2171 (ediff-show-meta-buffer parent-buf session-number)))
2176 (defun ediff-dispose-of-meta-buffer (buf)
2178 (ediff-with-current-buffer buf
2179 (if (ediff-buffer-live-p ediff-dir-diffs-buffer)
2180 (kill-buffer ediff-dir-diffs-buffer)))
2181 (kill-buffer buf))
2185 ;; BUF is the buffer where this happened and POINT is the position
2190 (if (and point (ediff-buffer-live-p buf))
2191 (ediff-with-current-buffer buf
2218 (extent-at point (current-buffer) 'ediff-meta-info) ; xemacs
2229 (defsubst ediff-get-session-number-at-pos (point &optional meta-buffer)
2230 (setq meta-buffer (if (ediff-buffer-live-p meta-buffer)
2231 meta-buffer
2232 (current-buffer)))
2233 (ediff-with-current-buffer meta-buffer
2247 (setq overl (next-extent (current-buffer))))
2269 (setq overl (previous-extent (current-buffer))))
2283 ;; goto the top of the registry buffer.
2291 ;; buffer.
2292 (defun ediff-patch-file-form-meta (file &optional startup-hooks)
2294 (meta-buf (ediff-event-buffer last-command-event))
2300 (if (or (file-directory-p file) (string-match "/dev/null" file))
2301 (error "`%s' is not an ordinary file" (file-name-as-directory file)))
2302 (setq session-buf (ediff-get-session-buffer info)
2306 (or (ediff-buffer-live-p session-buf) ; either an active patch session
2309 "Patch has already been applied to this file -- can't repeat!"))
2311 (ediff-with-current-buffer meta-patchbuf
2315 (ediff-patch-file-internal meta-patchbuf file startup-hooks)))))
2326 (ediff-update-meta-buffer (current-buffer) 'must-redraw))
2336 (ediff-update-meta-buffer (current-buffer) 'must-redraw))
2358 (ediff-set-file-eqstatus fileinfo1 nil)
2359 (ediff-set-file-eqstatus fileinfo2 nil)
2360 (ediff-set-file-eqstatus fileinfo3 nil)
2382 (ediff-update-meta-buffer (current-buffer) 'must-redraw))
2391 (ediff-set-file-eqstatus fileinfo1 t)
2392 (ediff-set-file-eqstatus fileinfo2 t)
2402 ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
2403 ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))