summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-11-17 07:26:49 +0200
committerSergey Poznyakoff <gray@gnu.org>2020-11-17 07:26:49 +0200
commit6e0fb32ec8557a443e7ea110bc923dfd7b79ae03 (patch)
treea97d7a54ab4339d84403ad9d2c3299d700469b75
parent1d846d2d92d2f788f1aeffb457f08ccdb7a1a5df (diff)
downloadmailutils-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.h1
-rw-r--r--include/mailutils/sys/mailbox.h3
-rw-r--r--libmailutils/base/amd.c25
-rw-r--r--libmailutils/mailbox/mailbox.c11
-rw-r--r--libproto/dotmail/dotmail.c15
-rw-r--r--libproto/imap/mbox.c2
-rw-r--r--libproto/mbox/mbox.c23
-rw-r--r--mh/sortm.c3
-rw-r--r--mh/tests/sortm.at10
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

Return to:

Send suggestions and report system problems to the System administrator.