Function: emerge-merge-directories
emerge-merge-directories is an autoloaded, interactive and
byte-compiled function defined in emerge.el.gz.
Signature
(emerge-merge-directories A-DIR B-DIR ANCESTOR-DIR OUTPUT-DIR)
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/vc/emerge.el.gz
;;;###autoload
(defun emerge-merge-directories (a-dir b-dir ancestor-dir output-dir)
(interactive
(list
(read-directory-name "A directory: " nil nil 'confirm)
(read-directory-name "B directory: " nil nil 'confirm)
(read-directory-name "Ancestor directory (null for none): " nil nil 'confirm)
(read-directory-name "Output directory (null for none): " nil nil 'confirm)))
;; Check that we're not on a line
(if (not (and (bolp) (eolp)))
(error "There is text on this line"))
;; Turn null strings into nil to indicate directories not used.
(if (and ancestor-dir (string-equal ancestor-dir ""))
(setq ancestor-dir nil))
(if (and output-dir (string-equal output-dir ""))
(setq output-dir nil))
;; Canonicalize the directory names
(setq a-dir (expand-file-name a-dir))
(if (not (string-equal (substring a-dir -1) "/"))
(setq a-dir (concat a-dir "/")))
(setq b-dir (expand-file-name b-dir))
(if (not (string-equal (substring b-dir -1) "/"))
(setq b-dir (concat b-dir "/")))
(if ancestor-dir
(progn
(setq ancestor-dir (expand-file-name ancestor-dir))
(if (not (string-equal (substring ancestor-dir -1) "/"))
(setq ancestor-dir (concat ancestor-dir "/")))))
(if output-dir
(progn
(setq output-dir (expand-file-name output-dir))
(if (not (string-equal (substring output-dir -1) "/"))
(setq output-dir (concat output-dir "/")))))
;; Set the mark to where we start
(push-mark)
;; Find out what files are in the directories.
(let* ((a-dir-files
(directory-files a-dir nil emerge-merge-directories-filename-regexp))
(b-dir-files
(directory-files b-dir nil emerge-merge-directories-filename-regexp))
(ancestor-dir-files
(and ancestor-dir
(directory-files ancestor-dir nil
emerge-merge-directories-filename-regexp)))
(all-files (sort (nconc (copy-sequence a-dir-files)
(copy-sequence b-dir-files)
(copy-sequence ancestor-dir-files))
(function string-lessp))))
;; Remove duplicates from all-files.
(let ((p all-files))
(while p
(if (and (cdr p) (string-equal (car p) (car (cdr p))))
(setcdr p (cdr (cdr p)))
(setq p (cdr p)))))
;; Generate the control lines for the various files.
(while all-files
(let ((f (car all-files)))
(setq all-files (cdr all-files))
(if (and a-dir-files (string-equal (car a-dir-files) f))
(progn
(insert "A=" a-dir f "\t")
(setq a-dir-files (cdr a-dir-files))))
(if (and b-dir-files (string-equal (car b-dir-files) f))
(progn
(insert "B=" b-dir f "\t")
(setq b-dir-files (cdr b-dir-files))))
(if (and ancestor-dir-files (string-equal (car ancestor-dir-files) f))
(progn
(insert "ancestor=" ancestor-dir f "\t")
(setq ancestor-dir-files (cdr ancestor-dir-files))))
(if output-dir
(insert "output=" output-dir f "\t"))
(delete-char -1)
(insert "\n")))))