]> git.eshelyaron.com Git - emacs.git/commitdiff
(change-log-resolve-conflict): Don't lose data if the merge fails.
authorStefan Monnier <monnier@iro.umontreal.ca>
Fri, 20 Jul 2007 20:41:58 +0000 (20:41 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Fri, 20 Jul 2007 20:41:58 +0000 (20:41 +0000)
lisp/ChangeLog
lisp/add-log.el

index bf5b5da1be23aca6225df4c4d04210c3b4089613..81e8968991389b86dc041e00455fb378b102b4bb 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * add-log.el (change-log-resolve-conflict): Don't lose data if the
+       merge fails.
+
 2007-07-20  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * progmodes/compile.el (compilation-auto-jump-to-first-error):
index 63212a75dc82873ac766269e82ef2171d791eb67..caea921d25f1a0154a5ca32417ed091e31ba4fd8 100644 (file)
@@ -1043,17 +1043,32 @@ Point is assumed to be at the start of the entry."
 
 (defun change-log-resolve-conflict ()
   "Function to be used in `smerge-resolve-function'."
-  (let ((buf (current-buffer)))
-    (with-temp-buffer
-      (insert-buffer-substring buf (match-beginning 1) (match-end 1))
-      (save-match-data (change-log-mode))
-      (let ((other-buf (current-buffer)))
-       (with-current-buffer buf
-         (save-excursion
-           (save-restriction
-             (narrow-to-region (match-beginning 0) (match-end 0))
-             (replace-match (match-string 3) t t)
-             (change-log-merge other-buf))))))))
+  (save-excursion
+    (save-restriction
+      (narrow-to-region (match-beginning 0) (match-end 0))
+      (let ((mb1 (match-beginning 1))
+            (me1 (match-end 1))
+            (mb3 (match-beginning 3))
+            (me3 (match-end 3))
+            (tmp1 (generate-new-buffer " *changelog-resolve-1*"))
+           (tmp2 (generate-new-buffer " *changelog-resolve-2*")))
+       (unwind-protect
+           (let ((buf (current-buffer)))
+             (with-current-buffer tmp1
+                (change-log-mode)
+               (insert-buffer-substring buf mb1 me1))
+             (with-current-buffer tmp2
+                (change-log-mode)
+               (insert-buffer-substring buf mb3 me3)
+                ;; Do the merge here instead of inside `buf' so as to be
+                ;; more robust in case change-log-merge fails.
+               (change-log-merge tmp1))
+             (goto-char (point-max))
+             (delete-region (point-min)
+                            (prog1 (point)
+                              (insert-buffer-substring tmp2))))
+         (kill-buffer tmp1)
+         (kill-buffer tmp2))))))
 
 ;;;###autoload
 (defun change-log-merge (other-log)