dovecot-2.1: doveadm expunge: Added -d parameter to delete mailb...

dovecot at dovecot.org dovecot at dovecot.org
Thu Apr 19 18:16:07 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/782570f644f7
changeset: 14428:782570f644f7
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Apr 19 18:15:56 2012 +0300
description:
doveadm expunge: Added -d parameter to delete mailbox if it's empty after expunging.

diffstat:

 src/doveadm/doveadm-mail-expunge.c |  64 ++++++++++++++++++++++++++++++++-----
 src/doveadm/doveadm-mail-iter.c    |  18 +++++++--
 src/doveadm/doveadm-mail-iter.h    |   2 +
 3 files changed, 70 insertions(+), 14 deletions(-)

diffs (161 lines):

diff -r 2d8bafd11569 -r 782570f644f7 src/doveadm/doveadm-mail-expunge.c
--- a/src/doveadm/doveadm-mail-expunge.c	Thu Apr 19 18:15:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-expunge.c	Thu Apr 19 18:15:56 2012 +0300
@@ -9,16 +9,24 @@
 #include "doveadm-mail-iter.h"
 #include "doveadm-mail.h"
 
+struct expunge_cmd_context {
+	struct doveadm_mail_cmd_context ctx;
+	bool delete_empty_mailbox;
+};
+
 static int
-cmd_expunge_box(struct doveadm_mail_cmd_context *ctx,
+cmd_expunge_box(struct doveadm_mail_cmd_context *_ctx,
 		const struct mailbox_info *info,
 		struct mail_search_args *search_args)
 {
+	struct expunge_cmd_context *ctx = (struct expunge_cmd_context *)_ctx;
 	struct doveadm_mail_iter *iter;
+	struct mailbox *box;
 	struct mailbox_transaction_context *trans;
 	struct mail *mail;
+	enum mail_error error;
 
-	if (doveadm_mail_iter_init(ctx, info, search_args, 0, NULL,
+	if (doveadm_mail_iter_init(_ctx, info, search_args, 0, NULL,
 				   &trans, &iter) < 0)
 		return -1;
 
@@ -29,7 +37,29 @@
 		}
 		mail_expunge(mail);
 	}
-	return doveadm_mail_iter_deinit_sync(&iter);
+
+	if (doveadm_mail_iter_deinit_keep_box(&iter, &box) < 0) {
+		mailbox_free(&box);
+		return -1;
+	}
+	if (mailbox_sync(box, 0) < 0) {
+		doveadm_mail_failed_mailbox(_ctx, box);
+		mailbox_free(&box);
+		return -1;
+	}
+
+	if (ctx->delete_empty_mailbox) {
+		if (mailbox_delete_empty(box) < 0) {
+			(void)mailbox_get_last_error(box, &error);
+			if (error != MAIL_ERROR_EXISTS) {
+				doveadm_mail_failed_mailbox(_ctx, box);
+				mailbox_free(&box);
+				return -1;
+			}
+		}
+	}
+	mailbox_free(&box);
+	return 0;
 }
 
 static bool
@@ -208,16 +238,32 @@
 	expunge_search_args_check(ctx->search_args, "expunge");
 }
 
+static bool cmd_expunge_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
+{
+	struct expunge_cmd_context *ctx = (struct expunge_cmd_context *)_ctx;
+
+	switch (c) {
+	case 'd':
+		ctx->delete_empty_mailbox = TRUE;
+		break;
+	default:
+		return FALSE;
+	}
+	return TRUE;
+}
+
 static struct doveadm_mail_cmd_context *cmd_expunge_alloc(void)
 {
-	struct doveadm_mail_cmd_context *ctx;
+	struct expunge_cmd_context *ctx;
 
-	ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
-	ctx->v.init = cmd_expunge_init;
-	ctx->v.run = cmd_expunge_run;
-	return ctx;
+	ctx = doveadm_mail_cmd_alloc(struct expunge_cmd_context);
+	ctx->ctx.getopt_args = "d";
+	ctx->ctx.v.parse_arg = cmd_expunge_parse_arg;
+	ctx->ctx.v.init = cmd_expunge_init;
+	ctx->ctx.v.run = cmd_expunge_run;
+	return &ctx->ctx;
 }
 
 struct doveadm_mail_cmd cmd_expunge = {
-	cmd_expunge_alloc, "expunge", "<search query>"
+	cmd_expunge_alloc, "expunge", "[-d] <search query>"
 };
diff -r 2d8bafd11569 -r 782570f644f7 src/doveadm/doveadm-mail-iter.c
--- a/src/doveadm/doveadm-mail-iter.c	Thu Apr 19 18:15:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-iter.c	Thu Apr 19 18:15:56 2012 +0300
@@ -83,7 +83,7 @@
 
 static int
 doveadm_mail_iter_deinit_full(struct doveadm_mail_iter **_iter,
-			      bool sync, bool commit)
+			      bool sync, bool commit, bool keep_box)
 {
 	struct doveadm_mail_iter *iter = *_iter;
 	int ret;
@@ -95,24 +95,32 @@
 		ret = mailbox_sync(iter->box, 0);
 	if (ret < 0)
 		doveadm_mail_failed_mailbox(iter->ctx, iter->box);
-	mailbox_free(&iter->box);
+	if (!keep_box)
+		mailbox_free(&iter->box);
 	i_free(iter);
 	return ret;
 }
 
 int doveadm_mail_iter_deinit(struct doveadm_mail_iter **_iter)
 {
-	return doveadm_mail_iter_deinit_full(_iter, FALSE, TRUE);
+	return doveadm_mail_iter_deinit_full(_iter, FALSE, TRUE, FALSE);
 }
 
 int doveadm_mail_iter_deinit_sync(struct doveadm_mail_iter **_iter)
 {
-	return doveadm_mail_iter_deinit_full(_iter, TRUE, TRUE);
+	return doveadm_mail_iter_deinit_full(_iter, TRUE, TRUE, FALSE);
+}
+
+int doveadm_mail_iter_deinit_keep_box(struct doveadm_mail_iter **iter,
+				      struct mailbox **box_r)
+{
+	*box_r = (*iter)->box;
+	return doveadm_mail_iter_deinit_full(iter, FALSE, TRUE, TRUE);
 }
 
 void doveadm_mail_iter_deinit_rollback(struct doveadm_mail_iter **_iter)
 {
-	(void)doveadm_mail_iter_deinit_full(_iter, FALSE, FALSE);
+	(void)doveadm_mail_iter_deinit_full(_iter, FALSE, FALSE, FALSE);
 }
 
 bool doveadm_mail_iter_next(struct doveadm_mail_iter *iter,
diff -r 2d8bafd11569 -r 782570f644f7 src/doveadm/doveadm-mail-iter.h
--- a/src/doveadm/doveadm-mail-iter.h	Thu Apr 19 18:15:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-iter.h	Thu Apr 19 18:15:56 2012 +0300
@@ -13,6 +13,8 @@
 			   struct doveadm_mail_iter **iter_r);
 int doveadm_mail_iter_deinit(struct doveadm_mail_iter **iter);
 int doveadm_mail_iter_deinit_sync(struct doveadm_mail_iter **iter);
+int doveadm_mail_iter_deinit_keep_box(struct doveadm_mail_iter **iter,
+				      struct mailbox **box_r);
 void doveadm_mail_iter_deinit_rollback(struct doveadm_mail_iter **iter);
 
 bool doveadm_mail_iter_next(struct doveadm_mail_iter *iter,


More information about the dovecot-cvs mailing list