From: "Alfred M. Szmidt" <ams@gnu.org>
To: Juri Linkov <juri@linkov.net>
Cc: ofv@wanadoo.es, emacs-devel@gnu.org
Subject: Re: On the adoption of transient.el
Date: Sat, 07 Aug 2021 21:42:33 -0400 [thread overview]
Message-ID: <E1mCXph-000755-6H@fencepost.gnu.org> (raw)
In-Reply-To: <877dgzebux.fsf@mail.linkov.net> (message from Juri Linkov on Fri, 06 Aug 2021 02:20:06 +0300)
Currently I'm finishing implementation of a new vc command that
will allow committing from a diff buffer.
This sounds similar to my diff-commit-hunk.el hack; but it is entierly
VC agonstic.
So for example, after
displaying all changes with e.g. 'C-x v D' you can remove
some unneeded hunks (with e.g. 'M-k' 'diff-hunk-kill'),
then on the remaining hunks type 'C-c C-c' in the diff buffer.
It will create a usual *vc-log* buffer where typing 'C-c C-c'
will commit only changes from the diff buffer. Internally
it works by running three git commands:
`git stash push -m stash_name -- list_of_file_names_from_diff`
`cat diff_buffer.patch | git am` # should also handle return code
`git stash pop -q`
===File ~/diff-commit-hunk.el===============================
;;;; diff-commit-hunk.el --- commit parts of a hunk in `diff-mode'
(require 'diff-mode)
(defun current-buffer-file-name ()
(buffer-file-name (current-buffer)))
(defun restore-source-file ()
(with-current-buffer (current-buffer)
(erase-buffer)
(insert-buffer "*diff-commit-hunk*")
(write-file (current-buffer-file-name)))
(remove-hook 'vc-checkin-hook 'restore-source-file))
(defmacro with-original-file (&rest body)
"Reverts associated source file temporarily in a `diff-mode'
buffer to the latest found in VCS, executes BODY and commits the
changes back VCS."
`(progn
(save-excursion
(diff-goto-source)
(let ((buf (current-buffer)))
(with-current-buffer (get-buffer-create "*diff-commit-hunk*")
(erase-buffer)
(insert-buffer buf)))
(vc-revert-file (current-buffer-file-name)))
,@body
(save-excursion
(diff-goto-source)
(write-file (current-buffer-file-name))
(add-hook 'vc-checkin-hook 'restore-source-file)
(vc-checkin (list (current-buffer-file-name))
(vc-backend (current-buffer-file-name))))))
;;;###autoload
(defun diff-commit-hunk ()
"Revert associated source file to the latest version from VCS,
and apply (and commit) current hunk."
(interactive)
(with-original-file
(let ((diff-advance-after-apply-hunk nil))
(diff-apply-hunk))))
;;;###autoload
(defun diff-commit-all ()
"Like `diff-commit-hunk', but applies all hunks in the current
diff buffer."
(interactive)
(with-original-file
(goto-char (point-min))
(diff-hunk-next) ;Skip header.
(while (not (eobp))
(diff-apply-hunk))))
(define-key diff-mode-map (kbd "s-a") #'diff-commit-hunk)
(define-key diff-mode-map (kbd "H-a") #'diff-commit-all)
;;;; diff-commit-hunk.el ends here.
============================================================
next prev parent reply other threads:[~2021-08-08 1:42 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-03 21:13 On the adoption of transient.el Gabriel
2021-07-05 14:24 ` Philip Kaludercic
2021-07-05 16:09 ` Gabriel
2021-07-05 17:00 ` Stefan Monnier
2021-07-05 19:16 ` Lars Ingebrigtsen
2021-07-05 16:50 ` Yuri Khan
2021-07-05 17:06 ` Eli Zaretskii
2021-07-05 17:29 ` Yuri Khan
2021-07-05 17:49 ` Stefan Monnier
2021-07-05 18:09 ` Philip Kaludercic
2021-08-01 20:19 ` Rudolf Adamkovič
2021-08-01 21:08 ` T.V Raman
2021-08-01 21:24 ` Arthur Miller
2021-08-03 13:07 ` Jonas Bernoulli
2021-08-03 20:00 ` Arthur Miller
2021-08-14 3:17 ` Arthur Miller
2021-08-14 12:54 ` Óscar Fuentes
2021-08-14 20:45 ` Arthur Miller
2021-08-15 21:57 ` John Yates
2021-08-16 1:05 ` Arthur Miller
2021-08-16 1:35 ` Stefan Monnier
2021-08-16 2:36 ` Arthur Miller
2021-08-01 21:25 ` Arthur Miller
2021-08-04 11:22 ` Philip Kaludercic
2021-08-04 15:56 ` Óscar Fuentes
2021-08-04 18:56 ` T.V Raman
2021-08-04 19:57 ` Jesse Millwood
2021-08-04 21:45 ` T.V Raman
2021-08-05 7:01 ` Arthur Miller
2021-08-05 8:59 ` Eric S Fraga
2021-08-05 9:23 ` Tim Cross
2021-08-05 10:37 ` Eric S Fraga
2021-08-05 11:01 ` Eli Zaretskii
2021-08-05 14:45 ` Óscar Fuentes
2021-08-05 16:17 ` Eli Zaretskii
2021-08-05 23:17 ` Juri Linkov
2021-08-06 6:11 ` Eli Zaretskii
2021-08-06 2:13 ` Phil Sainty
2021-08-05 23:20 ` Juri Linkov
2021-08-06 12:39 ` John Yates
2021-08-06 14:42 ` Stefan Monnier
2021-08-06 17:20 ` Omar Polo
2021-08-10 7:22 ` Juri Linkov
2021-08-10 10:32 ` John Yates
2021-08-08 1:21 ` Dmitry Gutov
2021-08-10 7:15 ` Juri Linkov
2021-08-10 12:40 ` Dmitry Gutov
2021-08-11 6:58 ` Juri Linkov
2021-08-13 3:06 ` Dmitry Gutov
2021-08-08 1:42 ` Alfred M. Szmidt [this message]
2021-08-10 7:18 ` Juri Linkov
2021-08-10 8:16 ` Alfred M. Szmidt
2021-08-11 6:56 ` Juri Linkov
2021-08-05 9:38 ` Arthur Miller
2021-08-05 9:51 ` Jean-Christophe Helary
2021-08-05 14:33 ` T.V Raman
2021-08-05 14:55 ` Eric S Fraga
2021-08-05 15:05 ` Arthur Miller
2021-08-06 23:02 ` Rudolf Adamkovič
2021-08-07 2:03 ` T.V Raman
2021-08-07 3:15 ` Phil Sainty
2021-08-07 10:19 ` Jonas Bernoulli
2021-08-07 15:42 ` T.V Raman
2021-07-05 19:51 ` Jim Porter
-- strict thread matches above, loose matches on Subject: below --
2022-07-31 9:08 Manuel Uberti
2022-07-31 13:25 ` T.V Raman
2022-07-31 20:03 ` Juri Linkov
2022-08-21 16:04 ` Juri Linkov
2022-08-01 3:32 ` Richard Stallman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1mCXph-000755-6H@fencepost.gnu.org \
--to=ams@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=juri@linkov.net \
--cc=ofv@wanadoo.es \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.