[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]

 



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






[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