summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mh.c72
-rw-r--r--mx.c19
2 files changed, 74 insertions, 17 deletions
diff --git a/mh.c b/mh.c
index be9f30cf..a0d8ae64 100644
--- a/mh.c
+++ b/mh.c
@@ -268,11 +268,13 @@ static int maildir_parse_dir(CONTEXT *ctx, struct maildir ***last,
while ((de = readdir (dirp)) != NULL)
{
+
if ((ctx->magic == M_MH && !mh_valid_message(de->d_name)) || (ctx->magic == M_MAILDIR && *de->d_name == '.'))
continue;
/* FOO - really ignore the return value? */
-
+
+ dprint(2, (debugfile, "%s:%d: parsing %s\n", __FILE__, __LINE__, de->d_name));
maildir_parse_entry(ctx, last, subdir, de->d_name, count, is_old);
}
@@ -286,8 +288,19 @@ static void maildir_add_to_context(CONTEXT *ctx, struct maildir *md)
{
while(md)
{
+
+ dprint(2, (debugfile, "%s:%d maildir_add_to_context(): Considering %s\n",
+ __FILE__, __LINE__, md->canon_fname));
+
if(md->h)
{
+
+ dprint(2, (debugfile, "%s:%d Adding header structure. Flags: %s%s%s%s%s\n", __FILE__, __LINE__,
+ md->h->flagged ? "f" : "",
+ md->h->deleted ? "D" : "",
+ md->h->replied ? "r" : "",
+ md->h->old ? "O" : "",
+ md->h->read ? "R" : ""));
if(ctx->msgcount == ctx->hdrmax)
mx_alloc_memory(ctx);
@@ -457,7 +470,7 @@ static int maildir_sync_message (CONTEXT *ctx, int msgno)
char oldpath[_POSIX_PATH_MAX];
char *p;
- if ((p = strchr (h->path, '/')) == NULL)
+ if ((p = strrchr (h->path, '/')) == NULL)
{
dprint (1, (debugfile, "maildir_sync_message: %s: unable to find subdir!\n",
h->path));
@@ -590,13 +603,13 @@ static char *maildir_canon_filename(char *dest, char *src, size_t l)
{
char *t, *u;
- if((t = strchr(src, '/')))
+ if((t = strrchr(src, '/')))
src = t + 1;
strfcpy(dest, src, l);
- if((u = strchr(dest, ';')))
+ if((u = strrchr(dest, ':')))
*u = '\0';
-
+
return dest;
}
@@ -671,7 +684,7 @@ int mh_check_mailbox(CONTEXT *ctx, int *index_hint)
if(ctx->magic == M_MAILDIR)
{
- if(have_new)
+ if(have_new || modified)
maildir_parse_dir(ctx, &last, "new", NULL);
if(modified)
maildir_parse_dir(ctx, &last, "cur", NULL);
@@ -707,27 +720,60 @@ int mh_check_mailbox(CONTEXT *ctx, int *index_hint)
else
strfcpy(b1, ctx->hdrs[i]->path, sizeof(b1));
- if((p = hash_find(fnames, b1)) && p->h &&
+ dprint(2, (debugfile, "%s:%d: mh_check_mailbox(): Looking for %s.\n", __FILE__, __LINE__, b1));
+
+ if((p = hash_find(fnames, b1)) && p->h &&
mbox_strict_cmp_headers(ctx->hdrs[i], p->h))
{
/* found the right message */
-
+
+ dprint(2, (debugfile, "%s:%d: Found. Flags before: %s%s%s%s%s\n", __FILE__, __LINE__,
+ ctx->hdrs[i]->flagged ? "f" : "",
+ ctx->hdrs[i]->deleted ? "D" : "",
+ ctx->hdrs[i]->replied ? "r" : "",
+ ctx->hdrs[i]->old ? "O" : "",
+ ctx->hdrs[i]->read ? "R" : ""));
+
if(modified)
{
if(!ctx->hdrs[i]->changed)
{
- ctx->hdrs[i]->flagged = p->h->flagged;
- ctx->hdrs[i]->replied = p->h->replied;
- ctx->hdrs[i]->old = p->h->old;
- ctx->hdrs[i]->read = p->h->read;
+ mutt_set_flag (ctx, ctx->hdrs[i], M_FLAG, p->h->flagged);
+ mutt_set_flag (ctx, ctx->hdrs[i], M_REPLIED, p->h->replied);
+ mutt_set_flag (ctx, ctx->hdrs[i], M_READ, p->h->read);
}
+
+ /*
+ * This flag relates to file positions for maildir folders,
+ * so we _must_ use the modified folder's value here.
+ * Otherwise, the mail folder will appear to be corrupted.
+ */
+
+ mutt_set_flag(ctx, ctx->hdrs[i], M_OLD, p->h->old);
+
}
-
+
ctx->hdrs[i]->active = 1;
+
+ dprint(2, (debugfile, "%s:%d: Flags after: %s%s%s%s%s\n", __FILE__, __LINE__,
+ ctx->hdrs[i]->flagged ? "f" : "",
+ ctx->hdrs[i]->deleted ? "D" : "",
+ ctx->hdrs[i]->replied ? "r" : "",
+ ctx->hdrs[i]->old ? "O" : "",
+ ctx->hdrs[i]->read ? "R" : ""));
+
mutt_free_header(&p->h);
}
else
{
+
+ dprint(2, (debugfile, "%s:%d: Not found. Flags were: %s%s%s%s%s\n", __FILE__, __LINE__,
+ ctx->hdrs[i]->flagged ? "f" : "",
+ ctx->hdrs[i]->deleted ? "D" : "",
+ ctx->hdrs[i]->replied ? "r" : "",
+ ctx->hdrs[i]->old ? "O" : "",
+ ctx->hdrs[i]->read ? "R" : ""));
+
/* the message has disappeared by occult forces, correct
* the index hint.
*/
diff --git a/mx.c b/mx.c
index d38c8630..ddf0d6fc 100644
--- a/mx.c
+++ b/mx.c
@@ -838,7 +838,7 @@ int mx_close_mailbox (CONTEXT *ctx)
/* update a Context structure's internal tables. */
-void mx_update_tables(CONTEXT *ctx, int do_delete)
+void mx_update_tables(CONTEXT *ctx, int committing)
{
int i, j;
@@ -854,8 +854,8 @@ void mx_update_tables(CONTEXT *ctx, int do_delete)
#define this_body ctx->hdrs[j]->content
for (i = 0, j = 0; i < ctx->msgcount; i++)
{
- if ((do_delete && !ctx->hdrs[i]->deleted) ||
- (!do_delete && ctx->hdrs[i]->active))
+ if ((committing && !ctx->hdrs[i]->deleted) ||
+ (!committing && ctx->hdrs[i]->active))
{
if (i != j)
{
@@ -870,7 +870,17 @@ void mx_update_tables(CONTEXT *ctx, int do_delete)
ctx->vsize += this_body->length + this_body->offset -
this_body->hdr_offset;
}
- ctx->hdrs[j]->changed = 0;
+
+ if(committing)
+ ctx->hdrs[j]->changed = 0;
+ else
+ {
+ if (ctx->hdrs[j]->deleted)
+ ctx->deleted++;
+ if (ctx->hdrs[j]->changed)
+ ctx->changed++;
+ }
+
if (ctx->hdrs[j]->tagged)
ctx->tagged++;
if (ctx->hdrs[j]->flagged)
@@ -881,6 +891,7 @@ void mx_update_tables(CONTEXT *ctx, int do_delete)
if (!ctx->hdrs[j]->old)
ctx->new++;
}
+
j++;
}
else