From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Alfred M. Szmidt" Newsgroups: gmane.emacs.devel Subject: Re: master 4803fba487 1/2: 'C-x v v' on a diff buffer commits it as a patch (bug#52349) Date: Tue, 30 Aug 2022 09:25:31 -0400 Message-ID: References: <166171593185.16640.41619657947456727@vcs2.savannah.gnu.org> <20220828194533.23A6BC00889@vcs2.savannah.gnu.org> <87r10znm0y.fsf@gnus.org> <83fshfvvyn.fsf@gnu.org> Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="37848"; mail-complaints-to="usenet@ciao.gmane.io" Cc: larsi@gnus.org, juri@jurta.org, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Aug 30 15:26:34 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oT1GE-0009hZ-3N for ged-emacs-devel@m.gmane-mx.org; Tue, 30 Aug 2022 15:26:34 +0200 Original-Received: from localhost ([::1]:54378 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oT1GC-0007RR-P0 for ged-emacs-devel@m.gmane-mx.org; Tue, 30 Aug 2022 09:26:32 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:45956) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oT1FR-0006QZ-FR for emacs-devel@gnu.org; Tue, 30 Aug 2022 09:25:45 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]:46878) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oT1FQ-0003xF-M2; Tue, 30 Aug 2022 09:25:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=Date:References:Subject:In-Reply-To:To:From: mime-version; bh=buqQ3IKc5eR5k9JOB3cYYwaM9wQTx5ta7jGYsXx13cA=; b=rEC0pkD8Kd34 aQBPy2fJ5Q9Qs0b5tbqjsQ+ISRtkkb7QINC0T8yaj1tNIUZnD1ewvmtZQndsmTCAG6LQzxBde3x2D sk8ehnT1f2k6bsN7puq2nnrw0tE88F0Hxc/Q/5zGSa67ZouxlFg9IJFXKrKBQF47O7Q4gjARuI8dR /9zyiJooLdLf2gc6+z2HeXp2S8LtOzRkKKyDWp6aotIY/QWNUr1wXUOCSFORDkE/itd3oONQwUKKr 5OJabqVKJGZup89Jqnh5T2mBYWcUrtIKZHofiYcZ0xd/R5/nbzlcd5jvm/JtlpvoB5wneMmC/2MNj aRC7o71HJVvFAZvRnXyv5w==; Original-Received: from ams by fencepost.gnu.org with local (Exim 4.90_1) (envelope-from ) id 1oT1FD-0006Ip-2M; Tue, 30 Aug 2022 09:25:41 -0400 In-Reply-To: <83fshfvvyn.fsf@gnu.org> (message from Eli Zaretskii on Mon, 29 Aug 2022 19:46:40 +0300) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:294341 Archived-At: > > 'C-x v v' on a diff buffer commits it as a patch (bug#52349) > > Excellent! This is going to save me a lot of work in the future. Bother: This is only supported for Git, which is against the spirit of VC, and definitely against the spirit of "C-x v v". This is a pitty indeed. Specially seeing that it is easy enough to get this working for all VCSs. Here is a hack I wrote ages ago, and this works for just about everything, it doesn't do exactly what is needed (e.g, this works on a single file basis) but it isn't too hard to get that working. ===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. ============================================================