commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-653-gd7dec96


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-653-gd7dec96
Date: Sun, 07 Apr 2013 08:21:57 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=d7dec96841e872ffa6924d6c5f93a1be473bf8ff

The branch, master has been updated
       via  d7dec96841e872ffa6924d6c5f93a1be473bf8ff (commit)
      from  ae06384d11d4b1f6ca576630f833ec2f32e6b05a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d7dec96841e872ffa6924d6c5f93a1be473bf8ff
Author: Sergey Poznyakoff <address@hidden>
Date:   Sun Apr 7 11:23:18 2013 +0300

    Fix MH sequence parser.
    
    * mh/mh_msgset.c (parse_range): Fix resolving non-existing UIDs.
    * mh/tests/mhseq.at: Add more test cases.

-----------------------------------------------------------------------

Summary of changes:
 mh/mh_msgset.c    |  144 ++++++++++++++++++++++++++++++++++++++---------------
 mh/tests/mhseq.at |  114 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 218 insertions(+), 40 deletions(-)

diff --git a/mh/mh_msgset.c b/mh/mh_msgset.c
index 305143e..47e6e7e 100644
--- a/mh/mh_msgset.c
+++ b/mh/mh_msgset.c
@@ -98,7 +98,6 @@ mh_msgset_single_message (mu_msgset_t msgset)
     }
   return r->msg_beg == r->msg_end;
 }
-
 
 struct msgset_parser
 {
@@ -466,22 +465,42 @@ parse_range (struct msgset_parser *parser)
        return 0;
       if (!validuid)
        {
-         size_t total, lastuid;
-         msgset_last (parser->msgset->mbox, &total);
-         mu_mailbox_translate (parser->msgset->mbox,
-                               MU_MAILBOX_MSGNO_TO_UID,
-                               total, &lastuid);
-         if (start > lastuid)
+         if (parser->sign)
            {
-             if (!parser->sign)
-               emptyrange_abort (parser->argv[-1]);
-             start = total;
+             while (1)
+               {
+                 if (--start == 0)
+                   emptyrange_abort (parser->argv[-1]);
+                 if (mu_mailbox_translate (parser->msgset->mbox,
+                                           MU_MAILBOX_UID_TO_MSGNO,
+                                           start, &start) == 0)
+                   break;
+               }
            }
          else
            {
-             if (parser->sign)
+             size_t total, lastuid;
+         
+             msgset_last (parser->msgset->mbox, &total);
+             mu_mailbox_translate (parser->msgset->mbox,
+                                   MU_MAILBOX_MSGNO_TO_UID,
+                                   total, &lastuid);
+             if (start > lastuid)
                emptyrange_abort (parser->argv[-1]);
-             start = 1;
+             else
+               while (1)
+                 {
+                   if (start == lastuid)
+                     {
+                       start = total;
+                       break;
+                     }
+                   ++start;
+                   if (mu_mailbox_translate (parser->msgset->mbox,
+                                             MU_MAILBOX_UID_TO_MSGNO,
+                                             start, &start) == 0)
+                     break;
+                 }
            }
        }
       add_messages (parser, start, parser->number, parser->sign);
@@ -489,47 +508,92 @@ parse_range (struct msgset_parser *parser)
     }
   else if (*parser->curp == '-')
     {
-      size_t lastuid = 0;
       int validuid = parser->validuid;
       int rc;
       
       parser->curp++;
       if (parse_term (parser, 0) == PARSE_EOF)
        return 0;
-      if (!parser->validuid)
+
+      /* If any of UIDs does not exist, try to find the nearest
+        existing one: */
+      if (!validuid || !parser->validuid)
        {
-         size_t total;
+         size_t lastuid, num, maxnum;
 
-         msgset_last (parser->msgset->mbox, &total);
+         /* Order the limits */
+         if (!parser->validuid)
+           maxnum = parser->number;
+         else
+           mu_mailbox_translate (parser->msgset->mbox,
+                                 MU_MAILBOX_MSGNO_TO_UID,
+                                 parser->number, &maxnum);
+         if (!validuid)
+           num = start;
+         else
+           mu_mailbox_translate (parser->msgset->mbox,
+                                 MU_MAILBOX_MSGNO_TO_UID,
+                                 start, &num);
+
+         if (num > maxnum)
+           {
+             int v;
+             size_t n;
+
+             n = parser->number;
+             v = parser->validuid;
+             parser->number = start;
+             parser->validuid = validuid;
+             start = n;
+             validuid = v;
+           }
+
+         /* Adjust upper bound */
+         msgset_last (parser->msgset->mbox, &num);
          mu_mailbox_translate (parser->msgset->mbox, MU_MAILBOX_MSGNO_TO_UID,
-                               total, &lastuid);
+                               num, &lastuid);
 
-         if (parser->number > lastuid)
-           parser->number = total;
-         else if (!validuid)
-           emptyrange_abort (parser->argv[-1]);
-       }
-      if (!validuid)
-       {
-         if (!lastuid)
+         if (!parser->validuid && parser->number > lastuid)
            {
-             size_t total;
-             msgset_last (parser->msgset->mbox, &total);
-             mu_mailbox_translate (parser->msgset->mbox,
-                                   MU_MAILBOX_MSGNO_TO_UID,
-                                   total, &lastuid);
+             parser->number = num;
+             parser->validuid = 1;
            }
-         if (start > lastuid && !parser->validuid)
-           emptyrange_abort (parser->argv[-1]);
-         start = 1;
-       }
-      rc = mu_msgset_add_range (parser->msgset, start, parser->number,
-                               MU_MSGSET_NUM);
-      if (rc)
-       {
-         mu_diag_funcall (MU_DIAG_ERROR, "mu_msgset_add_range", NULL, rc);
-         exit (1);
+
+         /* Shift the bounds towards each other until they resolve to
+            existing UIDs or clash */
+         do
+           {
+             if (!validuid)
+               {
+                 ++start;
+                 if (start > lastuid)
+                   emptyrange_abort (parser->argv[-1]);
+                 rc = mu_mailbox_translate (parser->msgset->mbox,
+                                            MU_MAILBOX_UID_TO_MSGNO,
+                                            start, &start);
+                 if (rc == 0)
+                   validuid = 1;
+               }
+             if (!parser->validuid)
+               {
+                 if (parser->number == 1)
+                   emptyrange_abort (parser->argv[-1]);
+                 --parser->number;
+                 rc = mu_mailbox_translate (parser->msgset->mbox,
+                                            MU_MAILBOX_UID_TO_MSGNO,
+                                            parser->number, &num);
+                 if (rc == 0)
+                   {
+                     lastuid = parser->number;
+                     parser->number = num;
+                     parser->validuid = 1;
+                   }
+               }
+           }
+         while (!validuid || !parser->validuid);
        }
+      mu_msgset_add_range (parser->msgset, start, parser->number,
+                          MU_MSGSET_NUM);
     }
   else if (!parser->validuid)
     {
diff --git a/mh/tests/mhseq.at b/mh/tests/mhseq.at
index a66b885..a097743 100644
--- a/mh/tests/mhseq.at
+++ b/mh/tests/mhseq.at
@@ -406,5 +406,119 @@ mhseq last:2
 5
 ])
 
+MH_CHECK([mhseq: sparse increasing message range (left fixup in the middle)],
+[mhseq34],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 5-15
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse increasing message range (right fixup in the middle)],
+[mhseq35],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 8-17
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse increasing message range (both fixups in the middle)],
+[mhseq36],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 5-17
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse decreasing message range (left fixup in the middle)],
+[mhseq37],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 15-5
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse decreasing message range (right fixup in the middle)],
+[mhseq38],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 17-8
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse decreasing message range (both fixups in the middle)],
+[mhseq39],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 17-5
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse counted range (positive, fixup)],
+[mhseq40],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 3:2
+],
+[0],
+[8
+15
+])
+
+MH_CHECK([mhseq: sparse counted range (negative, fixup)],
+[mhseq41],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+mv Mail/inbox/5 Mail/inbox/20
+mv Mail/inbox/4 Mail/inbox/15
+mv Mail/inbox/3 Mail/inbox/8
+MUT_MBCHMOD(Mail/inbox, 700)
+mhseq 17:-3
+],
+[0],
+[2
+8
+15
+])
+
+
 m4_popdef([MH_KEYWORDS])
 # End of mhseq.at
\ No newline at end of file


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]