Function: diff-fixup-modifs
diff-fixup-modifs is an interactive and byte-compiled function defined
in diff-mode.el.gz.
Signature
(diff-fixup-modifs START END)
Documentation
Fixup the hunk headers (in case the buffer was modified).
START and END are either taken from the region (if a prefix arg is given) or else cover the whole buffer.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/vc/diff-mode.el.gz
(defun diff-fixup-modifs (start end)
"Fixup the hunk headers (in case the buffer was modified).
START and END are either taken from the region (if a prefix arg is given) or
else cover the whole buffer."
(interactive (if (or current-prefix-arg (use-region-p))
(list (region-beginning) (region-end))
(list (point-min) (point-max))))
(let ((inhibit-read-only t))
(save-excursion
(goto-char end) (diff-end-of-hunk nil 'donttrustheader)
(let ((plus 0) (minus 0) (space 0) (bang 0))
(while (and (= (forward-line -1) 0) (<= start (point)))
(if (not (looking-at
(concat diff-hunk-header-re-unified
"\\|[-*][-*][-*] [0-9,]+ [-*][-*][-*][-*]$"
"\\|--- .+\n\\+\\+\\+ ")))
(pcase (char-after)
(?\s (cl-incf space))
(?+ (cl-incf plus))
(?- (unless ;; In git format-patch "^-- $" signifies
;; the end of the patch.
(and (eq diff-buffer-type 'git)
(looking-at "^-- $"))
(cl-incf minus)))
(?! (cl-incf bang))
((or ?\\ ?#) nil)
(?\n (if diff-valid-unified-empty-line
(cl-incf space)
(setq space 0 plus 0 minus 0 bang 0)))
(_ (setq space 0 plus 0 minus 0 bang 0)))
(cond
((looking-at diff-hunk-header-re-unified)
(let* ((old1 (match-string 2))
(old2 (match-string 4))
(new1 (number-to-string (+ space minus)))
(new2 (number-to-string (+ space plus))))
(if old2
(unless (string= new2 old2) (replace-match new2 t t nil 4))
(goto-char (match-end 3))
(insert "," new2))
(if old1
(unless (string= new1 old1) (replace-match new1 t t nil 2))
(goto-char (match-end 1))
(insert "," new1))))
((looking-at diff-context-mid-hunk-header-re)
(when (> (+ space bang plus) 0)
(let* ((old1 (match-string 1))
(old2 (match-string 2))
(new (number-to-string
(+ space bang plus -1 (string-to-number old1)))))
(unless (string= new old2) (replace-match new t t nil 2)))))
((looking-at "\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]*\\) \\*\\*\\*\\*$")
(when (> (+ space bang minus) 0)
(let* ((old (match-string 1))
(new (format
(concat "%0" (number-to-string (length old)) "d")
(+ space bang minus -1 (string-to-number old)))))
(unless (string= new old) (replace-match new t t nil 2))))))
(setq space 0 plus 0 minus 0 bang 0)))))))