diff --git a/src/run-tests.pl b/src/run-tests.pl index 5a96b50..6a12616 100755 --- 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 index 4a46785..a2d4746 100644 --- 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; }