Re: [PATCH] imap-send: add option to mark sent messages as read or unread

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On 23 Jul 2025, at 5:59 PM, Aditya Garg <gargaditya08@xxxxxxxx> wrote:
> 
> The current behaviour of `git imap-send` is to mark sent messages as read
> if curl is used, and unread if OpenSSL is used.
> 
> Fix this inconsistency by marking the message as read by default in both
> cases. Also introduce `--[no-]mark-as-read` and `imap.markAsRead` option
> to allow users to change this behaviour.
> 
> While at it, also clarify that `imap.folder` will be used if --folder is
> not specified.
> 
> Signed-off-by: Aditya Garg <gargaditya08@xxxxxxxx>
> ---
> Documentation/config/imap.adoc   |  4 ++++
> Documentation/git-imap-send.adoc | 10 +++++++++-
> imap-send.c                      | 18 ++++++++++++++++--
> 3 files changed, 29 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/config/imap.adoc b/Documentation/config/imap.adoc
> index 4682a6bd03..afae49391c 100644
> --- a/Documentation/config/imap.adoc
> +++ b/Documentation/config/imap.adoc
> @@ -45,3 +45,7 @@ imap.authMethod::
>   option, the only supported methods are `PLAIN`, `CRAM-MD5`, `OAUTHBEARER`
>   and `XOAUTH2`. If this is not set then `git imap-send` uses the basic IMAP
>   plaintext `LOGIN` command.
> +
> +imap.markAsRead::
> +    Choose whether to mark the sent message as read or not.
> +    Default is `true`.
> diff --git a/Documentation/git-imap-send.adoc b/Documentation/git-imap-send.adoc
> index 17147f93c3..3976c128c7 100644
> --- a/Documentation/git-imap-send.adoc
> +++ b/Documentation/git-imap-send.adoc
> @@ -9,7 +9,7 @@ git-imap-send - Send a collection of patches from stdin to an IMAP folder
> SYNOPSIS
> --------
> [verse]
> -'git imap-send' [-v] [-q] [--[no-]curl] [(--folder|-f) <folder>]
> +'git imap-send' [-v] [-q] [--[no-]curl] [--[no-]mark-as-read] [(--folder|-f) <folder>]
> 'git imap-send' --list
> 
> 
> @@ -44,6 +44,8 @@ OPTIONS
> --folder=<folder>::
>   Specify the folder in which the emails have to saved.
>   For example: `--folder=[Gmail]/Drafts` or `-f INBOX/Drafts`.
> +    If not specified, the folder assigned using `imap.folder`
> +    will be used.
> 
> --curl::
>   Use libcurl to communicate with the IMAP server, unless tunneling
> @@ -58,6 +60,12 @@ OPTIONS
> --list::
>   Run the IMAP LIST command to output a list of all the folders present.
> 
> +--[no-]mark-as-read::
> +    Choose whether to mark the sent message as read or not.
> +    `--mark-as-read` will mark the message as read, and `--no-mark-as-read`
> +    will mark it as unread. If not specified, the default behaviour will
> +    be decided by the value of `imap.markAsRead`.
> +
> CONFIGURATION
> -------------
> 
> diff --git a/imap-send.c b/imap-send.c
> index 44de0c5a77..a242119164 100644
> --- a/imap-send.c
> +++ b/imap-send.c
> @@ -47,11 +47,12 @@
> 
> static int verbosity;
> static int list_folders;
> +static int mark_seen = 1;
> static int use_curl = USE_CURL_DEFAULT;
> static char *opt_folder;
> 
> static char const * const imap_send_usage[] = {
> -    N_("git imap-send [-v] [-q] [--[no-]curl] [(--folder|-f) <folder>] < <mbox>"),
> +    N_("git imap-send [-v] [-q] [--[no-]curl] [--[no-]mark-as-read] [(--folder|-f) <folder>] < <mbox>"),
>   "git imap-send --list",
>   NULL
> };
> @@ -61,6 +62,7 @@ static struct option imap_send_options[] = {
>   OPT_BOOL(0, "curl", &use_curl, "use libcurl to communicate with the IMAP server"),
>   OPT_STRING('f', "folder", &opt_folder, "folder", "specify the IMAP folder"),
>   OPT_BOOL(0, "list", &list_folders, "list all folders on the IMAP server"),
> +    OPT_BOOL(0, "mark-as-read", &mark_seen, "mark messages as read after sending"),
>   OPT_END()
> };
> 
> @@ -1402,7 +1404,11 @@ static int imap_store_msg(struct imap_store *ctx, struct strbuf *msg)
> 
>   box = ctx->name;
>   prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
> -    ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" ", prefix, box);
> +    if (mark_seen) {
> +        ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" (\\Seen) ", prefix, box);
> +    } else {
> +        ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" ", prefix, box);
> +    }
>   imap->caps = imap->rcaps;
>   if (ret != DRV_OK)
>       return ret;
> @@ -1513,6 +1519,8 @@ static int git_imap_config(const char *var, const char *val,
>       cfg->ssl_verify = git_config_bool(var, val);
>   } else if (!strcmp("imap.preformattedhtml", var)) {
>       cfg->use_html = git_config_bool(var, val);
> +    } else if (!strcmp("imap.markasread", var)) {
> +        mark_seen = git_config_bool(var, val);
>   } else if (!strcmp("imap.folder", var)) {
>       FREE_AND_NULL(cfg->folder);
>       return git_config_string(&cfg->folder, var, val);
> @@ -1702,6 +1710,12 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
>   curl_easy_setopt(curl, CURLOPT_READFUNCTION, fread_buffer);
>   curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
> 
> +    if (mark_seen) {
> +        curl_easy_setopt(curl, CURLOPT_UPLOAD_FLAGS, CURLULFLAG_SEEN);
> +    } else {
> +        curl_easy_setopt(curl, CURLOPT_UPLOAD_FLAGS, 0L);
> +    }
> +

The GitHub actions workflows are failing because CURLOPT_UPLOAD_FLAGS were introduced in v8.13.0 of libcurl, which is just 3 months old, and the CI has an older version.

Not sure if version checks are needed here or not.




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux