commit 3d90507a759e81bc5c3e116a3751f34657aa023b
Author: Oswald Buddenhagen <o...@users.sf.net>
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
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to