unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Philip Kaludercic <philipk@posteo.net>
Cc: larsi@gnus.org, 57400@debbugs.gnu.org, ane@iki.fi
Subject: bug#57400: 29.0.50; Support sending patches from VC directly
Date: Tue, 04 Oct 2022 09:41:50 +0300	[thread overview]
Message-ID: <83r0zow0nl.fsf@gnu.org> (raw)
In-Reply-To: <87mtacvag8.fsf@posteo.net> (message from Philip Kaludercic on Mon, 03 Oct 2022 21:55:35 +0000)

> Cc: 57400@debbugs.gnu.org, Antoine Kalmbach <ane@iki.fi>
> From: Philip Kaludercic <philipk@posteo.net>
> Date: Mon, 03 Oct 2022 21:55:35 +0000
> 
> >>                                    Others should indeed run vc-diff, I
> >> think.
> >
> > That seem possible, but for that to work I will need a generic way to
> > detect the predecessor of a commit and extract a commit message.
> > Currently, I am not sure if this can be done.
> 
> I had forgotten about `previous-revision', so that was easy and I
> decided to fall back to a generic subject as that can be easily revised:

Thanks.  A few comments below.

> +(defun vc-git-prepare-patch (rev)
> +  (with-temp-buffer
> +    (call-process vc-git-program nil t nil "format-patch"
> +                  "--no-numbered" "--stdout"
> +                  ;; From gitrevisions(7): ^<n> means the <n>th parent
> +                  ;; (i.e.  <rev>^ is equivalent to <rev>^1). As a
> +                  ;; special rule, <rev>^0 means the commit itself and
> +                  ;; is used when <rev> is the object name of a tag
> +                  ;; object that refers to a commit object.
> +                  (concat rev "^0"))

This needs to set up decoding of the stuff Git outputs, because it is
usually in UTF-8 (but could be in some other encoding), and the
defaults could be different, depending on the locale.  See
vc-git-log-output-coding-system and its use elsewhere.

Or maybe you should just use vc-git--call here, which handles that
already, and uses process-file instead of call-process, so this will
work via Tramp: an additional benefit.

> +    (let (filename subject body)
> +      ;; Save the patch in a temporary file if required
> +      (when (bound-and-true-p vc-compose-patches-inline)
> +        (setq filename (make-temp-file "vc-git-prepare-patch"))
> +        (write-region nil nil filename)) ;FIXME: Clean up

By "clean up" did you mean delete the temporary file?

> +      ;; Return the extracted data
> +      (list :filename filename
> +            :subject subject
> +            :body body))))

I think this should include :encoding ENCODING, to provide the
temporary file's encoding to the caller.  The encoding should be the
same as buffer-file-coding-system in the buffer which you write above.

> -(defun vc-read-revision (prompt &optional files backend default initial-input)
> +(defun vc-read-revision (prompt &optional files backend default initial-input multiple)

This API change warrants a NEWS entry, I think.

>    (cond
>     ((null files)
>      (let ((vc-fileset (vc-deduce-fileset t))) ;FIXME: why t?  --Stef
> @@ -1920,9 +1928,16 @@ vc-read-revision
>    (let ((completion-table
>           (vc-call-backend backend 'revision-completion-table files)))
>      (if completion-table
> -        (completing-read prompt completion-table
> -                         nil nil initial-input 'vc-revision-history default)
> -      (read-string prompt initial-input nil default))))
> +        (funcall
> +         (if multiple #'completing-read-multiple #'completing-read)
> +         prompt completion-table nil nil initial-input 'vc-revision-history default)
> +      (let ((answer (read-string prompt initial-input nil default)))
> +        (if multiple
> +            (split-string answer "[ \t]*,[ \t]*")
> +          answer)))))
> +
> +(defun vc-read-multiple-revisions (prompt &optional files backend default initial-input)
> +  (vc-read-revision prompt files backend default initial-input t))
>  
>  (defun vc-diff-build-argument-list-internal (&optional fileset)
>    "Build argument list for calling internal diff functions."
> @@ -3243,6 +3258,73 @@ vc-update-change-log
>    (vc-call-backend (vc-responsible-backend default-directory)
>                     'update-changelog args))
>  
> +(defcustom vc-compose-patches-inline nil
> +  "Non-nil means that `vc-compose-patch' creates a single message."

This is rather cryptic, IMO, and will benefit from more detailed
description, after the initial line.  Also, I suggest a slight
rewording of the above sentence:

  If non-nil, `vc-compose-patch' will create a single email message.

> +  :type 'boolean
> +  :safe #'booleanp)

The :version tag is missing.

> +(declare-function message-goto-body "message" (&optional interactive))
> +(declare-function message--name-table "message" (orig-string))

Can we not force the use of message.el?  Can we use mail-user-agent
instead, and use its properties to find out the compose function the
user has set up, like "C-x m" does?  This would probably eliminate
quite a few problems with user email setup, which might not support
message.el.

> +(defun vc-compose-patch (addressee subject revisions)
> +  "Compose a message sending REVISIONS to ADDRESSEE with SUBJECT."

  "Compose an email message to send REVISIONS to ADDRESSEE with SUBJECT."

The "email" part is important, because we cannot assume the reader of
the doc string is necessarily aware of the context.

> +  (interactive (save-current-buffer
> +                 (require 'message)
> +                 (vc-ensure-vc-buffer)
> +                 (let ((revs (vc-read-multiple-revisions "Revisions: ")) to)
> +                   (while (null (setq to (completing-read-multiple
> +                                          "Whom to send: "

Instead "Whom to send:" I suggest just "Addressee:" or maybe even
"Send patches to:"

> +            (compose-mail addressee
> +                          (or (plist-get patch :subject)
> +                              (concat
> +                               "Patch for " ;guess
> +                               (file-name-nondirectory
> +                                (directory-file-name
> +                                 (vc-root-dir)))))
> +                          nil nil nil nil
> +                          `((exit-recursive-edit)))
> +            (message-goto-body)

compose-mail doesn't necessarily invoke message.el functions, so
message-goto-body is not necessarily appropriate here.





  parent reply	other threads:[~2022-10-04  6:41 UTC|newest]

Thread overview: 117+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-25  8:47 bug#57400: 29.0.50; Support sending patches from VC directly Antoine Kalmbach
2022-08-26  7:37 ` Philip Kaludercic
2022-08-26 10:15   ` Antoine Kalmbach
2022-08-26 10:35     ` Philip Kaludercic
2022-08-26 10:45       ` Antoine Kalmbach
2022-08-26 10:58         ` Eli Zaretskii
2022-08-26 11:26           ` Philip Kaludercic
2022-08-26 11:44             ` Eli Zaretskii
2022-08-26 12:05               ` Philip Kaludercic
2022-08-26 12:26                 ` Eli Zaretskii
2022-08-26 13:10                   ` Antoine Kalmbach
2022-08-26 13:17                     ` Eli Zaretskii
2022-08-26 13:29                   ` Philip Kaludercic
2022-08-26 14:21                     ` Eli Zaretskii
2022-08-27  8:21                       ` Philip Kaludercic
2022-08-27  9:21                         ` Eli Zaretskii
2022-08-27  9:30                           ` Philip Kaludercic
2022-08-26 12:08               ` Antoine Kalmbach
2022-08-26 12:28                 ` Eli Zaretskii
2022-08-28  4:07         ` Richard Stallman
2022-10-03 18:59         ` Philip Kaludercic
2022-10-03 19:06           ` Lars Ingebrigtsen
2022-10-03 19:23             ` Eli Zaretskii
2022-10-04 19:19               ` Philip Kaludercic
2022-10-04 19:33                 ` Eli Zaretskii
2022-10-03 21:22             ` Philip Kaludercic
2022-10-03 21:55               ` Philip Kaludercic
2022-10-03 23:32                 ` Lars Ingebrigtsen
2022-10-04  6:46                   ` Eli Zaretskii
2022-10-04  6:41                 ` Eli Zaretskii [this message]
2022-10-04  7:10                   ` Philip Kaludercic
2022-10-04  8:00                     ` Eli Zaretskii
2022-10-04 10:40                       ` Philip Kaludercic
2022-10-04 10:42                         ` Philip Kaludercic
2022-10-04 12:25                           ` Eli Zaretskii
2022-10-04 12:24                         ` Eli Zaretskii
2022-10-04 18:08                           ` Philip Kaludercic
2022-10-05 16:07           ` Antoine Kalmbach
2022-10-05 17:34             ` Philip Kaludercic
2022-10-05 17:48               ` Philip Kaludercic
2022-10-05 18:32                 ` Lars Ingebrigtsen
2022-10-05 18:46                   ` Philip Kaludercic
2022-10-05 19:08                     ` Lars Ingebrigtsen
2022-10-06  8:21                       ` Robert Pluim
2022-10-06  8:35                         ` Philip Kaludercic
2022-10-06  8:59                           ` Robert Pluim
2022-10-06  9:12                             ` Philip Kaludercic
2022-10-06 11:02                     ` Philip Kaludercic
2022-10-05 19:57                   ` Juri Linkov
2022-10-06 12:03                     ` Lars Ingebrigtsen
2022-10-07 22:48                     ` Richard Stallman
2022-10-10 14:39                     ` Filipp Gunbin
2022-10-10 18:58                       ` Juri Linkov
2022-10-11  0:27                         ` Lars Ingebrigtsen
2022-10-11  0:26                       ` Lars Ingebrigtsen
2022-10-05 18:17               ` Eli Zaretskii
2022-10-05 18:45                 ` Philip Kaludercic
2022-10-06  9:14                   ` Philip Kaludercic
2022-10-06  9:19                     ` Eli Zaretskii
2022-10-06 22:22                       ` Dmitry Gutov
2022-10-07  6:36                         ` Eli Zaretskii
2022-10-07 12:06                           ` Dmitry Gutov
2022-10-06 11:33               ` Robert Pluim
2022-10-06 12:38                 ` Philip Kaludercic
2022-10-06 12:58                   ` Robert Pluim
2022-10-06 14:37                     ` Philip Kaludercic
2022-10-06 14:43                       ` Robert Pluim
2022-10-06 15:54                       ` Eli Zaretskii
2022-10-06 16:27                         ` Philip Kaludercic
2022-10-07  7:58                     ` Juri Linkov
2022-10-07 11:42                       ` Philip Kaludercic
2022-10-08 10:03                         ` Philip Kaludercic
2022-10-08 19:34                         ` Juri Linkov
2022-10-09 12:15                           ` Philip Kaludercic
2022-10-10 19:03                             ` Juri Linkov
2022-10-11 12:44                               ` Philip Kaludercic
2022-10-11 13:58                                 ` Robert Pluim
2022-10-15 18:54                                 ` Juri Linkov
2022-10-16  9:40                                   ` Philip Kaludercic
2022-10-11 19:30                               ` Philip Kaludercic
2022-10-11 19:47                                 ` Juri Linkov
2022-10-11 19:49                                   ` Philip Kaludercic
2022-10-12 22:01                                   ` Richard Stallman
2022-10-13  7:04                                     ` Juri Linkov
2022-10-13 21:12                                       ` Richard Stallman
2022-10-15 19:02                                         ` Juri Linkov
2022-10-13  8:55                                   ` Philip Kaludercic
2022-10-13 17:30                                     ` Juri Linkov
2022-10-13 19:44                                       ` Philip Kaludercic
2022-10-13 20:25                                         ` Philip Kaludercic
2022-10-13 20:33                                           ` Eli Zaretskii
2022-10-13 22:05                                             ` Philip Kaludercic
2022-10-14  6:50                                               ` Eli Zaretskii
2022-10-14 21:28                                                 ` Richard Stallman
2022-10-14 21:47                                                 ` Philip Kaludercic
2022-10-15  6:57                                                   ` Eli Zaretskii
2022-10-15 11:44                                                     ` Philip Kaludercic
2022-10-15 12:20                                                       ` Eli Zaretskii
2022-10-15 15:15                                                         ` Philip Kaludercic
2022-10-15 15:16                                                           ` Eli Zaretskii
2022-10-15 15:24                                                             ` Philip Kaludercic
2022-10-10 22:01                           ` Richard Stallman
2022-10-11  5:37                             ` Eli Zaretskii
2022-10-12 21:59                               ` Richard Stallman
2022-10-06 22:10                   ` Dmitry Gutov
2022-10-07  8:03                     ` Philip Kaludercic
2022-10-07 12:56                       ` Dmitry Gutov
2022-10-07 15:30                         ` Philip Kaludercic
2022-10-07 15:47                           ` Dmitry Gutov
2022-10-07 15:54                             ` Philip Kaludercic
2022-10-08 22:34                             ` Richard Stallman
2022-10-08 12:11                         ` Philip Kaludercic
2022-10-08 12:44                           ` German Pacenza
2022-10-08 13:02                             ` Philip Kaludercic
2022-10-08 13:07                           ` Dmitry Gutov
2022-10-08 13:42                             ` Philip Kaludercic
2022-10-08 14:02                               ` Dmitry Gutov

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=83r0zow0nl.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=57400@debbugs.gnu.org \
    --cc=ane@iki.fi \
    --cc=larsi@gnus.org \
    --cc=philipk@posteo.net \
    /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 public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).