ref: 220d88a590fb598cb1bf1bbc031e3a4506fe6eab
parent: 2bd4856a42fb0f428ec848c658396c850f1b77e5
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jan 23 02:45:55 EST 2021
mbox: adjust nsub correctly when wiring dummy in When flipping a dummy over to a concrete message, we can have more than one message being added to the parent. Specifically: [D] a b flipping to: x y D a b adds 3 to the nsub for x and y.
--- a/mbox.c
+++ b/mbox.c
@@ -169,7 +169,7 @@
}
static int
-addchild(Mesg *p, Mesg *m)
+addchild(Mesg *p, Mesg *m, int d)
{
Mesg *q;
@@ -183,7 +183,7 @@
q->time = m->time;
}
for(q = p; q != nil; q = q->parent)
- q->nsub++;
+ q->nsub += d;
p->child = erealloc(p->child, ++p->nchild*sizeof(Mesg*));
p->child[p->nchild - 1] = m;
qsort(p->child, p->nchild, sizeof(Mesg*), rcmpmesg);
@@ -343,6 +343,7 @@
load(char *name, char *digest, int ins)
{
Mesg *m, *p;
+ int d;
if(strncmp(name, mbox.path, strlen(mbox.path)) == 0)
name += strlen(mbox.path);
@@ -352,8 +353,10 @@
if(digest != nil && strcmp(digest, m->digest) != 0)
goto error;
/* if we already have a dummy, populate it */
+ d = 1;
p = lookupid(m->messageid);
if(p != nil && (p->state & Sdummy)){
+ d = p->nsub + 1;
m->child = p->child;
m->nchild = p->nchild;
m->nsub = p->nsub;
@@ -380,7 +383,7 @@
p = lookupid(m->inreplyto);
if(p == nil)
p = placeholder(m->inreplyto, m->time, ins);
- if(!addchild(p, m))
+ if(!addchild(p, m, d))
m->state |= Stoplev;
return m;
error:
@@ -669,7 +672,7 @@
c = m->child[i];
c->parent = nil;
if(p != nil)
- addchild(p, c);
+ addchild(p, c, 1);
else
c->state |= Stoplev;
}