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); + } + curl_easy_setopt(curl, CURLOPT_READDATA, &msgbuf); fprintf(stderr, "Sending %d message%s to %s folder...\n", -- 2.50.1.320.g2ad311502d