diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-11-17 07:26:49 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-11-17 07:26:49 +0200 |
commit | 6e0fb32ec8557a443e7ea110bc923dfd7b79ae03 (patch) | |
tree | a97d7a54ab4339d84403ad9d2c3299d700469b75 | |
parent | 1d846d2d92d2f788f1aeffb457f08ccdb7a1a5df (diff) | |
download | mailutils-6e0fb32ec8557a443e7ea110bc923dfd7b79ae03.tar.gz mailutils-6e0fb32ec8557a443e7ea110bc923dfd7b79ae03.tar.bz2 |
sortm: reset the uidvalidity of the modified mailbox
* include/mailutils/mailbox.h (mu_mailbox_uidvalidity_reset): New proto.
* include/mailutils/sys/mailbox.h (_mu_mailbox): Replace the
_uidvalidity member with two function pointers: _get_uidvalidity and
_set_uidvalidity.
* libmailutils/mailbox/mailbox.c (mu_mailbox_uidvalidity_reset): New
function.
* libmailutils/base/amd.c: Initialize the two methods.
* libproto/dotmail/dotmail.c: Likewise.
* libproto/mbox/mbox.c: Likewise.
* libproto/imap/mbox.c: Initialize the _get_uidvalidity field.
* mh/sortm.c: Reset the uidvalidity on success.
* mh/tests/sortm.at: Check that the uidvalidity changed after sorting
-rw-r--r-- | include/mailutils/mailbox.h | 1 | ||||
-rw-r--r-- | include/mailutils/sys/mailbox.h | 3 | ||||
-rw-r--r-- | libmailutils/base/amd.c | 25 | ||||
-rw-r--r-- | libmailutils/mailbox/mailbox.c | 11 | ||||
-rw-r--r-- | libproto/dotmail/dotmail.c | 15 | ||||
-rw-r--r-- | libproto/imap/mbox.c | 2 | ||||
-rw-r--r-- | libproto/mbox/mbox.c | 23 | ||||
-rw-r--r-- | mh/sortm.c | 3 | ||||
-rw-r--r-- | mh/tests/sortm.at | 10 |
9 files changed, 79 insertions, 14 deletions
diff --git a/include/mailutils/mailbox.h b/include/mailutils/mailbox.h index f8866d97b..c9f12ec19 100644 --- a/include/mailutils/mailbox.h +++ b/include/mailutils/mailbox.h @@ -56,6 +56,7 @@ extern int mu_mailbox_flush (mu_mailbox_t mbox, int expunge); extern int mu_mailbox_get_folder (mu_mailbox_t, mu_folder_t *); extern int mu_mailbox_set_folder (mu_mailbox_t, mu_folder_t); extern int mu_mailbox_uidvalidity (mu_mailbox_t, unsigned long *); +extern int mu_mailbox_uidvalidity_reset (mu_mailbox_t); extern int mu_mailbox_uidnext (mu_mailbox_t, size_t *); extern int mu_mailbox_access_time (mu_mailbox_t mbox, time_t *return_time); diff --git a/include/mailutils/sys/mailbox.h b/include/mailutils/sys/mailbox.h index e48895f2a..6ba37349a 100644 --- a/include/mailutils/sys/mailbox.h +++ b/include/mailutils/sys/mailbox.h @@ -74,7 +74,8 @@ struct _mu_mailbox int (*_message_unseen) (mu_mailbox_t, size_t *); int (*_expunge) (mu_mailbox_t); int (*_sync) (mu_mailbox_t); - int (*_uidvalidity) (mu_mailbox_t, unsigned long *); + int (*_get_uidvalidity) (mu_mailbox_t, unsigned long *); + int (*_set_uidvalidity) (mu_mailbox_t, unsigned long); int (*_uidnext) (mu_mailbox_t, size_t *); int (*_get_property) (mu_mailbox_t, mu_property_t *); diff --git a/libmailutils/base/amd.c b/libmailutils/base/amd.c index d209ffce3..797c4ff8f 100644 --- a/libmailutils/base/amd.c +++ b/libmailutils/base/amd.c @@ -88,7 +88,8 @@ static int amd_message_unseen (mu_mailbox_t, size_t *); static int amd_expunge (mu_mailbox_t); static int amd_sync (mu_mailbox_t); static int amd_uidnext (mu_mailbox_t mailbox, size_t *puidnext); -static int amd_uidvalidity (mu_mailbox_t, unsigned long *); +static int amd_get_uidvalidity (mu_mailbox_t, unsigned long *); +static int amd_set_uidvalidity (mu_mailbox_t, unsigned long); static int amd_scan (mu_mailbox_t, size_t, size_t *); static int amd_is_updated (mu_mailbox_t); static int amd_get_size (mu_mailbox_t, mu_off_t *); @@ -418,7 +419,8 @@ amd_init_mailbox (mu_mailbox_t mailbox, size_t amd_size, mailbox->_message_unseen = amd_message_unseen; mailbox->_expunge = amd_expunge; mailbox->_sync = amd_sync; - mailbox->_uidvalidity = amd_uidvalidity; + mailbox->_get_uidvalidity = amd_get_uidvalidity; + mailbox->_set_uidvalidity = amd_set_uidvalidity; mailbox->_uidnext = amd_uidnext; mailbox->_scan = amd_scan; @@ -1470,7 +1472,7 @@ amd_sync (mu_mailbox_t mailbox) } static int -amd_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) +amd_get_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) { struct _amd_data *amd = mailbox->data; int status = amd_messages_count (mailbox, NULL); @@ -1488,6 +1490,23 @@ amd_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) } static int +amd_set_uidvalidity (mu_mailbox_t mailbox, unsigned long uidvalidity) +{ + struct _amd_data *amd = mailbox->data; + int status = amd_messages_count (mailbox, NULL); + if (status != 0) + return status; + /* If we did not start scanning yet do it now. */ + if (amd->msg_count == 0) + { + status = _amd_scan0 (amd, 1, NULL, 0); + if (status != 0) + return status; + } + return _amd_prop_store_off (amd, _MU_AMD_PROP_UIDVALIDITY, uidvalidity); +} + +static int amd_uidnext (mu_mailbox_t mailbox, size_t *puidnext) { struct _amd_data *amd = mailbox->data; diff --git a/libmailutils/mailbox/mailbox.c b/libmailutils/mailbox/mailbox.c index aad6acb01..47ef59cb6 100644 --- a/libmailutils/mailbox/mailbox.c +++ b/libmailutils/mailbox/mailbox.c @@ -635,8 +635,15 @@ mu_mailbox_get_size (mu_mailbox_t mbox, mu_off_t *psize) int mu_mailbox_uidvalidity (mu_mailbox_t mbox, unsigned long *pvalid) { - _MBOX_CHECK_Q (mbox, _uidvalidity); - return mbox->_uidvalidity (mbox, pvalid); + _MBOX_CHECK_Q (mbox, _get_uidvalidity); + return mbox->_get_uidvalidity (mbox, pvalid); +} + +int +mu_mailbox_uidvalidity_reset (mu_mailbox_t mbox) +{ + _MBOX_CHECK_Q (mbox, _set_uidvalidity); + return mbox->_set_uidvalidity (mbox, time (NULL)); } int diff --git a/libproto/dotmail/dotmail.c b/libproto/dotmail/dotmail.c index 92a2df5a8..4e71ccd78 100644 --- a/libproto/dotmail/dotmail.c +++ b/libproto/dotmail/dotmail.c @@ -758,7 +758,7 @@ mu_dotmail_mailbox_uid_setup (struct mu_dotmail_mailbox *dmp) } static int -dotmail_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) +dotmail_get_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) { struct mu_dotmail_mailbox *dmp = mailbox->data; int rc = mu_dotmail_mailbox_uid_setup (dmp); @@ -768,6 +768,16 @@ dotmail_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) } static int +dotmail_set_uidvalidity (mu_mailbox_t mailbox, unsigned long uidvalidity) +{ + struct mu_dotmail_mailbox *dmp = mailbox->data; + int rc = mu_dotmail_mailbox_uid_setup (dmp); + if (rc == 0) + dmp->uidvalidity = uidvalidity; + return rc; +} + +static int dotmail_uidnext (mu_mailbox_t mailbox, size_t *puidnext) { struct mu_dotmail_mailbox *dmp = mailbox->data; @@ -1448,7 +1458,8 @@ mu_dotmail_mailbox_init (mu_mailbox_t mailbox) mailbox->_expunge = dotmail_expunge; mailbox->_sync = dotmail_sync; - mailbox->_uidvalidity = dotmail_uidvalidity; + mailbox->_get_uidvalidity = dotmail_get_uidvalidity; + mailbox->_set_uidvalidity = dotmail_set_uidvalidity; mailbox->_uidnext = dotmail_uidnext; mailbox->_get_size = dotmail_get_size; mailbox->_get_atime = dotmail_get_atime; diff --git a/libproto/imap/mbox.c b/libproto/imap/mbox.c index 6cb1286b6..c5eaf68cb 100644 --- a/libproto/imap/mbox.c +++ b/libproto/imap/mbox.c @@ -1416,7 +1416,7 @@ _mu_imap_mailbox_init (mu_mailbox_t mailbox) mailbox->_messages_count = _imap_messages_count; mailbox->_messages_recent = _imap_messages_recent; mailbox->_message_unseen = _imap_message_unseen; - mailbox->_uidvalidity = _imap_uidvalidity; + mailbox->_get_uidvalidity = _imap_uidvalidity; mailbox->_uidnext = _imap_uidnext; mailbox->_scan = _imap_mbx_scan; diff --git a/libproto/mbox/mbox.c b/libproto/mbox/mbox.c index d05482ce3..33dc5c69f 100644 --- a/libproto/mbox/mbox.c +++ b/libproto/mbox/mbox.c @@ -783,7 +783,7 @@ mbox_message_unseen (mu_mailbox_t mailbox, size_t *pmsgno) } static int -mbox_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) +mbox_get_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) { mbox_data_t mud = mailbox->data; int status = mbox_messages_count (mailbox, NULL); @@ -802,6 +802,24 @@ mbox_uidvalidity (mu_mailbox_t mailbox, unsigned long *puidvalidity) } static int +mbox_set_uidvalidity (mu_mailbox_t mailbox, unsigned long uidvalidity) +{ + mbox_data_t mud = mailbox->data; + int status = mbox_messages_count (mailbox, NULL); + if (status != 0) + return status; + /* If we did not start a scanning yet do it now. */ + if (mud->messages_count == 0) + { + status = mbox_scan0 (mailbox, 1, NULL, 0); + if (status != 0) + return status; + } + mud->uidvalidity = uidvalidity; + return 0; +} + +static int mbox_uidnext (mu_mailbox_t mailbox, size_t *puidnext) { mbox_data_t mud = mailbox->data; @@ -1538,7 +1556,8 @@ _mailbox_mbox_init (mu_mailbox_t mailbox) mailbox->_message_unseen = mbox_message_unseen; mailbox->_expunge = mbox_expunge; mailbox->_sync = mbox_sync; - mailbox->_uidvalidity = mbox_uidvalidity; + mailbox->_get_uidvalidity = mbox_get_uidvalidity; + mailbox->_set_uidvalidity = mbox_set_uidvalidity; mailbox->_uidnext = mbox_uidnext; mailbox->_quick_get_message = mbox_quick_get_message; diff --git a/mh/sortm.c b/mh/sortm.c index 74e8331f9..ab3ec5767 100644 --- a/mh/sortm.c +++ b/mh/sortm.c @@ -486,7 +486,7 @@ sighandler (int sig) } void -sort () +sort (void) { size_t *oldlist, i; oldlist = mu_alloc (msgcount * sizeof (*oldlist)); @@ -557,6 +557,7 @@ sort () } if (action == ACTION_REORDER) { + mu_mailbox_uidvalidity_reset (mbox); mu_mailbox_close (mbox); mu_mailbox_open (mbox, MU_STREAM_RDWR); mh_mailbox_set_cur (mbox, current_num); diff --git a/mh/tests/sortm.at b/mh/tests/sortm.at index 2f83e61a8..03e769a6c 100644 --- a/mh/tests/sortm.at +++ b/mh/tests/sortm.at @@ -23,10 +23,12 @@ MH_CHECK([sortm -textfield],[sortm00 sortm-textfield],[ mbox2dir -m Mail/teaparty $spooldir/teaparty.mbox echo "cur: 11" > Mail/teaparty/.mh_sequences sortm -text From -nodate +teaparty || exit $? +sed -e 's/ *//' Mail/teaparty/.mu-prop | grep -v '^uid-validity:10$' | grep uid-validity >/dev/null && echo OK scancmd ], [0], -[ 1 07/29 Alice Re: Invitation +[OK + 1 07/29 Alice Re: Invitation 2 07/29 Alice Re: Invitation 3 07/29 Alice Re: Invitation 4 07/29 Alice Re: Personal remark @@ -127,12 +129,15 @@ MH_CHECK([sortm -datefield],[sortm01 sortm-datefield],[ mbox2dir -m Mail/teaparty $spooldir/teaparty.mbox echo "cur: 11" > Mail/teaparty/.mh_sequences sortm -text From -nodate +teaparty || exit $? +sed -e 's/ *//' Mail/teaparty/.mu-prop | grep -v '^uid-validity:10$' | grep uid-validity >/dev/null && echo OK scancmd sortm +sed -e 's/ *//' Mail/teaparty/.mu-prop | grep -v '^uid-validity:10$' | grep uid-validity >/dev/null && echo OK scancmd ], [0], -[ 1 07/29 Alice Re: Invitation +[OK + 1 07/29 Alice Re: Invitation 2 07/29 Alice Re: Invitation 3 07/29 Alice Re: Invitation 4 07/29 Alice Re: Personal remark @@ -227,6 +232,7 @@ scancmd 93 07/29 March Hare Request for a story (was Re: A guess) 94 07/29 March Hare Re: Request for a story 95 07/29 March Hare Remark +OK 1 07/29 March Hare Invitation 2 07/29 Alice Re: Invitation 3 07/29 March Hare Re: Invitation |