X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Ffolder.c;h=616f57b90c37b025538f4bdf9224de7a9fda461f;hb=31dc797eb5178970d68962ca8939da3fd9a8efda;hp=7f829f095538762b53a34669dbc487add44fdfe0;hpb=5b792c4424571f05bc2008e3109797d18d7d00d1;p=mmh diff --git a/uip/folder.c b/uip/folder.c index 7f829f0..616f57b 100644 --- a/uip/folder.c +++ b/uip/folder.c @@ -109,6 +109,7 @@ static crawl_callback_t get_folder_info_callback; static void print_folders(void); static int sfold(struct msgs *, char *); static void readonly_folders(void); +static int folder_pack(struct msgs **, int); int @@ -564,7 +565,7 @@ print_folders(void) } /* Add `+' to end of name, if folder is current */ - if (strcmp(folder, fi[i].name)) + if (strcmp(folder, fi[i].name)!=0) snprintf(tmpname, sizeof(tmpname), "%s", fi[i].name); else @@ -652,11 +653,105 @@ readonly_folders(void) char atrcur[BUFSIZ]; register struct node *np; - snprintf(atrcur, sizeof(atrcur), "atr-%s-", current); + snprintf(atrcur, sizeof(atrcur), "atr-%s-", seq_cur); atrlen = strlen(atrcur); for (np = m_defs; np; np = np->n_next) - if (isprefix(atrcur, np->n_name) - && !isprefix(nmhdir, np->n_name + atrlen)) + if (strncmp(np->n_name, atrcur, atrlen)==0 && + strncmp(np->n_name+atrlen, nmhdir, strlen(nmhdir))!=0) + /* Why do we exclude absolute path names? --meillo */ get_folder_info(np->n_name + atrlen, NULL); } + + +/* +** pack (renumber) the messages in a folder +** into a contiguous range from 1 to n. +** Return -1 if error, else return 0. +*/ +static int +folder_pack(struct msgs **mpp, int verbose) +{ + int hole, msgnum, newcurrent = 0; + char newmsg[BUFSIZ], oldmsg[BUFSIZ]; + struct msgs *mp; + + mp = *mpp; + + /* + ** Just return if folder is empty. + */ + if (mp->nummsg == 0) + return 0; + + /* + ** Make sure we have message status space allocated + ** for all numbers from 1 to current high message. + */ + if (mp->lowoff > 1) { + if ((mp = folder_realloc(mp, 1, mp->hghmsg))) + *mpp = mp; + else { + advise(NULL, "unable to allocate folder storage"); + return -1; + } + } + + for (msgnum = mp->lowmsg, hole = 1; msgnum <= mp->hghmsg; msgnum++) { + if (does_exist(mp, msgnum)) { + if (msgnum != hole) { + strncpy(newmsg, m_name(hole), sizeof(newmsg)); + strncpy(oldmsg, m_name(msgnum), sizeof(oldmsg)); + if (verbose) + printf("message %s becomes %s\n", oldmsg, newmsg); + + /* + ** Invoke the external refile hook for each + ** message being renamed. This is done + ** before the file is renamed so that the + ** old message file is around for the hook. + */ + + snprintf(oldmsg, sizeof (oldmsg), "%s/%d", + mp->foldpath, msgnum); + snprintf(newmsg, sizeof (newmsg), "%s/%d", + mp->foldpath, hole); + ext_hook("ref-hook", oldmsg, newmsg); + + /* move the message file */ + if (rename(oldmsg, newmsg) == -1) { + advise(newmsg, "unable to rename %s to", oldmsg); + return -1; + } + + /* check if this is the current message */ + if (msgnum == mp->curmsg) + newcurrent = hole; + + /* copy the attribute flags for this message */ + copy_msg_flags(mp, hole, msgnum); + + if (msgnum == mp->lowsel) + mp->lowsel = hole; + if (msgnum == mp->hghsel) + mp->hghsel = hole; + + /* + ** mark that sequence information has + ** been modified + */ + mp->msgflags |= SEQMOD; + } + hole++; + } + } + + /* record the new number for the high/low message */ + mp->lowmsg = 1; + mp->hghmsg = hole - 1; + + if (newcurrent) + seq_setcur(mp, newcurrent); + + return 0; +}