; based on prcs's ediff integration by Jesse N. Glick, Ulrich (require 'ediff) (defvar svk-merge-last-control-window nil) (make-variable-buffer-local 'svk-merge-state) (set-default 'svk-merge-state nil) (defun svk-merge-start-hook () (setq svk-merge-last-control-window (current-buffer))) (defun svk-merge-startup (merge-state) (message "Starting SVK-ediff.") (save-excursion (set-buffer svk-merge-last-control-window) (message (concat "Running in buffer: " (buffer-name svk-merge-last-control-window))) (setq svk-merge-last-control-window nil) (message (concat "State: " (prin1-to-string merge-state))) (setq svk-merge-state merge-state) (let ((a-buf (ediff-get-buffer 'A)) (b-buf (ediff-get-buffer 'B)) (c-buf (ediff-get-buffer 'C)) (anc-buf (ediff-get-buffer 'Ancestor))) (save-excursion (if a-buf (progn (message "Handling working buffer") (set-buffer a-buf) (rename-buffer (cdr (assq 'working-label merge-state)) 'unique))) (if b-buf (progn (message "Handling selected buffer") (set-buffer b-buf) (rename-buffer (cdr (assq 'selected-label merge-state)) 'unique))) (if anc-buf (progn (message "Handling common buffer") (set-buffer anc-buf) (rename-buffer (cdr (assq 'common-label merge-state)) 'unique))) (if c-buf (progn (message "Handling merge buffer") (set-buffer c-buf) (rename-buffer (concat (cdr (assq 'output-file merge-state)) " (merging into)") 'unique))))))) (defun svk-merge-quit-hook () (if svk-merge-state (let ((state svk-merge-state)) (save-excursion (mapcar (lambda (which) (let ((b (ediff-get-buffer which))) (if b (kill-buffer b)))) '(A B Ancestor)) (let ((c-buf (ediff-get-buffer 'C))) (set-buffer c-buf) (write-file (cdr (assq 'output-file state)) 'confirm) (kill-buffer c-buf)) (signal-process (cdr (assq 'process state)) (cdr (assq 'signal state))))))) (add-hook 'ediff-mode-hook 'svk-merge-start-hook) (add-hook 'ediff-quit-hook 'svk-merge-quit-hook) (provide 'svk-ediff)