(smerge-refine): Also work on "same change conflicts".
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 15 Jan 2008 21:40:09 +0000 (21:40 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Tue, 15 Jan 2008 21:40:09 +0000 (21:40 +0000)
(smerge-makeup-conflict): New command.

lisp/ChangeLog
lisp/smerge-mode.el

index a8c9130..efd4728 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-15  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * smerge-mode.el (smerge-refine): Also work on "same change conflicts".
+       (smerge-makeup-conflict): New command.
+
 2008-01-15  Thien-Thi Nguyen  <ttn@gnuvola.org>
 
        * log-edit.el (log-edit): Doc fix.
index fe7d06e..e7352c4 100644 (file)
@@ -851,10 +851,12 @@ replace chars to try and eliminate some spurious differences."
   (remove-overlays (match-beginning 0) (match-end 0) 'smerge 'refine)
   (smerge-ensure-match 1)
   (smerge-ensure-match 3)
-  (smerge-refine-subst (match-beginning 1) (match-end 1)
-                       (match-beginning 3) (match-end 3)
-                       '((smerge . refine)
-                         (face . smerge-refined-change))))
+  ;; Match 1 and 3 may be one and the same in case of trivial diff3 -A conflict.
+  (let ((n1 (if (eq (match-end 1) (match-end 3)) 2 1)))
+    (smerge-refine-subst (match-beginning n1) (match-end n1)
+                         (match-beginning 3)  (match-end 3)
+                         '((smerge . refine)
+                           (face . smerge-refined-change)))))
 
 (defun smerge-diff (n1 n2)
   (smerge-match-conflict)
@@ -992,6 +994,32 @@ buffer names."
               (message "Conflict resolution finished; you may save the buffer")))))
     (message "Please resolve conflicts now; exit ediff when done")))
 
+(defun smerge-makeup-conflict (pt1 pt2 pt3 &optional pt4)
+  "Insert diff3 markers to make a new conflict.
+Uses point and mark for 2 of the relevant positions and previous marks
+for the other ones.
+By default, makes up a 2-way conflict,
+with a \\[universal-argument] prefix, makes up a 3-way conflict."
+  (interactive
+   (list (point)
+         (mark)
+         (progn (pop-mark) (mark))
+         (when current-prefix-arg (pop-mark) (mark))))
+  ;; Start from the end so as to avoid problems with pos-changes.
+  (destructuring-bind (pt1 pt2 pt3 &optional pt4)
+      (sort (list* pt1 pt2 pt3 (if pt4 (list pt4))) '>=)
+    (goto-char pt1) (beginning-of-line)
+    (insert ">>>>>>> OTHER\n")
+    (goto-char pt2) (beginning-of-line)
+    (insert "=======\n")
+    (goto-char pt3) (beginning-of-line)
+    (when pt4
+      (insert "||||||| BASE\n")
+      (goto-char pt4) (beginning-of-line))
+    (insert "<<<<<<< MINE\n"))
+  (if smerge-mode nil (smerge-mode 1))
+  (smerge-refine))
+      
 
 (defconst smerge-parsep-re
   (concat smerge-begin-re "\\|" smerge-end-re "\\|"