> 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.