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: Sun, 04 Sep 2022 08:27:05 -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> <874jxnha6g.fsf@posteo.net> Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="30734"; mail-complaints-to="usenet@ciao.gmane.io" Cc: eliz@gnu.org, larsi@gnus.org, juri@jurta.org, emacs-devel@gnu.org To: Philip Kaludercic Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Sep 04 14:30:53 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 1oUom5-0007uF-KK for ged-emacs-devel@m.gmane-mx.org; Sun, 04 Sep 2022 14:30:53 +0200 Original-Received: from localhost ([::1]:55980 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oUom4-0001Ec-3D for ged-emacs-devel@m.gmane-mx.org; Sun, 04 Sep 2022 08:30:52 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:39160) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oUoiV-0007Vg-B2 for emacs-devel@gnu.org; Sun, 04 Sep 2022 08:27:11 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]:34484) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oUoiP-0004eZ-Rr; Sun, 04 Sep 2022 08:27:05 -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=cPEJgItxRUC0Ky4B29+8y+HP31LlhI5H4YK9Pbz2F1A=; b=Y4+YPoToChgP +a3EwHqS2wanVkE9VYwWjjFjbVn+PxSqHfIOYQuIth5/9sBZQX/PWcWKZlYdVX/8YT9uScMijoHGQ abSUymt1sFhia48HohnOgD84gwZEZJu7/ZJHAaZ87HucJD8MS0YRXQqxdvKyRPp2aAp2OuAVCgzJ0 QnbLHuW7brFjfQdW5O82YfljP+Exq0EOSnr7TotN/dVYUUFXlBCRTgDivpsMuJa7Z2tMGi3EsWSjj aYJLte9llNpH7kqOqYlvgXy2tjR2ChXTFmKxNv16ilZ5UTgV0WO5z9Lu5bFYNcOD+omtTcyBWBCph LQYUXhlVRUAidZHA+g0Jgw==; Original-Received: from ams by fencepost.gnu.org with local (Exim 4.90_1) (envelope-from ) id 1oUoiP-0002t7-9U; Sun, 04 Sep 2022 08:27:05 -0400 In-Reply-To: <874jxnha6g.fsf@posteo.net> (message from Philip Kaludercic on Sun, 04 Sep 2022 07:26:47 +0000) 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:294702 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. This feature looks very interesting to me. Could it be added to vc or as an package to GNU ELPA? Isn't it the same feature as being implemented (in a better manner)? > ===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. > ============================================================