commit 3d90507a759e81bc5c3e116a3751f34657aa023b
Author: Oswald Buddenhagen <[email protected]>
Date: Mon Feb 7 20:01:03 2022 +0100
fix resuming propagation of flags on new messages
log the flags as soon as we know them, and commit them when the uid is
assigned (including during tuid matching).
amends 25b1c2b9.
src/run-tests.pl | 20 ++++++++++----------
src/sync.c | 14 ++++++++------
src/sync_state.c | 9 +++++++++
3 files changed, 27 insertions(+), 16 deletions(-)
diff --git a/src/run-tests.pl b/src/run-tests.pl
index 5bb04f6c..fceb5c22 100755
--- a/src/run-tests.pl
+++ b/src/run-tests.pl
@@ -950,7 +950,7 @@ my @x01 = (
G, "*F", "*", "_",
H, "*FT", "*", "*",
I, "_", "*", "*",
- K, "*", "", "",
+ K, "*P", "", "",
M, "", "", "*",
);
@@ -965,7 +965,7 @@ my @X01 = (
H, "", "+FT", "+FT",
I, "", "<", "+T",
M, "*", "*", "",
- K, "", "*", "*",
+ K, "", "*P", "*P",
);
test("full", \@x01, \@X01, \@O01);
@@ -980,7 +980,7 @@ my @X02 = (
H, "/", "/", "/",
I, "", "/", "/",
M, "*", "*", "",
- K, "", "*", "*",
+ K, "", "*P", "*P",
);
test("full + expunge both", \@x01, \@X02, \@O02);
@@ -995,7 +995,7 @@ my @X03 = (
H, "", ">+T", "/",
I, "", "/", "/",
M, "*", "*", "",
- K, "", "*", "*",
+ K, "", "*P", "*P",
);
test("full + expunge near side", \@x01, \@X03, \@O03);
@@ -1007,7 +1007,7 @@ my @X04 = (
E, "", "+T", "+T",
H, "", "+FT", "+FT",
I, "", "<", "+T",
- K, "", "*", "*",
+ K, "", "*P", "*P",
);
test("pull", \@x01, \@X04, \@O04);
@@ -1034,7 +1034,7 @@ my @O07 = ("", "", "Sync New\n");
my @X07 = (
M, 0, K,
M, "*", "*", "",
- K, "", "*", "*",
+ K, "", "*P", "*P",
);
test("new", \@x01, \@X07, \@O07);
@@ -1052,7 +1052,7 @@ test("push flags + pull deletions", \@x01, \@X08, \@O08);
my @x20 = (
0, 0, 0,
A, "*", "", "",
- B, "**", "", "",
+ B, "*P*", "", "",
C, "", "", "**",
);
@@ -1061,7 +1061,7 @@ my @X21 = (
C, 0, B,
C, "*?", "*<", "",
A, "", "*", "*",
- B, "", "*>", "*?",
+ B, "", "*>P", "*P?",
);
test("max size", \@x20, \@X21, \@O21);
@@ -1102,13 +1102,13 @@ my @x24 = (
C, 0, A,
A, "*", "*", "*",
B, "**", "*^", "",
- C, "*F*", "*^", "",
+ C, "*FP*", "*^", "",
);
my @X24 = (
C, 0, C,
B, "", ">-^+>", "*?",
- C, "", ">-^+F", "*F*",
+ C, "", ">-^+FP", "*FP*",
);
test("max size (pre-1.4 legacy)", \@x24, \@X24, \@O21);
diff --git a/src/sync.c b/src/sync.c
index 71136aa2..4099742e 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -289,7 +289,14 @@ msg_fetched( int sts, void *aux )
return;
}
- vars->msg->flags = vars->data.flags = sanitize_flags(
vars->data.flags, svars, t );
+ vars->data.flags = sanitize_flags( vars->data.flags, svars, t );
+ if (srec && !(srec->status & S_UPGRADE)) {
+ if (vars->data.flags) {
+ srec->pflags = vars->data.flags;
+ JLOG( "%% %u %u %u", (srec->uid[F],
srec->uid[N], srec->pflags),
+ "%sing with flags %s", (str_hl[t],
fmt_lone_flags( srec->pflags ).str) );
+ }
+ }
scr = svars->can_crlf[t^1];
tcr = svars->can_crlf[t];
@@ -1405,11 +1412,6 @@ msg_copied( int sts, uint uid, copy_vars_t *vars )
sync_rec_t *srec = vars->srec;
switch (sts) {
case SYNC_OK:
- if (!(srec->status & S_UPGRADE) && vars->msg->flags !=
srec->flags) {
- srec->flags = vars->msg->flags;
- JLOG( "* %u %u %u", (srec->uid[F], srec->uid[N],
srec->flags),
- "%sed with flags %s", (str_hl[t], fmt_lone_flags(
srec->flags ).str) );
- }
if (!uid) // Stored to a non-UIDPLUS mailbox
svars->state[t] |= ST_FIND_NEW;
else
diff --git a/src/sync_state.c b/src/sync_state.c
index 3e4d2cdd..82cc5f15 100644
--- a/src/sync_state.c
+++ b/src/sync_state.c
@@ -306,6 +306,7 @@ load_state( sync_vars_t *svars )
case '<':
case '>':
case '*':
+ case '%':
case '~':
bad = sscanf( buf + 2, "%u %u %u", &t1,
&t2, &t3 ) != 3;
break;
@@ -393,6 +394,10 @@ load_state( sync_vars_t *svars )
srec->aflags[F] =
srec->aflags[N] = 0; // Clear F_DELETED
srec->status = (srec->status &
~S_PURGE) | S_PURGED;
break;
+ case '%':
+ srec->pflags = (uchar)t3;
+ debug( "pending flags now
%s\n", fmt_lone_flags( t3 ).str );
+ break;
case '~':
srec->status = (srec->status &
~S_LOGGED) | t3;
if ((srec->status & S_EXPIRED)
&& svars->maxxfuid < srec->uid[F])
@@ -516,6 +521,10 @@ assign_uid( sync_vars_t *svars, sync_rec_t *srec, int t,
uint uid )
srec->uid[t] = uid;
if (uid == svars->newmaxuid[t] + 1)
svars->newmaxuid[t] = uid;
+ if (uid) {
+ if (!(srec->status & S_UPGRADE))
+ srec->flags = srec->pflags;
+ }
srec->status &= ~(S_PENDING | S_UPGRADE);
srec->tuid[0] = 0;
}
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel