X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Ffolder.c;h=616f57b90c37b025538f4bdf9224de7a9fda461f;hb=6cdade9983a7ebd5a5bb8296daa49d5475f07af8;hp=25ab068c4d26c02e52ec5c2131bf178ec3e7a4d6;hpb=240013872c392fe644bd4f79382d9f5314b4ea60;p=mmh diff --git a/uip/folder.c b/uip/folder.c index 25ab068..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 @@ -140,108 +141,108 @@ main(int argc, char **argv) while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { - case AMBIGSW: - ambigsw(cp, switches); - done(1); - case UNKWNSW: - adios(NULL, "-%s unknown", cp); - - case HELPSW: - snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); - print_help(buf, switches, 1); - done(1); - case VERSIONSW: - print_version(invo_name); - done(1); - - case ALLSW: - all = 1; - continue; - - case NALLSW: - all = 0; - continue; - - case CREATSW: - fcreat = 1; - continue; - case NCREATSW: - fcreat = -1; - continue; - - case FASTSW: - fshort++; - continue; - case NFASTSW: - fshort = 0; - continue; - - case HDRSW: - fheader = 1; - continue; - case NHDRSW: - fheader = -1; - continue; - - case PACKSW: - fpack++; - continue; - case NPACKSW: - fpack = 0; - continue; - - case VERBSW: - fverb++; - continue; - case NVERBSW: - fverb = 0; - continue; - - case RECURSW: - frecurse++; - continue; - case NRECRSW: - frecurse = 0; - continue; - - case TOTALSW: - ftotal = 1; - continue; - case NTOTLSW: - ftotal = -1; - continue; - - case PRNTSW: - printsw = 1; - continue; - case NPRNTSW: - printsw = 0; - continue; - - case LISTSW: - listsw = 1; - continue; - case NLISTSW: - listsw = 0; - continue; - - case PUSHSW: - pushsw = 1; - listsw = 1; - popsw = 0; - continue; - case POPSW: - popsw = 1; - listsw = 1; - pushsw = 0; - continue; + case AMBIGSW: + ambigsw(cp, switches); + done(1); + case UNKWNSW: + adios(NULL, "-%s unknown", cp); + + case HELPSW: + snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); + print_help(buf, switches, 1); + done(1); + case VERSIONSW: + print_version(invo_name); + done(1); + + case ALLSW: + all = 1; + continue; + + case NALLSW: + all = 0; + continue; + + case CREATSW: + fcreat = 1; + continue; + case NCREATSW: + fcreat = -1; + continue; + + case FASTSW: + fshort++; + continue; + case NFASTSW: + fshort = 0; + continue; + + case HDRSW: + fheader = 1; + continue; + case NHDRSW: + fheader = -1; + continue; + + case PACKSW: + fpack++; + continue; + case NPACKSW: + fpack = 0; + continue; + + case VERBSW: + fverb++; + continue; + case NVERBSW: + fverb = 0; + continue; + + case RECURSW: + frecurse++; + continue; + case NRECRSW: + frecurse = 0; + continue; + + case TOTALSW: + ftotal = 1; + continue; + case NTOTLSW: + ftotal = -1; + continue; + + case PRNTSW: + printsw = 1; + continue; + case NPRNTSW: + printsw = 0; + continue; + + case LISTSW: + listsw = 1; + continue; + case NLISTSW: + listsw = 0; + continue; + + case PUSHSW: + pushsw = 1; + listsw = 1; + popsw = 0; + continue; + case POPSW: + popsw = 1; + listsw = 1; + pushsw = 0; + continue; } } if (*cp == '+' || *cp == '@') { if (argfolder) adios(NULL, "only one folder at a time!"); else - argfolder = pluspath(cp); + argfolder = getcpy(expandfol(cp)); } else { if (msg) adios(NULL, "only one (current) message at a time!"); @@ -250,9 +251,7 @@ main(int argc, char **argv) } } - if (!context_find("path")) - free(path("./", TFOLDER)); - nmhdir = concat(m_maildir(""), "/", NULL); + nmhdir = concat(toabsdir("+"), "/", NULL); /* ** If we aren't working with the folder stack @@ -273,15 +272,15 @@ main(int argc, char **argv) } else { adios(NULL, "no other folder"); } - for (cp = getcpy(getfolder(1)); *ap; ap++) + for (cp = getcpy(getcurfol()); *ap; ap++) cp = add(*ap, add(" ", cp)); free(dp); context_replace(stack, cp); /* update folder stack */ } else { /* update folder stack */ context_replace(stack, (cp = context_find (stack)) ? - concat(getfolder(1), " ", cp, NULL) : - getcpy(getfolder(1))); + concat(getcurfol(), " ", cp, NULL) : + getcpy(getcurfol())); } } @@ -309,18 +308,18 @@ main(int argc, char **argv) free(dp); } if (pushsw || popsw) { - cp = m_maildir(argfolder); + cp = toabsdir(argfolder); if (access(cp, F_OK) == NOTOK) adios(cp, "unable to find folder"); /* update current folder */ - context_replace(pfolder, argfolder); + context_replace(curfolder, argfolder); context_save(); /* save the context file */ argfolder = NULL; } /* Listing the folder stack */ if (listsw) { - printf("%s", argfolder ? argfolder : getfolder(1)); + printf("%s", argfolder ? argfolder : getcurfol()); if ((cp = context_find(stack))) { dp = getcpy(cp); for (ap = brkstring(dp, " ", "\n"); *ap; ap++) @@ -354,14 +353,14 @@ main(int argc, char **argv) if (msg) admonish(NULL, "no folder given for message %s", msg); readonly_folders(); /* do any readonly folders */ - strncpy(folder, (cp = context_find(pfolder)) ? + strncpy(folder, (cp = context_find(curfolder)) ? cp : "", sizeof(folder)); crawl_folders(".", get_folder_info_callback, NULL); } else { strncpy(folder, argfolder, sizeof(folder)); if (get_folder_info(argfolder, msg)) { /* update current folder */ - context_replace(pfolder, argfolder); + context_replace(curfolder, argfolder); context_save(); } /* @@ -373,18 +372,18 @@ main(int argc, char **argv) NULL); } } else { - strncpy(folder, argfolder ? argfolder : getfolder (1), + strncpy(folder, argfolder ? argfolder : getcurfol(), sizeof(folder)); /* ** Check if folder exists. If not, then see if ** we should create it, or just exit. */ - create_folder(m_maildir(folder), fcreat, done); + create_folder(toabsdir(folder), fcreat, done); if (get_folder_info(folder, msg) && argfolder) { /* update current folder */ - context_replace(pfolder, argfolder); + context_replace(curfolder, argfolder); } } @@ -566,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 @@ -654,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; +}