From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Sean Whitton Newsgroups: gmane.emacs.bugs Subject: bug#57807: 29.0.50; Make vc-print-branch-log able to log multiple branches Date: Tue, 20 Sep 2022 15:54:39 -0700 Message-ID: <8735clu05s.fsf@melete.silentflame.com> References: <87czbxub4b.fsf@melete.silentflame.com> <86v8ppn5b2.fsf@mail.linkov.net> <87h719shi6.fsf@melete.silentflame.com> <861qsdktqo.fsf@mail.linkov.net> <87fsgs396r.fsf@melete.silentflame.com> <8635cs8s59.fsf@mail.linkov.net> <87leqk1day.fsf@melete.silentflame.com> <86o7vfpzya.fsf@mail.linkov.net> <87sfkos6as.fsf@melete.silentflame.com> <86bkrb7qt8.fsf@mail.linkov.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="33715"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) To: Juri Linkov , 57807@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Sep 21 02:07:24 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1oanGr-0008ZR-Mw for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 21 Sep 2022 02:07:23 +0200 Original-Received: from localhost ([::1]:35824 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oanGq-00043N-B0 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 20 Sep 2022 20:07:20 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:52686) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oam8t-0002fS-Jl for bug-gnu-emacs@gnu.org; Tue, 20 Sep 2022 18:55:06 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:60869) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1oam8s-0001kA-JI for bug-gnu-emacs@gnu.org; Tue, 20 Sep 2022 18:55:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1oam8s-0005EH-5R for bug-gnu-emacs@gnu.org; Tue, 20 Sep 2022 18:55:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Sean Whitton Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 20 Sep 2022 22:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 57807 X-GNU-PR-Package: emacs Original-Received: via spool by 57807-submit@debbugs.gnu.org id=B57807.166371449220084 (code B ref 57807); Tue, 20 Sep 2022 22:55:02 +0000 Original-Received: (at 57807) by debbugs.gnu.org; 20 Sep 2022 22:54:52 +0000 Original-Received: from localhost ([127.0.0.1]:59947 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oam8i-0005Dq-2S for submit@debbugs.gnu.org; Tue, 20 Sep 2022 18:54:52 -0400 Original-Received: from wout3-smtp.messagingengine.com ([64.147.123.19]:49429) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oam8e-0005Da-KM for 57807@debbugs.gnu.org; Tue, 20 Sep 2022 18:54:51 -0400 Original-Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailout.west.internal (Postfix) with ESMTP id 8695F32009A7; Tue, 20 Sep 2022 18:54:41 -0400 (EDT) Original-Received: from mailfrontend2 ([10.202.2.163]) by compute2.internal (MEProxy); Tue, 20 Sep 2022 18:54:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spwhitton.name; h=cc:content-type:date:date:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to; s=fm1; t=1663714481; x=1663800881; bh=P10Bt3D8Ja 4yapDiB6lskW8Vv40olvxKNwgpF+5ZQok=; b=id0bRnlA5HEJTVBwkQJHe2fJIo y+nAoMiV/J7N7jVNf/bjnmHAjZ2Uo+XRicpKh6Xpqhdzzh/n4aG5ovluudx/Pgdp Ku6O8Iw3VtHAoQzWcKpQ0SyXBVnvCxnqWwcI5nQ7GL9q2TCtOFt4ZWMeoe33Gn/j tYH0lpaI4kcKCO6I13JU/0VINAyQcjtoe3OKy40VHbpZrAWZfnmXwlIruu/r5I3j EOJisblWKY/XucUbadTELZRAUgzISsUizdLt652MLfGYUTykTEmzq5007kfeDXp5 664oO8cr1SfQCLZkKL1ZwavR+iJ2gZTWR5w/M5kkvuKVLugXYbPlIMIhVwMw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:date:feedback-id :feedback-id:from:from:in-reply-to:in-reply-to:message-id :mime-version:references:reply-to:sender:subject:subject:to:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; t=1663714481; x=1663800881; bh=P10Bt3D8Ja4yapDiB6lskW8Vv40o lvxKNwgpF+5ZQok=; b=J518SxMN2yUfMWLX8K8+e6fO11CwCF+xidNGRyi9/v1J fhYDUmrxKRkwXYMeweFXxhC2V/jI06Pffy4LKl0BuUAVzP59O3W4uNLuXf5cM4Ow 11myYN0ldwG7GEDvdQEu5LvAqYoeyR8byRO/ZYvmtjiQXP3bPPyq+5jStT3Q4Tk+ 4NbSJ5VujdInV5oSeZ9d9DGdXjfo/9dwX2PzuWn9OWBNQavbflmEysKtWbpQcvW5 pt0X8EpWoDqO+NWNpn2BoqBzQKy8WTeBlw4GT3OM+6Yq1FUJULWkfHMYDSsbLAYw XVdETprz7Un6EFox7H4gjL+bqQQ6xL9Xgz9E+HuRMA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrfeeftddgudeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufgjfhffkfgfgggtsehmtddtredtredtnecuhfhrohhmpefuvggrnhcu hghhihhtthhonhcuoehsphifhhhithhtohhnsehsphifhhhithhtohhnrdhnrghmvgeqne cuggftrfgrthhtvghrnhepkeevleffheetleehteeludetjeehfeehgfetteeftddtjeej jedvveevgfeghfehnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilh hfrhhomhepshhpfihhihhtthhonhesshhpfihhihhtthhonhdrnhgrmhgv X-ME-Proxy: Feedback-ID: i23c04076:Fastmail Original-Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 20 Sep 2022 18:54:40 -0400 (EDT) Original-Received: by melete.silentflame.com (Postfix, from userid 1000) id 7CA9C7EF4EB; Tue, 20 Sep 2022 15:54:39 -0700 (MST) In-Reply-To: <86bkrb7qt8.fsf@mail.linkov.net> (Juri Linkov's message of "Mon, 19 Sep 2022 09:42:59 +0300") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:243254 Archived-At: --=-=-= Content-Type: text/plain Hello, On Mon 19 Sep 2022 at 09:42AM +03, Juri Linkov wrote: > Thanks, this would be one of the most useful vc features. > I tried it out, and it works nicely. Only minor details: > > Previously 'git-pull' asked for a full command including command name "git". > I know there is no need to edit the command name "git", but splitting > the command between the prompt and the minibuffer looks a little odd. > > Also the previous version of 'vc-git--pushpull' sets 'compile-command' > to the edited command. It seems this is implemented to be able to > repeat the pull command with 'g' that is bound to 'recompile'. > I don't have a good idea how to fix this. Maybe by setting > another global variable, e.g. 'vc-last-command' after editing > the command in 'vc-do-command'. > > And also 'vc-do-async-command' reports the initial unedited command > with its "Running" message string. I've done something about all these in the attached. What do you think? -- Sean Whitton --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=v2-0001-Add-support-for-user-edits-to-VC-command-argument.patch >From 181241f981dce0610807f42e50a89713fafb9af0 Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Sun, 18 Sep 2022 14:47:23 -0700 Subject: [PATCH v2] Add support for user edits to VC command arguments * lisp/vc/vc-dispatcher.el (vc-pre-command-functions): New hook. (vc-want-edit-command-p): New variable. (vc-do-command): If vc-want-edit-command-p is non-nil, prompt the user to edit the VC command and arguments command before execution. Run the new hook. (vc-do-async-command): Use the new hook to insert into BUFFER the command that's next to be run. * lisp/vc/vc-git.el (vc-git--pushpull): Drop prompting code. Bind vc-want-edit-command-p so that vc-do-command handles the prompting. Use the new hook to update compile-command with the edited command. * lisp/vc/vc.el (vc-print-branch-log): A non-nil prefix argument now means vc-want-edit-command-p is bound to a non-nil value (bug#57807). --- lisp/vc/vc-dispatcher.el | 55 ++++++++++++++++++++++++++++++++-------- lisp/vc/vc-git.el | 31 ++++++++++------------ lisp/vc/vc.el | 18 ++++++++++--- 3 files changed, 71 insertions(+), 33 deletions(-) diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el index 88bf6627ae..459c2ae103 100644 --- a/lisp/vc/vc-dispatcher.el +++ b/lisp/vc/vc-dispatcher.el @@ -156,6 +156,9 @@ vc-parent-buffer (defvar vc-parent-buffer-name nil) (put 'vc-parent-buffer-name 'permanent-local t) +(defvar vc-want-edit-command-p nil + "If non-nil, let user edit the VC shell command before running it.") + ;; Common command execution logic (defun vc-process-filter (p s) @@ -262,6 +265,12 @@ vc-run-delayed (declare (indent 0) (debug (def-body))) `(vc-exec-after (lambda () ,@body))) +(defvar vc-pre-command-functions nil + "Hook run at the beginning of `vc-do-command'. +Each function is called inside the buffer in which the command +will be run and is passed 3 arguments: the COMMAND, the FILES and +the FLAGS.") + (defvar vc-post-command-functions nil "Hook run at the end of `vc-do-command'. Each function is called inside the buffer in which the command was run @@ -296,8 +305,27 @@ vc-do-command files or be nil (to execute commands that don't expect a file name or set of files). If an optional list of FLAGS is present, that is inserted into the command line before the filename. + +If `vc-want-edit-command-p' is non-nil, prompt the user to edit +COMMAND and FLAGS before execution. + Return the return value of the slave command in the synchronous case, and the process object in the asynchronous case." + (when vc-want-edit-command-p + (let* ((files-separator-p (string= "--" (car (last flags)))) + (edited (split-string-and-unquote + (read-shell-command + (format "Edit VC command & arguments%s: " + (if file-or-list + " (files list to be appended)" + "")) + (combine-and-quote-strings + (cons command (remq nil (if files-separator-p + (butlast flags) + flags)))))))) + (setq command (car edited) + flags (nconc (cdr edited) + (and files-separator-p '("--")))))) (when vc-tor (push command flags) (setq command "torsocks")) @@ -327,6 +355,8 @@ vc-do-command (string= (buffer-name) buffer)) (eq buffer (current-buffer))) (vc-setup-buffer buffer)) + (run-hook-with-args 'vc-pre-command-functions + command file-or-list flags) ;; If there's some previous async process still running, just kill it. (let ((squeezed (remq nil flags)) (inhibit-read-only t) @@ -386,22 +416,25 @@ vc-do-async-command of a buffer, which is created. ROOT should be the directory in which the command should be run. Display the buffer in some window, but don't select it." - (let* ((dir default-directory) - (inhibit-read-only t) - window new-window-start) + (letrec ((dir default-directory) + (inhibit-read-only t) + (fun (lambda (command _ args) + (remove-hook 'vc-pre-command-functions fun) + (goto-char (point-max)) + (unless (eq (point) (point-min)) + (insert " \n")) + (setq new-window-start (point)) + (insert "Running \"" command) + (dolist (arg args) + (insert " " arg)) + (insert "\"...\n"))) + (window nil) (new-window-start nil)) (setq buffer (get-buffer-create buffer)) (if (get-buffer-process buffer) (error "Another VC action on %s is running" root)) (with-current-buffer buffer (setq default-directory root) - (goto-char (point-max)) - (unless (eq (point) (point-min)) - (insert " \n")) - (setq new-window-start (point)) - (insert "Running \"" command) - (dolist (arg args) - (insert " " arg)) - (insert "\"...\n") + (add-hook 'vc-pre-command-functions fun) ;; Run in the original working directory. (let ((default-directory dir)) (apply #'vc-do-command t 'async command nil args))) diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index a5d12f03bc..2228cf8665 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -1089,35 +1089,30 @@ vc-git-error-regexp-alist (declare-function vc-compilation-mode "vc-dispatcher" (backend)) (defvar compilation-directory) (defvar compilation-arguments) +(defvar vc-want-edit-command-p) (defun vc-git--pushpull (command prompt extra-args) "Run COMMAND (a string; either push or pull) on the current Git branch. If PROMPT is non-nil, prompt for the Git command to run." (let* ((root (vc-git-root default-directory)) (buffer (format "*vc-git : %s*" (expand-file-name root))) - (git-program vc-git-program) - args) - ;; If necessary, prompt for the exact command. - ;; TODO if pushing, prompt if no default push location - cf bzr. - (when prompt - (setq args (split-string - (read-shell-command - (format "Git %s command: " command) - (format "%s %s" git-program command) - 'vc-git-history) - " " t)) - (setq git-program (car args) - command (cadr args) - args (cddr args))) - (setq args (nconc args extra-args)) + ;; TODO if pushing, prompt if no default push location - cf bzr. + (vc-want-edit-command-p prompt)) (require 'vc-dispatcher) - (apply #'vc-do-async-command buffer root git-program command args) + (when vc-want-edit-command-p + (with-current-buffer (get-buffer-create buffer) + (add-hook 'vc-pre-command-functions + (pcase-lambda (_ _ `(,new-command . ,new-args)) + (setq command new-command extra-args new-args)) + nil t))) + (apply #'vc-do-async-command + buffer root vc-git-program command extra-args) (with-current-buffer buffer (vc-run-delayed (vc-compilation-mode 'git) (setq-local compile-command - (concat git-program " " command " " - (mapconcat #'identity args " "))) + (concat vc-git-program " " command " " + (mapconcat #'identity extra-args " "))) (setq-local compilation-directory root) ;; Either set `compilation-buffer-name-function' locally to nil ;; or use `compilation-arguments' to set `name-function'. diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index c67dad69fc..76e577d682 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -1046,6 +1046,7 @@ log-view-vc-backend (defvar log-edit-vc-backend) (defvar diff-vc-backend) (defvar diff-vc-revisions) +(defvar vc-want-edit-command-p) (defun vc-deduce-backend () (cond ((derived-mode-p 'vc-dir-mode) vc-dir-backend) @@ -2744,17 +2745,26 @@ vc-print-root-log (setq vc-parent-buffer-name nil))) ;;;###autoload -(defun vc-print-branch-log (branch) - "Show the change log for BRANCH root in a window." +(defun vc-print-branch-log (branch &optional arg) + "Show the change log for BRANCH root in a window. +Optional prefix ARG non-nil requests an opportunity for the user +to edit the VC shell command that will be run to generate the +log." + ;; The original motivation for ARG was to make it possible to + ;; produce a log of more than one Git branch without modifying the + ;; print-log VC API. The user can append the other branches to the + ;; command line arguments to 'git log'. See bug#57807. (interactive (let* ((backend (vc-responsible-backend default-directory)) (rootdir (vc-call-backend backend 'root default-directory))) (list - (vc-read-revision "Branch to log: " (list rootdir) backend)))) + (vc-read-revision "Branch to log: " (list rootdir) backend) + current-prefix-arg))) (when (equal branch "") (error "No branch specified")) (let* ((backend (vc-responsible-backend default-directory)) - (rootdir (vc-call-backend backend 'root default-directory))) + (rootdir (vc-call-backend backend 'root default-directory)) + (vc-want-edit-command-p arg)) (vc-print-log-internal backend (list rootdir) branch t (when (> vc-log-show-limit 0) vc-log-show-limit)))) -- 2.30.2 --=-=-=--