isync

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

commit f2f519e20b75a0cfb21198ddaa5e24b72f92f5f8
parent 3c0ad89a139b9147cc8cc02311cc685cefd6f686
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Wed, 26 Jan 2022 22:03:40 +0100

fix bogus orphaning due to expunging

we cannot orphan all messages whose opposite we expunge, as that would
prevent subsequent propagation of the deletion. we can do that only if
the message is already known to be marked as deleted.

Diffstat:
Msrc/run-tests.pl | 20++++++++++++++++++++
Msrc/sync.c | 4++--
2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/run-tests.pl b/src/run-tests.pl @@ -1064,6 +1064,26 @@ my @X08 = ( ); test("push flags + pull deletions", \@x01, \@X08, \@O08); +my @O09 = ("", "", "Sync None\nExpunge Both\n"); +my @X09 = ( + I, 0, I, + E, "/", "", "", + F, "", "", "/", + H, "/", "", "", + J, "/", "", "", + L, "", "", "/", +); +test("noop + expunge both", \@x01, \@X09, \@O09); + +my @O0A = ("", "", "Sync None\nExpunge Near\n"); +# Sync entries are not updated/pruned, because the far side is not loaded. +my @X0A = ( + I, 0, I, + F, "", "", "/", + L, "", "", "/", +); +test("noop + expunge near side", \@x01, \@X0A, \@O0A); + # Size restriction tests my @x20 = ( diff --git a/src/sync.c b/src/sync.c @@ -1812,11 +1812,11 @@ box_closed_p2( sync_vars_t *svars, int t ) ((srec->status & S_EXPIRED) && svars->maxuid[F] >= srec->uid[F] && svars->maxxfuid >= srec->uid[F])) { PC_JLOG( "- %u %u", (srec->uid[F], srec->uid[N]), "killing" ); srec->status = S_DEAD; - } else if (srec->uid[N]) { + } else if (srec->uid[N] && (srec->status & S_DEL(F))) { PC_JLOG( "> %u %u 0", (srec->uid[F], srec->uid[N]), "orphaning" ); srec->uid[N] = 0; } - } else if (srec->uid[F] && ((srec->status & S_DEL(F)) && (svars->state[F] & ST_DID_EXPUNGE))) { + } else if (srec->uid[F] && ((srec->status & S_DEL(F)) && (svars->state[F] & ST_DID_EXPUNGE)) && (srec->status & S_DEL(N))) { PC_JLOG( "< %u %u 0", (srec->uid[F], srec->uid[N]), "orphaning" ); srec->uid[F] = 0; }