From 7d5e16c835b0444330d424a98924dbd13523087f Mon Sep 17 00:00:00 2001
From: Guilhem Moulin <guilhem@fripost.org>
Date: Fri, 24 Jul 2015 01:21:17 +0200
Subject: Add a --check command to verify the synchronization state.

---
 lib/Net/IMAP/Sync.pm | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

(limited to 'lib')

diff --git a/lib/Net/IMAP/Sync.pm b/lib/Net/IMAP/Sync.pm
index 2aff76c..21e2fa8 100644
--- a/lib/Net/IMAP/Sync.pm
+++ b/lib/Net/IMAP/Sync.pm
@@ -682,6 +682,15 @@ sub append($$$@) {
 }
 
 
+# $self->fetch($set, $flags, [$callback])
+#   Issue an UID FETCH command with the given UID $set, $flags, and
+#   optional $callback.
+sub fetch($$$$) {
+    my ($self, $set, $flags, $callback) = @_;
+    $self->_send("UID FETCH $set $flags", $callback);
+}
+
+
 # $self->notify(@specifications)
 #   Issue a NOTIFY command with the given mailbox @specifications (cf RFC
 #   5465 section 6) to be monitored.  Croak if the server did not
@@ -832,13 +841,16 @@ sub next_dirty_mailbox($@) {
 }
 
 
-# $self->pull_updates()
+# $self->pull_updates([$full])
+#   If $full is set, FETCH FLAGS and MODSEQ for each UID up to
+#   UIDNEXT-1.
 #   Get pending updates (unprocessed VANISHED responses and FLAG
 #   updates), and empty these lists from the cache.
 #   Finally, update the HIGHESTMODSEQ from the persistent cache to the
 #   value found in the internal cache.
-sub pull_updates($) {
+sub pull_updates($;$) {
     my $self = shift;
+    my $full = shift // 0;
     my $mailbox = $self->{_SELECTED} // $self->panic();
     my $pcache = $self->{_PCACHE}->{$mailbox};
 
@@ -848,6 +860,9 @@ sub pull_updates($) {
             $self->{_VANISHED} = [];
     }
     else {
+        $self->_send("UID FETCH 1:".($pcache->{UIDNEXT}-1)." (MODSEQ FLAGS)")
+            if $full and $pcache->{UIDNEXT} > 1;
+
         my @missing;
         while (%{$self->{_MODIFIED}}) {
             while (my ($uid,$v) = each %{$self->{_MODIFIED}}) {
@@ -855,9 +870,9 @@ sub pull_updates($) {
                 # FLAG updates can arrive while processing pull_new_messages
                 # for instance
                 if (defined $v->[1] and $v->[0] > 0) { # setting the MODSEQ to 0 forces a FETCH
-                    next unless $uid    < $pcache->{UIDNEXT}        # out of bounds
-                            and $v->[0] > $pcache->{HIGHESTMODSEQ}; # already seen
-                    $modified{$uid} = $v->[1];
+                    next unless $uid              < $pcache->{UIDNEXT}         # out of bounds
+                            and ($full or $v->[0] > $pcache->{HIGHESTMODSEQ}); # already seen
+                    $modified{$uid} = $full ? $v : $v->[1];
                 } else {
                     push @missing, $uid;
                 }
@@ -996,7 +1011,7 @@ sub push_flag_updates($$@) {
     }
 
     unless ($self->{quiet}) {
-        $self->log("Updated flags ($flags) for UID ".compact_set(@ok));
+        $self->log("Updated flags ($flags) for UID ".compact_set(@ok)) if @ok;
         $self->log("Couldn't update flags ($flags) for UID ".compact_set(keys %failed).', '.
                    "trying again later") if %failed;
     }
-- 
cgit v1.2.3