changeset 82007:c934794f2e69

(change-log-resolve-conflict): Don't lose data if the merge fails.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 20 Jul 2007 20:41:58 +0000
parents 5942689a5d21
children fa89e40167b9
files lisp/ChangeLog lisp/add-log.el
diffstat 2 files changed, 31 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Jul 20 20:31:29 2007 +0000
+++ b/lisp/ChangeLog	Fri Jul 20 20:41:58 2007 +0000
@@ -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):
--- a/lisp/add-log.el	Fri Jul 20 20:31:29 2007 +0000
+++ b/lisp/add-log.el	Fri Jul 20 20:41:58 2007 +0000
@@ -1043,17 +1043,32 @@
 
 (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)