isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit a8e145e589fc41087862bd0b11d7ede79e1789ea
parent d77d67c9489c860ef47861206acf47e8a8831c6a
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Wed,  1 Jun 2022 19:55:24 +0200

split OPEN_PAIRED from OPEN_OLD, and rename OPEN_OLD_IDS accordingly

this emphasizes the non-complementarity to OPEN_NEW.
the "real" OPEN_OLD is currently used only for trashing.

Diffstat:
Msrc/driver.h | 9+++++----
Msrc/drv_imap.c | 4++--
Msrc/drv_maildir.c | 6+++---
Msrc/sync.c | 42+++++++++++++++++++++++++++++-------------
4 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/src/driver.h b/src/driver.h @@ -82,16 +82,17 @@ static_assert_bits(F, message_t, flags); static_assert_bits(M, message_t, status); // For driver_t->prepare_load_box(), which may amend the passed flags. -// The drivers don't use the first two, but may set them if loading the +// The drivers don't use the first three, but may set them if loading the // particular range is required to handle some other flag; note that these // ranges may overlap. BIT_ENUM( - OPEN_OLD, // Paired messages *in* this store. + OPEN_PAIRED, // Paired messages *in* this store. + OPEN_OLD, // Messages that should be already propagated *from* this store. OPEN_NEW, // Messages (possibly) not yet propagated *from* this store. OPEN_FIND, OPEN_FLAGS, // Note that fetch_msg() gets the flags regardless. OPEN_NEW_SIZE, - OPEN_OLD_IDS, + OPEN_PAIRED_IDS, OPEN_APPEND, OPEN_SETFLAGS, OPEN_EXPUNGE, @@ -235,7 +236,7 @@ struct driver { * and those named in the excs array (smaller than minuid). * The driver takes ownership of the excs array. * Messages starting with finduid need to have the TUID populated when OPEN_FIND is set. - * Messages up to pairuid need to have the Message-Id populated when OPEN_OLD_IDS is set. + * Messages up to pairuid need to have the Message-Id populated when OPEN_PAIRED_IDS is set. * Messages up to newuid need to have the size populated when OPEN_OLD_SIZE is set; * likewise messages above newuid when OPEN_NEW_SIZE is set. * The returned message list remains owned by the driver. */ diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -2885,7 +2885,7 @@ imap_load_box( store_t *gctx, uint minuid, uint maxuid, uint finduid, uint pairu if (i != j) bl += sprintf( buf + bl, ":%u", excs.data[i] ); } - imap_submit_load( ctx, buf, shifted_bit( ctx->opts, OPEN_OLD_IDS, WantMsgids ), sts ); + imap_submit_load( ctx, buf, shifted_bit( ctx->opts, OPEN_PAIRED_IDS, WantMsgids ), sts ); } if (maxuid == UINT_MAX) maxuid = ctx->uidnext - 1; @@ -2899,7 +2899,7 @@ imap_load_box( store_t *gctx, uint minuid, uint maxuid, uint finduid, uint pairu imap_set_range( ranges, &nranges, 0, WantSize, newuid ); if (ctx->opts & OPEN_FIND) imap_set_range( ranges, &nranges, 0, WantTuids, finduid - 1 ); - if (ctx->opts & OPEN_OLD_IDS) + if (ctx->opts & OPEN_PAIRED_IDS) imap_set_range( ranges, &nranges, WantMsgids, 0, pairuid ); for (uint r = 0; r < nranges; r++) { sprintf( buf, "%u:%u", ranges[r].first, ranges[r].last ); diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -1113,7 +1113,7 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t *msglist ) } int want_size = ((ctx->opts & OPEN_NEW_SIZE) && uid > ctx->newuid); int want_tuid = ((ctx->opts & OPEN_FIND) && uid >= ctx->finduid); - int want_msgid = ((ctx->opts & OPEN_OLD_IDS) && uid <= ctx->pairuid); + int want_msgid = ((ctx->opts & OPEN_PAIRED_IDS) && uid <= ctx->pairuid); if (!want_size && !want_tuid && !want_msgid) continue; if (!fnl) @@ -1401,9 +1401,9 @@ maildir_prepare_load_box( store_t *gctx, uint opts ) maildir_store_t *ctx = (maildir_store_t *)gctx; if (opts & OPEN_SETFLAGS) - opts |= OPEN_OLD; + opts |= OPEN_PAIRED; if (opts & OPEN_EXPUNGE) - opts |= OPEN_OLD|OPEN_NEW|OPEN_FLAGS; + opts |= OPEN_PAIRED | OPEN_OLD | OPEN_NEW | OPEN_FLAGS; ctx->opts = opts; return opts; } diff --git a/src/sync.c b/src/sync.c @@ -741,7 +741,7 @@ box_opened2( sync_vars_t *svars, int t ) opts[F] = opts[N] = 0; if (fails) - opts[F] = opts[N] = OPEN_OLD|OPEN_OLD_IDS; + opts[F] = opts[N] = OPEN_PAIRED | OPEN_PAIRED_IDS; for (t = 0; t < 2; t++) { if (any_purges[t]) { debug( "resuming %d %s purge(s)\n", any_purges[t], str_fn[t] ); @@ -754,7 +754,7 @@ box_opened2( sync_vars_t *svars, int t ) } if (chan->ops[t] & (OP_GONE | OP_FLAGS)) { opts[t] |= OPEN_SETFLAGS; - opts[t^1] |= OPEN_OLD; + opts[t^1] |= OPEN_PAIRED; if (chan->ops[t] & OP_FLAGS) opts[t^1] |= OPEN_FLAGS; } @@ -773,8 +773,8 @@ box_opened2( sync_vars_t *svars, int t ) if ((chan->ops[t] & OP_UPGRADE) || any_upgrades[t]) { debug( "resuming %s of %d upgrade(s)\n", str_hl[t], any_upgrades[t] ); if (chan->ops[t] & OP_UPGRADE) - opts[t] |= OPEN_OLD | OPEN_FLAGS | OPEN_SETFLAGS; - opts[t^1] |= OPEN_OLD; + opts[t] |= OPEN_PAIRED | OPEN_FLAGS | OPEN_SETFLAGS; + opts[t^1] |= OPEN_PAIRED; } if ((chan->ops[t] | chan->ops[t^1]) & OP_EXPUNGE) // Don't propagate doomed msgs opts[t^1] |= OPEN_FLAGS; @@ -798,9 +798,9 @@ box_opened2( sync_vars_t *svars, int t ) if ((chan->ops[N] & (OP_NEW | OP_UPGRADE | OP_FLAGS)) && chan->max_messages) svars->any_expiring = 1; if (svars->any_expiring) { - opts[N] |= OPEN_OLD | OPEN_FLAGS; + opts[N] |= OPEN_PAIRED | OPEN_FLAGS; if (any_dummies[N]) - opts[F] |= OPEN_OLD | OPEN_FLAGS; + opts[F] |= OPEN_PAIRED | OPEN_FLAGS; else if (chan->ops[N] & (OP_NEW | OP_UPGRADE)) opts[F] |= OPEN_FLAGS; } @@ -808,7 +808,7 @@ box_opened2( sync_vars_t *svars, int t ) svars->opts[N] = svars->drv[N]->prepare_load_box( ctx[N], opts[N] ); ARRAY_INIT( &mexcs ); - if ((svars->opts[F] & OPEN_OLD) && chan->max_messages) { + if ((svars->opts[F] & OPEN_PAIRED) && !(svars->opts[F] & OPEN_OLD) && chan->max_messages) { /* When messages have been expired on the near side, the far side fetch is split into * two ranges: The bulk fetch which corresponds with the most recent messages, and an * exception list of messages which would have been expired if they weren't important. */ @@ -859,13 +859,29 @@ load_box( sync_vars_t *svars, int t, uint minwuid, uint_array_t mexcs ) uint maxwuid = 0, pairuid = UINT_MAX; if (svars->opts[t] & OPEN_NEW) { - if (!(svars->opts[t] & OPEN_OLD) || (minwuid > svars->maxuid[t] + 1)) + if (svars->opts[t] & OPEN_OLD) { + svars->opts[t] |= OPEN_PAIRED; + minwuid = 1; + } else if (!(svars->opts[t] & OPEN_PAIRED) || (minwuid > svars->maxuid[t] + 1)) { minwuid = svars->maxuid[t] + 1; + } maxwuid = UINT_MAX; - if (svars->opts[t] & OPEN_OLD_IDS) // Implies OPEN_OLD + if (svars->opts[t] & OPEN_PAIRED_IDS) // Implies OPEN_PAIRED pairuid = get_seenuid( svars, t ); - } else if (svars->opts[t] & OPEN_OLD) { - maxwuid = get_seenuid( svars, t ); + } else if (svars->opts[t] & (OPEN_PAIRED | OPEN_OLD)) { + uint seenuid = get_seenuid( svars, t ); + if (svars->opts[t] & OPEN_OLD) { + minwuid = 1; + maxwuid = svars->maxuid[t]; + if (maxwuid < seenuid) { + if (svars->opts[t] & OPEN_PAIRED) + maxwuid = seenuid; + } else { + svars->opts[t] |= OPEN_PAIRED; + } + } else { // OPEN_PAIRED + maxwuid = seenuid; + } } else { minwuid = UINT_MAX; } @@ -1030,8 +1046,8 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux debug( "pair (%u,%u)\n", srec->uid[F], srec->uid[N] ); assert( !srec->tuid[0] ); // no[] means that a message is known to be not there. - no[F] = !srec->msg[F] && (svars->opts[F] & OPEN_OLD); - no[N] = !srec->msg[N] && (svars->opts[N] & OPEN_OLD); + no[F] = !srec->msg[F] && (svars->opts[F] & OPEN_PAIRED); + no[N] = !srec->msg[N] && (svars->opts[N] & OPEN_PAIRED); if (no[F] && no[N]) { // It does not matter whether one side was already known to be missing // (never stored [skipped or failed] or expunged [possibly expired]) -