(diff-context-mid-hunk-header-re): New const.

(diff-font-lock-keywords, diff-context->unified)
(diff-reverse-direction, diff-fixup-modifs, diff-sanity-check-hunk)
(diff-hunk-text, diff-find-source-location): Use it.
(diff-post-command-hook): Let the user edit the hunk headers.
This commit is contained in:
Stefan Monnier 2008-05-26 17:25:44 +00:00
parent dc49f3766b
commit bf6970a5f6
2 changed files with 45 additions and 27 deletions

View file

@ -369,6 +369,8 @@ when editing big diffs)."
(defconst diff-hunk-header-re-unified
"^@@ -\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? \\+\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? @@")
(defconst diff-context-mid-hunk-header-re
"--- \\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? ----$")
(defvar diff-font-lock-keywords
`((,(concat "\\(" diff-hunk-header-re-unified "\\)\\(.*\\)$")
@ -376,7 +378,7 @@ when editing big diffs)."
("^\\(\\*\\{15\\}\\)\\(.*\\)$" ;context
(1 diff-hunk-header-face) (2 diff-function-face))
("^\\*\\*\\* .+ \\*\\*\\*\\*". diff-hunk-header-face) ;context
("^--- .+ ----$" . diff-hunk-header-face) ;context
(,diff-context-mid-hunk-header-re . diff-hunk-header-face) ;context
("^[0-9,]+[acd][0-9,]+$" . diff-hunk-header-face) ;normal
("^---$" . diff-hunk-header-face) ;normal
;; For file headers, accept files with spaces, but be careful to rule
@ -977,7 +979,7 @@ With a prefix argument, convert unified format to context format."
(reversible t))
(replace-match "")
(unless (re-search-forward
"^--- \\([0-9]+\\),\\(-?[0-9]+\\) ----$" nil t)
diff-context-mid-hunk-header-re nil t)
(error "Can't find matching `--- n1,n2 ----' line"))
(let ((line2s (match-string 1))
(line2e (match-string 2))
@ -1068,11 +1070,14 @@ else cover the whole buffer."
(when (= (char-after) ?-) (delete-char 1) (insert "+"))
(forward-line 1))
(let ((half1 (delete-and-extract-region half1s (point))))
(unless (looking-at "^--- \\([0-9]+,-?[0-9]+\\) ----$")
(unless (looking-at diff-context-mid-hunk-header-re)
(insert half1)
(error "Can't find matching `--- n1,n2 ----' line"))
(let ((str1 (match-string 1)))
(replace-match lines1 nil nil nil 1)
(let* ((str1end (or (match-end 2) (match-end 1)))
(str1 (buffer-substring (match-beginning 1) str1end)))
(goto-char str1end)
(insert lines1)
(delete-region (match-beginning 1) str1end)
(forward-line 1)
(let ((half2s (point)))
(while (looking-at "[!+ \\][ \t]\\|#")
@ -1137,7 +1142,7 @@ else cover the whole buffer."
(if old1
(unless (string= new1 old1) (replace-match new1 t t nil 2))
(goto-char (match-end 2)) (insert "," new1))))
((looking-at "--- \\([0-9]+\\),\\([0-9]*\\) ----$")
((looking-at diff-context-mid-hunk-header-re)
(when (> (+ space bang plus) 0)
(let* ((old1 (match-string 1))
(old2 (match-string 2))
@ -1189,25 +1194,29 @@ See `after-change-functions' for the meaning of BEG, END and LEN."
(goto-char (car diff-unhandled-changes))
;; Maybe we've cut the end of the hunk before point.
(if (and (bolp) (not (bobp))) (backward-char 1))
;; We used to fixup modifs on all the changes, but it turns out
;; that it's safer not to do it on big changes, for example
;; when yanking a big diff, since we might then screw up perfectly
;; correct values. -stef
;; (unless (ignore-errors
;; (diff-beginning-of-hunk)
;; (save-excursion
;; (diff-end-of-hunk)
;; (> (point) (car diff-unhandled-changes))))
;; (goto-char (car diff-unhandled-changes))
;; (re-search-forward diff-hunk-header-re (cdr diff-unhandled-changes))
;; (diff-beginning-of-hunk))
;; (diff-fixup-modifs (point) (cdr diff-unhandled-changes))
;; We used to fixup modifs on all the changes, but it turns out that
;; it's safer not to do it on big changes, e.g. when yanking a big
;; diff, or when the user edits the header, since we might then
;; screw up perfectly correct values. --Stef
(diff-beginning-of-hunk)
(when (save-excursion
(let* ((style (if (looking-at "\\*\\*\\*") 'context))
(start (line-beginning-position (if (eq style 'context) 3 2)))
(mid (if (eq style 'context)
(save-excursion
(re-search-forward diff-context-mid-hunk-header-re
nil t)))))
(when (and ;; Don't try to fixup changes in the hunk header.
(> (car diff-unhandled-changes) start)
;; Don't try to fixup changes in the mid-hunk header either.
(or (not mid)
(< (cdr diff-unhandled-changes) (match-beginning 0))
(> (car diff-unhandled-changes) (match-end 0)))
(save-excursion
(diff-end-of-hunk nil 'donttrustheader)
(>= (point) (cdr diff-unhandled-changes)))
;; Don't try to fixup changes past the end of the hunk.
(>= (point) (cdr diff-unhandled-changes))))
(diff-fixup-modifs (point) (cdr diff-unhandled-changes)))))
(setq diff-unhandled-changes nil)))
(setq diff-unhandled-changes nil))))
(defun diff-next-error (arg reset)
;; Select a window that displays the current buffer so that point
@ -1367,7 +1376,7 @@ Only works for unified diffs."
(1+ (- (string-to-number (match-string 2))
(string-to-number (match-string 1))))
1))
(if (not (looking-at "--- \\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? ----$"))
(if (not (looking-at diff-context-mid-hunk-header-re))
(error "Unrecognized context diff second hunk header format")
(forward-line)
(diff-sanity-check-context-hunk-half
@ -1447,7 +1456,7 @@ char-offset in TEXT."
;; context diff
(forward-line 2)
(setq src-pos (point))
(re-search-forward "^--- " nil t)
(re-search-forward diff-context-mid-hunk-header-re nil t)
(forward-line 0)
(setq divider-pos (point))
(forward-line 1)
@ -1563,7 +1572,8 @@ SWITCHED is non-nil if the patch is already applied."
(error "Can't find the hunk header")
(if other (match-string 1)
(if (match-end 3) (match-string 3)
(unless (re-search-forward "^--- \\([0-9,]+\\)" nil t)
(unless (re-search-forward
diff-context-mid-hunk-header-re nil t)
(error "Can't find the hunk separator"))
(match-string 1)))))
(file (or (diff-find-file-name other) (error "Can't find the file")))