]> git.eshelyaron.com Git - emacs.git/commitdiff
(smerge-resolve): New arg `safe'.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 16 Aug 2007 20:04:36 +0000 (20:04 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 16 Aug 2007 20:04:36 +0000 (20:04 +0000)
(smerge-resolve-all, smerge-batch-resolve): New function.
(smerge-refine): Make sure `diff' returns the expected result.
(smerge-parsep-re): New const.
(smerge-mode): Use it to adjust paragraph-separate.

lisp/ChangeLog
lisp/smerge-mode.el

index 33b2c21eeed785d00267d7090437f40ac26562ad..f4cedbb7a22d004b49382eaa80662de288ab97ab 100644 (file)
@@ -1,5 +1,11 @@
 2007-08-16  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * smerge-mode.el (smerge-resolve): New arg `safe'.
+       (smerge-resolve-all, smerge-batch-resolve): New function.
+       (smerge-refine): Make sure `diff' returns the expected result.
+       (smerge-parsep-re): New const.
+       (smerge-mode): Use it to adjust paragraph-separate.
+
        * progmodes/perl-mode.el (perl-font-lock-syntactic-keywords):
        Correctly match / regexp matchers as first char on a line when
        fontifying only that line.
index ef80ef81679b3b8aaffd6b7b8440947b10612a70..e3484bb0a4871179837c48467ba1d179a05e053f 100644 (file)
@@ -324,7 +324,8 @@ Can be nil if the style is undecided, or else:
 (defvar smerge-resolve-function
   (lambda () (error "Don't know how to resolve"))
   "Mode-specific merge function.
-The function is called with no argument and with the match data set
+The function is called with zero or one argument (non-nil if the resolution
+function should only apply safe heuristics) and with the match data set
 according to `smerge-match-conflict'.")
 (add-to-list 'debug-ignored-errors "Don't know how to resolve")
 
@@ -378,7 +379,7 @@ according to `smerge-match-conflict'.")
        (smerge-remove-props (or beg (point-min)) (or end (point-max)))
        (push event unread-command-events)))))
 
-(defun smerge-resolve ()
+(defun smerge-resolve (&optional safe)
   "Resolve the conflict at point intelligently.
 This relies on mode-specific knowledge and thus only works in
 some major modes.  Uses `smerge-resolve-function' to do the actual work."
@@ -393,8 +394,10 @@ some major modes.  Uses `smerge-resolve-function' to do the actual work."
    ;; Mode-specific conflict resolution.
    ((condition-case nil
         (atomic-change-group
-         (funcall smerge-resolve-function)
-         t)
+          (if safe
+              (funcall smerge-resolve-function safe)
+            (funcall smerge-resolve-function))
+          t)
       (error nil))
     ;; Nothing to do: the resolution function has done it already.
     nil)
@@ -412,6 +415,31 @@ some major modes.  Uses `smerge-resolve-function' to do the actual work."
     (error "Don't know how to resolve")))
   (smerge-auto-leave))
 
+(defun smerge-resolve-all ()
+  "Perform automatic resolution on all conflicts."
+  (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    (while (re-search-forward smerge-begin-re nil t)
+      (condition-case nil
+          (progn
+            (smerge-match-conflict)
+            (smerge-resolve 'safe))
+        (error nil)))))
+
+(defun smerge-batch-resolve ()
+  ;; command-line-args-left is what is left of the command line.
+  (if (not noninteractive)
+      (error "`smerge-batch-resolve' is to be used only with -batch"))
+  (while command-line-args-left
+    (let ((file (pop command-line-args-left)))
+      (message "Resolving conflicts in %s..." file)
+      (when (file-readable-p file)
+        (with-current-buffer (find-file-noselect file)
+          (smerge-resolve-all)
+          (save-buffer)
+          (kill-buffer (current-buffer)))))))
+
 (defun smerge-keep-base ()
   "Revert to the base version."
   (interactive)
@@ -677,7 +705,9 @@ Point is moved to the end of the conflict."
     (unwind-protect
         (with-temp-buffer
           (let ((coding-system-for-read 'emacs-mule))
-            (call-process diff-command nil t nil file1 file2))
+            ;; Don't forget -a to make sure diff treats it as a text file
+            ;; even if it contains \0 and such.
+            (call-process diff-command nil t nil "-a" file1 file2))
           ;; Process diff's output.
           (goto-char (point-min))
           (while (not (eobp))
@@ -831,6 +861,10 @@ buffer names."
     (message "Please resolve conflicts now; exit ediff when done")))
 
 
+(defconst smerge-parsep-re
+  (concat smerge-begin-re "\\|" smerge-end-re "\\|"
+          smerge-base-re "\\|" smerge-other-re "\\|"))
+
 ;;;###autoload
 (define-minor-mode smerge-mode
   "Minor mode to simplify editing output from the diff3 program.
@@ -845,6 +879,13 @@ buffer names."
       (while (smerge-find-conflict)
        (save-excursion
          (font-lock-fontify-region (match-beginning 0) (match-end 0) nil)))))
+  (if (string-match (regexp-quote smerge-parsep-re) paragraph-separate)
+      (unless smerge-mode
+        (set (make-local-variable 'paragraph-separate)
+             (replace-match "" t t paragraph-separate)))
+    (when smerge-mode
+        (set (make-local-variable 'paragraph-separate)
+             (concat smerge-parsep-re paragraph-separate))))
   (unless smerge-mode
     (smerge-remove-props (point-min) (point-max))))