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")
))