From 74dea9e1c1ca344e0542cfbd751707641d69375e Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 20 Jul 2007 20:41:58 +0000 Subject: [PATCH] (change-log-resolve-conflict): Don't lose data if the merge fails. --- lisp/ChangeLog | 5 +++++ lisp/add-log.el | 37 ++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index bf5b5da1be2..81e89689913 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2007-07-20 Stefan Monnier + + * add-log.el (change-log-resolve-conflict): Don't lose data if the + merge fails. + 2007-07-20 Dan Nicolaescu * progmodes/compile.el (compilation-auto-jump-to-first-error): diff --git a/lisp/add-log.el b/lisp/add-log.el index 63212a75dc8..caea921d25f 100644 --- a/lisp/add-log.el +++ b/lisp/add-log.el @@ -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) -- 2.39.5