Subject: Re: bug#12584: refine diff-hunk broken for unified diff with "\ No newline at end of file" meta text
From: Stefan Monnier <[email-masked]>
To: Le Wang <[email-masked]>
Cc: [email-masked]
Date: Fri, 26 Oct 2012 11:51:48 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

> Here is refine working with "diff -c"
> http://puu.sh/1bXRG
> Here is refein not working with "diff -u" because of the
> aforementioned meta text
> http://puu.sh/1bXPJ

Thank you.  I've installed the patch below which should fix this problem.

        Stefan

=== modified file 'lisp/vc/diff-mode.el'
--- lisp/vc/diff-mode.el	2012-10-23 18:40:23 +0000
+++ lisp/vc/diff-mode.el	2012-10-26 15:50:33 +0000
@@ -482,7 +482,9 @@
           (re-search-forward (if diff-valid-unified-empty-line
                                  "^[- \n]" "^[- ]")
                                      nil t nold)
-                  (line-beginning-position 2)))
+                  (line-beginning-position
+                   ;; Skip potential "\ No newline at end of file".
+                   (if (looking-at ".*\n\\\\") 3 2))))
                (endnew
                 ;; The hunk may end with a bunch of "+" lines, so the `end' is
                 ;; then further than computed above.
@@ -490,7 +492,9 @@
                   (re-search-forward (if diff-valid-unified-empty-line
                                          "^[+ \n]" "^[+ ]")
                                      nil t nnew)
-                  (line-beginning-position 2))))
+                  (line-beginning-position
+                   ;; Skip potential "\ No newline at end of file".
+                   (if (looking-at ".*\n\\\\") 3 2)))))
           (setq end (max endold endnew)))))
     ;; We may have a first evaluation of `end' thanks to the hunk header.
     (unless end
@@ -1972,7 +1976,12 @@
       (goto-char beg)
       (pcase style
         (`unified
-         (while (re-search-forward "^\\(?:-.*\n\\)+\\(\\)\\(?:\\+.*\n\\)+"
+         (while (re-search-forward
+                 (eval-when-compile
+                   (let ((no-LF-at-eol-re "\\(?:\\\\.*\n\\)?"))
+                     (concat "^\\(?:-.*\n\\)+" no-LF-at-eol-re
+                             "\\(\\)"
+                             "\\(?:\\+.*\n\\)+" no-LF-at-eol-re)))
                                    end t)
            (smerge-refine-subst (match-beginning 0) (match-end 1)
                                 (match-end 1) (match-end 0)