Function: ediff-filegroup-action

ediff-filegroup-action is an interactive and byte-compiled function defined in ediff-mult.el.gz.

Signature

(ediff-filegroup-action)

Documentation

Execute appropriate action for a selected session.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/vc/ediff-mult.el.gz
;; This function executes in meta buffer.  It knows where event happened.
(defun ediff-filegroup-action ()
  "Execute appropriate action for a selected session."
  (interactive)
  (let* ((pos (ediff-event-point last-command-event))
	 (meta-buf (ediff-event-buffer last-command-event))
	 ;; ediff-get-meta-info gives error if meta-buf or pos are invalid
	 (info (ediff-get-meta-info meta-buf pos))
	 (session-buf (ediff-get-session-buffer info))
	 (session-number (ediff-get-session-number-at-pos pos meta-buf))
	 (default-regexp (eval ediff-default-filtering-regexp t))
	 merge-autostore-dir file1 file2 file3 regexp)

    (setq file1 (ediff-get-session-objA-name info)
	  file2 (ediff-get-session-objB-name info)
	  file3 (ediff-get-session-objC-name info))

    ;; make sure we don't start on hidden sessions
    ;; ?H means marked for hiding. ?I means invalid (hidden).
    (if (memq (ediff-get-session-status info) '(?I))
	(progn
	  (beep)
	  (if (y-or-n-p "This session is marked as hidden, unmark? ")
	      (progn
		(ediff-set-session-status info nil)
		(ediff-update-meta-buffer meta-buf nil session-number))
	    (user-error "Aborted"))))

    (ediff-with-current-buffer meta-buf
      (setq merge-autostore-dir
	    (ediff-get-group-merge-autostore-dir ediff-meta-list))
      (goto-char pos) ; if the user clicked on session--move point there
      ;; First handle sessions involving directories (which are themselves
      ;; session groups)
      ;; After that handle individual sessions
      (cond ((ediff-meta-session-p info)
	     ;; do ediff/ediff-merge on subdirectories
	     (if (ediff-buffer-live-p session-buf)
		 (ediff-show-meta-buffer session-buf)
	       (setq regexp
		     (read-string
                      (format-prompt
                       "Filter filenames through regular expression"
                       default-regexp)
		      nil
		      'ediff-filtering-regexp-history
		      (eval ediff-default-filtering-regexp t)))
	       (ediff-directories-internal
		file1 file2 file3 regexp
		ediff-session-action-function
		ediff-metajob-name
		;; make it update (car info) after startup
		`(list (lambda ()
			 ;; child session group should know its parent
			 (setq ediff-parent-meta-buffer
			       (quote ,ediff-meta-buffer)
			       ediff-meta-session-number
			       ,session-number)
			 ;; and parent will know its child
			 (setcar (quote ,info) ediff-meta-buffer))))))

	    ;; Do ediff-revision on a subdirectory
	    ((and (ediff-one-filegroup-metajob)
		  (ediff-revision-metajob)
		  (file-directory-p file1))
	     (if (ediff-buffer-live-p session-buf)
		 (ediff-show-meta-buffer session-buf)
	       (setq regexp (read-string "Filter filenames through regular expression: "
					 nil 'ediff-filtering-regexp-history))
	       (ediff-directory-revisions-internal
		file1 regexp
		ediff-session-action-function ediff-metajob-name
		;; make it update (car info) after startup
		`(list (lambda ()
			 ;; child session group should know its parent and
			 ;; its number
			 (setq ediff-parent-meta-buffer
			       (quote ,ediff-meta-buffer)
			       ediff-meta-session-number
			       ,session-number)
			 ;; and parent will know its child
			 (setcar (quote ,info) ediff-meta-buffer))))))

	    ;; From here on---only individual session handlers

	    ;; handle an individual session with a live control buffer
	    ((ediff-buffer-live-p session-buf)
	     (ediff-with-current-buffer session-buf
	       (ediff-recenter 'no-rehighlight)))

	    ((ediff-problematic-session-p info)
	     (beep)
	     (if (y-or-n-p
		  "This session has no ancestor.  Merge without the ancestor? ")
		 (ediff-merge-files
		  file1 file2
		  ;; provide startup hooks
		  `(list (lambda ()
			     (add-hook
			      'ediff-after-quit-hook-internal
			      (lambda ()
				(if (ediff-buffer-live-p ,(current-buffer))
				    (ediff-show-meta-buffer
				     ,(current-buffer) ,session-number)))
			      nil 'local)
			     (setq ediff-meta-buffer ,(current-buffer)
				   ediff-meta-session-number
				   ,session-number)
			     (setq ediff-merge-store-file
				   ,(if (ediff-nonempty-string-p
					 merge-autostore-dir)
					(concat
					 merge-autostore-dir
					 ediff-merge-filename-prefix
					 (file-name-nondirectory file1))
				      ))
			     ;; make ediff-startup pass
			     ;; ediff-control-buffer back to the meta
			     ;; level; see below
			     (setcar
			      (quote ,info) ediff-control-buffer))))
	       (user-error "Aborted")))
	    ((ediff-one-filegroup-metajob)      ; needs 1 file arg
	     (funcall ediff-session-action-function
		      file1
		      ;; provide startup hooks
		      `(list (lambda ()
			       (add-hook
				'ediff-after-quit-hook-internal
				(lambda ()
				  (if (ediff-buffer-live-p
				       ,(current-buffer))
				      (ediff-show-meta-buffer
				       ,(current-buffer)
				       ,session-number)))
				nil 'local)
			       (setq ediff-meta-buffer ,(current-buffer)
				     ediff-meta-session-number
				     ,session-number)
			       (setq ediff-merge-store-file
				     ,(if (ediff-nonempty-string-p
					   merge-autostore-dir)
					  (concat
					   merge-autostore-dir
					   ediff-merge-filename-prefix
					   (file-name-nondirectory file1))) )
			       ;; make ediff-startup pass
			       ;; ediff-control-buffer back to the meta
			       ;; level; see below
			       (setcar
				(quote ,info) ediff-control-buffer)))))
	    ((not (ediff-metajob3))      ; need 2 file args
	     (funcall ediff-session-action-function
		      file1 file2
		      ;; provide startup hooks
		      `(list (lambda ()
			       (add-hook
				'ediff-after-quit-hook-internal
				(lambda ()
				  (if (ediff-buffer-live-p
				       ,(current-buffer))
				      (ediff-show-meta-buffer
				       ,(current-buffer)
				       ,session-number)))
				nil 'local)
			       (setq ediff-meta-buffer ,(current-buffer)
				     ediff-meta-session-number
				     ,session-number)
			       (setq ediff-merge-store-file
				     ,(if (ediff-nonempty-string-p
					   merge-autostore-dir)
					  (concat
					   merge-autostore-dir
					   ediff-merge-filename-prefix
					   (file-name-nondirectory file1))) )
			       ;; make ediff-startup pass
			       ;; ediff-control-buffer back to the meta
			       ;; level; see below
			       (setcar
				(quote ,info) ediff-control-buffer)))))
	    ((ediff-metajob3)      ; need 3 file args
	     (funcall ediff-session-action-function
		      file1 file2 file3
		      ;; arrange startup hooks
		      `(list (lambda ()
			       (add-hook
				'ediff-after-quit-hook-internal
				(lambda ()
				  (if (ediff-buffer-live-p
				       ,(current-buffer))
				      (ediff-show-meta-buffer
				       ,(current-buffer)
				       ,session-number)))
				nil 'local)
			       (setq ediff-merge-store-file
				     ,(if (ediff-nonempty-string-p
					   merge-autostore-dir)
					  (concat
					   merge-autostore-dir
					   ediff-merge-filename-prefix
					   (file-name-nondirectory file1))) )
			       (setq ediff-meta-buffer , (current-buffer)
				     ediff-meta-session-number
				     ,session-number)
			       ;; this arranges that ediff-startup will pass
			       ;; the value of ediff-control-buffer back to
			       ;; the meta level, to the record in the meta
			       ;; list containing the information about the
			       ;; session associated with that
			       ;; ediff-control-buffer
			       (setcar
				(quote ,info) ediff-control-buffer)))))
	    ) ; cond
      ) ; eval in meta-buf
    ))