Function: ediff-do-merge

ediff-do-merge is a byte-compiled function defined in ediff-merg.el.gz.

Signature

(ediff-do-merge DIFF-NUM &optional REMERGING)

Source Code

;; Defined in /usr/src/emacs/lisp/vc/ediff-merg.el.gz
;; Go over all diffs starting with DIFF-NUM and copy regions into buffer C
;; according to the state of the difference.
;; Since ediff-copy-diff refuses to copy identical diff regions, there is
;; no need to optimize ediff-do-merge any further.
;;
;; If re-merging, change state of merge in all diffs starting with
;; DIFF-NUM, except those where the state is prefer-* or where it is
;; `default-*' or `combined' but the buf C region appears to be modified
;; since last set by default.
(defun ediff-do-merge (diff-num &optional remerging)
  (if (< diff-num 0) (setq diff-num 0))
  (let ((n diff-num)
	;;(default-state-of-merge (format "%S" ediff-default-variant))
	do-not-copy state-of-merge)
    (while (< n ediff-number-of-differences)
      (setq do-not-copy nil) ; reset after each cycle
      (if (= (mod n 10) 0)
	  (message "%s buffers A & B into C ... region %d of %d"
		   (if remerging "Re-merging" "Merging")
		   n
		   ediff-number-of-differences))

      (setq state-of-merge (ediff-get-state-of-merge n))

      (if remerging
	  ;;(let ((reg-A (ediff-get-region-contents n 'A ediff-control-buffer))
	  ;;	(reg-B (ediff-get-region-contents n 'B ediff-control-buffer))
	  ;;	(reg-C (ediff-get-region-contents n 'C ediff-control-buffer)))
	  (progn

	    ;; if region was edited since it was first set by default
	    (if (or (ediff-merge-changed-from-default-p n)
		    ;; was preferred
		    (string-match "prefer" state-of-merge))
		;; then ignore
		(setq do-not-copy t))

	    ;; change state of merge for this diff, if necessary
	    (if (and (string-match "\\(default\\|combined\\)" state-of-merge)
		     (not do-not-copy))
		(ediff-set-state-of-merge
		 n (format "%S" ediff-default-variant)))
	    ))

      ;; state-of-merge may have changed via ediff-set-state-of-merge, so
      ;; check it once again
      (setq state-of-merge (ediff-get-state-of-merge n))

      (or do-not-copy
	  (if (string= state-of-merge "combined")
	      ;; use n+1 because ediff-combine-diffs works via user numbering
	      ;; of diffs, which is 1+ to what ediff uses internally
	      (ediff-combine-diffs (1+ n) 'batch)
	    (ediff-copy-diff
	     n (if (string-match "-A" state-of-merge) 'A 'B) 'C 'batch)))
      (setq n (1+ n)))
    (message "Merging buffers A & B into C ... Done")
    ))