emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] scratch/add-vdiff e8d3d26 236/258: vdiff-magit: Try to switch res


From: Justin Burkett
Subject: [elpa] scratch/add-vdiff e8d3d26 236/258: vdiff-magit: Try to switch resolve functions gracefully
Date: Wed, 17 May 2017 08:14:00 -0400 (EDT)

branch: scratch/add-vdiff
commit e8d3d2623b4f2249d78ff5297400a3fb7d32d66e
Author: Justin Burkett <address@hidden>
Commit: Justin Burkett <address@hidden>

    vdiff-magit: Try to switch resolve functions gracefully
    
    vdiff-magit-resolve does not handle 3-way merges (yet at least) so we flip 
to
    magit-ediff-resolve if one is detected.
---
 vdiff-magit.el | 159 ++++++++++++++++++++++++++++++---------------------------
 1 file changed, 83 insertions(+), 76 deletions(-)

diff --git a/vdiff-magit.el b/vdiff-magit.el
index 0fc4bcf..23e59e5 100644
--- a/vdiff-magit.el
+++ b/vdiff-magit.el
@@ -121,82 +121,89 @@ conflicts, including those already resolved by Git, use
        (user-error "There are no unresolved conflicts"))
      (list (magit-completing-read "Resolve file" unmerged nil t nil nil
                                   (car (member current unmerged))))))
-  (magit-with-toplevel
-    (with-current-buffer (find-file-noselect file)
-      ;; taken from `smerge-ediff'
-      (require 'smerge-mode)
-      (let* ((smerge-buffer (current-buffer))
-             (mode major-mode)
-             ;;(ediff-default-variant 'default-B)
-             (config (current-window-configuration))
-             (filename (file-name-nondirectory (or buffer-file-name "-")))
-             (mine (generate-new-buffer
-                    (concat "*" filename " "
-                            (smerge--get-marker smerge-begin-re "MINE")
-                            "*")))
-             (other (generate-new-buffer
-                     (concat "*" filename " "
-                             (smerge--get-marker smerge-end-re "OTHER")
-                             "*")))
-             base)
-        (with-current-buffer mine
-          (buffer-disable-undo)
-          (insert-buffer-substring smerge-buffer)
-          (goto-char (point-min))
-          (while (smerge-find-conflict)
-            (when (match-beginning 2)
-              ;; This is not supported yet, so we abort here
-              ;; (setq base t)
-              (when (buffer-live-p mine)
-                (kill-buffer mine))
-              (when (buffer-live-p other)
-                (kill-buffer other))
-              (set-window-configuration config)
-              (user-error "Sorry vdiff-magit does not support three-way merges 
yet."))
-            (smerge-keep-n 1))
-          (buffer-enable-undo)
-          (set-buffer-modified-p nil)
-          (funcall mode))
-
-        (with-current-buffer other
-          (buffer-disable-undo)
-          (insert-buffer-substring smerge-buffer)
-          (goto-char (point-min))
-          (while (smerge-find-conflict)
-            (smerge-keep-n 3))
-          (buffer-enable-undo)
-          (set-buffer-modified-p nil)
-          (funcall mode))
-
-        ;; (when base
-        ;;   (setq base (generate-new-buffer
-        ;;               (or name-base
-        ;;                   (concat "*" filename " "
-        ;;                           (smerge--get-marker smerge-base-re "BASE")
-        ;;                           "*"))))
-        ;;   (with-current-buffer base
-        ;;     (buffer-disable-undo)
-        ;;     (insert-buffer-substring smerge-buffer)
-        ;;     (goto-char (point-min))
-        ;;     (while (smerge-find-conflict)
-        ;;       (if (match-end 2)
-        ;;           (smerge-keep-n 2)
-        ;;         (delete-region (match-beginning 0) (match-end 0))))
-        ;;     (buffer-enable-undo)
-        ;;     (set-buffer-modified-p nil)
-        ;;     (funcall mode)))
-
-        (vdiff-buffers3
-         mine other smerge-buffer
-         (lambda (mine other smerge-buffer)
-           (with-current-buffer smerge-buffer
-             (when (yes-or-no-p (format "Conflict resolution finished; save 
%s?"
-                                        buffer-file-name))
-               (save-buffer)))
-           (dolist (buf (list mine other))
-             (when (buffer-live-p buf)
-               (kill-buffer buf))))
-         t)))))
+  (let ((switch-to-ediff
+         (catch 'switch-to-ediff
+           (magit-with-toplevel
+             (with-current-buffer (find-file-noselect file)
+               ;; taken from `smerge-ediff'
+               (require 'smerge-mode)
+               (let* ((smerge-buffer (current-buffer))
+                      (mode major-mode)
+                      ;;(ediff-default-variant 'default-B)
+                      (config (current-window-configuration))
+                      (filename (file-name-nondirectory (or buffer-file-name 
"-")))
+                      (mine (generate-new-buffer
+                             (concat "*" filename " "
+                                     (smerge--get-marker smerge-begin-re 
"MINE")
+                                     "*")))
+                      (other (generate-new-buffer
+                              (concat "*" filename " "
+                                      (smerge--get-marker smerge-end-re 
"OTHER")
+                                      "*")))
+                      base)
+                 (with-current-buffer mine
+                   (buffer-disable-undo)
+                   (insert-buffer-substring smerge-buffer)
+                   (goto-char (point-min))
+                   (while (smerge-find-conflict)
+                     (when (match-beginning 2)
+                       ;; This is not supported yet, so we abort here
+                       ;; (setq base t)
+                       (when (buffer-live-p mine)
+                         (kill-buffer mine))
+                       (when (buffer-live-p other)
+                         (kill-buffer other))
+                       (set-window-configuration config)
+                       (message "Switching to ediff. vdiff-magit does not 
support three-way merges.")
+                       (throw 'switch-to-ediff t))
+                     (smerge-keep-n 1))
+                   (buffer-enable-undo)
+                   (set-buffer-modified-p nil)
+                   (funcall mode))
+
+                 (with-current-buffer other
+                   (buffer-disable-undo)
+                   (insert-buffer-substring smerge-buffer)
+                   (goto-char (point-min))
+                   (while (smerge-find-conflict)
+                     (smerge-keep-n 3))
+                   (buffer-enable-undo)
+                   (set-buffer-modified-p nil)
+                   (funcall mode))
+
+                 ;; (when base
+                 ;;   (setq base (generate-new-buffer
+                 ;;               (or name-base
+                 ;;                   (concat "*" filename " "
+                 ;;                           (smerge--get-marker 
smerge-base-re "BASE")
+                 ;;                           "*"))))
+                 ;;   (with-current-buffer base
+                 ;;     (buffer-disable-undo)
+                 ;;     (insert-buffer-substring smerge-buffer)
+                 ;;     (goto-char (point-min))
+                 ;;     (while (smerge-find-conflict)
+                 ;;       (if (match-end 2)
+                 ;;           (smerge-keep-n 2)
+                 ;;         (delete-region (match-beginning 0) (match-end 0))))
+                 ;;     (buffer-enable-undo)
+                 ;;     (set-buffer-modified-p nil)
+                 ;;     (funcall mode)))
+
+                 (vdiff-buffers3
+                  mine other smerge-buffer
+                  (lambda (mine other smerge-buffer)
+                    (with-current-buffer smerge-buffer
+                      (when (yes-or-no-p (format "Conflict resolution 
finished; save %s?"
+                                                 buffer-file-name))
+                        (save-buffer)))
+                    (dolist (buf (list mine other))
+                      (when (buffer-live-p buf)
+                        (kill-buffer buf))))
+                  t)
+                 ;; return nil for the catch statement
+                 nil))))))
+    (when (eq t switch-to-ediff)
+      (magit-ediff-resolve file))))
 
 ;;;###autoload
 (defun vdiff-magit-stage (file)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]