1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-07 08:00:48 -08:00

Factor out vc-git--with-apply-temp-to-staging

* lisp/vc/vc-git.el (vc-git--with-apply-temp-to-staging): New macro.
(vc-git-checkin): Use it.
This commit is contained in:
Sean Whitton 2025-05-18 12:35:13 +01:00
parent 913b4e1c97
commit a4424fb8cd

View file

@ -1111,6 +1111,19 @@ It is based on `log-edit-mode', and has Git-specific extensions."
("Sign-Off" . ,(boolean-arg-fn "--signoff")))
comment)))
(defmacro vc-git--with-apply-temp-to-staging (temp &rest body)
(declare (indent 1) (debug (symbolp body)))
`(let ((,temp (make-nearby-temp-file ,(format "git-%s" temp))))
(unwind-protect (progn ,@body
;; This uses `file-local-name' to strip the
;; TRAMP prefix, not `file-relative-name',
;; because we've had at least one problem
;; report where relativizing the file name
;; meant that Git failed to find it.
(vc-git-command nil 0 nil "apply" "--cached"
(file-local-name ,temp)))
(delete-file ,temp))))
(defun vc-git-checkin (files comment &optional _rev)
(let* ((file1 (or (car files) default-directory))
(root (vc-git-root file1))
@ -1194,8 +1207,7 @@ It is based on `log-edit-mode', and has Git-specific extensions."
(t (push file-name to-stash)))
(setq pos (point))))))
(unless (string-empty-p vc-git-patch-string)
(let ((patch-file (make-nearby-temp-file "git-patch"))
;; Temporarily countermand the let-binding at the
(let (;; Temporarily countermand the let-binding at the
;; beginning of this function.
(coding-system-for-write
(coding-system-change-eol-conversion
@ -1203,12 +1215,9 @@ It is based on `log-edit-mode', and has Git-specific extensions."
;; to have the Unix EOL format, because Git expects
;; that, even on Windows.
(or pcsw vc-git-commits-coding-system) 'unix)))
(with-temp-file patch-file
(insert vc-git-patch-string))
(unwind-protect
(vc-git-command nil 0 nil "apply" "--cached"
(file-local-name patch-file))
(delete-file patch-file))))
(vc-git--with-apply-temp-to-staging patch
(with-temp-file patch
(insert vc-git-patch-string)))))
(when to-stash (vc-git--stash-staged-changes to-stash)))
(let ((files (and only (not vc-git-patch-string) files))
(args (vc-git--log-edit-extract-headers comment))
@ -1218,15 +1227,9 @@ It is based on `log-edit-mode', and has Git-specific extensions."
(when (and msg-file (file-exists-p msg-file))
(delete-file msg-file))
(when to-stash
(let ((cached (make-nearby-temp-file "git-cached")))
(unwind-protect
(progn
(with-temp-file cached
(vc-git-command t 0 nil "stash" "show" "-p"))
(vc-git-command nil 0 "apply" "--cached"
(file-local-name cached)))
(delete-file cached))
(vc-git-command nil 0 nil "stash" "drop"))))))
(vc-git--with-apply-temp-to-staging cached
(with-temp-file cached
(vc-git-command t 0 nil "stash" "show" "-p")))))))
(when msg-file
(let ((coding-system-for-write
(or pcsw vc-git-commits-coding-system)))
@ -1282,6 +1285,8 @@ It is based on `log-edit-mode', and has Git-specific extensions."
(unwind-protect
(progn
(vc-git-command nil 0 nil "read-tree" "HEAD")
;; See `vc-git--with-apply-temp-to-staging'
;; regarding use of `file-local-name'.
(vc-git-command nil 0 nil "apply" "--cached"
(file-local-name cached))
(setq tree (git-string "write-tree")))