[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: vc-resolve-conflicts is not flexible enough for alternate SCM system
From: |
Jonathan Kamens |
Subject: |
Re: vc-resolve-conflicts is not flexible enough for alternate SCM systems |
Date: |
Sun, 6 Jan 2002 07:45:04 -0500 |
> Date: Sat, 5 Jan 2002 22:29:02 -0500
> From: Jonathan Kamens <jik@kamens.brookline.ma.us>
>
> 3) Use these functions in vc-resolve-conflicts for producing the
> buffers used by ediff. If resolve-select-original returns true,
> then call ediff-merge-buffers-with-ancestor instead of
> editff-merge-buffers, and don't set ediff-default-variant.
I've changed my mind; I think it's safer to set ediff-default-variant
always. New patch:
--- /usr/share/emacs/21.1/lisp/vc.el Mon Sep 24 18:29:15 2001
+++ vc.el Sun Jan 6 07:44:03 2002
@@ -1925,11 +1925,45 @@
(if (zerop status) (message "Merge successful")
(if (fboundp 'smerge-mode) (smerge-mode 1))
(if (y-or-n-p "Conflicts detected. Resolve them now? ")
- (if (fboundp 'smerge-ediff)
+ (if (and (fboundp 'smerge-ediff)
+ (not (vc-find-backend-function (vc-backend file)
+ 'resolve-select-yours)))
(smerge-ediff)
(vc-resolve-conflicts name-A name-B))
(message "File contains conflict markers"))))
+(defun vc-default-resolve-select-yours (backend)
+ (goto-char (point-min))
+ (let ((found nil))
+ (while (re-search-forward (concat "^<<<<<<< "
+ (regexp-quote file-name) "\n") nil t)
+ (setq found t)
+ (replace-match "")
+ (if (not (re-search-forward "^=======\n" nil t))
+ (error "Malformed conflict marker"))
+ (replace-match "")
+ (let ((start (point)))
+ (if (not (re-search-forward "^>>>>>>> [0-9.]+\n" nil t))
+ (error "Malformed conflict marker"))
+ (delete-region start (point))))
+ found))
+
+(defun vc-default-resolve-select-theirs (backend)
+ (goto-char (point-min))
+ (while (re-search-forward (concat "^<<<<<<< "
+ (regexp-quote file-name) "\n") nil t)
+ (let ((start (match-beginning 0)))
+ (if (not (re-search-forward "^=======\n" nil t))
+ (error "Malformed conflict marker"))
+ (delete-region start (point))
+ (if (not (re-search-forward "^>>>>>>> [0-9.]+\n" nil t))
+ (error "Malformed conflict marker"))
+ (replace-match "")))
+ t)
+
+(defun vc-default-resolve-select-original (backend)
+ nil)
+
(defvar vc-ediff-windows)
(defvar vc-ediff-result)
(eval-when-compile
@@ -1945,53 +1979,52 @@
(vc-ensure-vc-buffer)
(let* ((found nil)
(file-name (file-name-nondirectory buffer-file-name))
+ (backend (vc-backend buffer-file-name))
(your-buffer (generate-new-buffer
(concat "*" file-name
" " (or name-A "WORKFILE") "*")))
(other-buffer (generate-new-buffer
(concat "*" file-name
" " (or name-B "CHECKED-IN") "*")))
+ (ancestor-buffer (generate-new-buffer
+ (concat "*" file-name
+ " " (or name-B "ORIGINAL") "*")))
(result-buffer (current-buffer)))
(save-excursion
(set-buffer your-buffer)
(erase-buffer)
(insert-buffer result-buffer)
- (goto-char (point-min))
- (while (re-search-forward (concat "^<<<<<<< "
- (regexp-quote file-name) "\n") nil t)
- (setq found t)
- (replace-match "")
- (if (not (re-search-forward "^=======\n" nil t))
- (error "Malformed conflict marker"))
- (replace-match "")
- (let ((start (point)))
- (if (not (re-search-forward "^>>>>>>> [0-9.]+\n" nil t))
- (error "Malformed conflict marker"))
- (delete-region start (point))))
- (if (not found)
+ (if (not (vc-call-backend backend 'resolve-select-yours))
(progn
(kill-buffer your-buffer)
(kill-buffer other-buffer)
+ (kill-buffer ancestor-buffer)
(error "No conflict markers found")))
+
(set-buffer other-buffer)
(erase-buffer)
(insert-buffer result-buffer)
+ (vc-call-backend backend 'resolve-select-theirs)
+
+ (set-buffer ancestor-buffer)
+ (erase-buffer)
+ (insert-buffer result-buffer)
(goto-char (point-min))
- (while (re-search-forward (concat "^<<<<<<< "
- (regexp-quote file-name) "\n") nil t)
- (let ((start (match-beginning 0)))
- (if (not (re-search-forward "^=======\n" nil t))
- (error "Malformed conflict marker"))
- (delete-region start (point))
- (if (not (re-search-forward "^>>>>>>> [0-9.]+\n" nil t))
- (error "Malformed conflict marker"))
- (replace-match "")))
+ (if (not (vc-call-backend backend 'resolve-select-original))
+ (progn
+ (kill-buffer ancestor-buffer)
+ (setq ancestor-buffer nil)))
+
(let ((config (current-window-configuration))
(ediff-default-variant 'default-B))
;; Fire up ediff.
- (set-buffer (ediff-merge-buffers your-buffer other-buffer))
+ (set-buffer
+ (if ancestor-buffer
+ (ediff-merge-buffers-with-ancestor your-buffer other-buffer
+ ancestor-buffer)
+ (ediff-merge-buffers your-buffer other-buffer)))
;; Ediff is now set up, and we are in the control buffer.
;; Do a few further adjustments and take precautions for exit.