]> git.cworth.org Git - sup/commitdiff
fixed imap error handling
authorwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Thu, 4 Jan 2007 01:19:54 +0000 (01:19 +0000)
committerwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Thu, 4 Jan 2007 01:19:54 +0000 (01:19 +0000)
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@162 5c8cc53c-5e98-4d25-b20a-d8db53a31250

lib/sup/imap.rb
lib/sup/poll.rb

index e250b2ef961a8a3c482fec0797ba0662c2e05c9e..97c4a86699ba4ee5cfea35ee12b85cca2eb05990 100644 (file)
@@ -50,6 +50,8 @@ class IMAP < Source
     @labels << :inbox unless archived?
     @labels << mailbox.intern unless mailbox =~ /inbox/i
     @mutex = Mutex.new
+
+    @recover_msg = "It is likely that messages have been deleted from this IMAP mailbox. Please run sup-import --rebuild #{to_s} to correct this problem."
   end
 
   def say s
@@ -93,8 +95,7 @@ class IMAP < Source
         
         say "Reading headers (because IMAP sucks)..."
         values = @imap.fetch(1 .. last_id, ['RFC822.SIZE', 'INTERNALDATE'])
-        
-        say "Successfully connected to #{@parsed_uri}"
+        say "Successfully connected to #{@parsed_uri}."
         
         values.each do |v|
           id = make_id v
@@ -104,7 +105,9 @@ class IMAP < Source
       rescue SocketError, Net::IMAP::Error, SourceError => e
         self.broken_msg = e.message.chomp # fucking chomp! fuck!!!
         @imap = nil
-        Redwood::log "error connecting to IMAP server: #{self.broken_msg}"
+        msg = "error connecting to IMAP server: #{self.broken_msg}"
+        Redwood::log msg
+        BufferManager.flash msg
       ensure
         shutup
       end
@@ -154,11 +157,11 @@ class IMAP < Source
   def get_imap_field id, field
     retries = 0
     f = nil
-    imap_id = @imap_ids[id] or raise SourceError, "Unknown message id #{id}. It is likely that messages have been deleted from this IMAP mailbox."
+    imap_id = @imap_ids[id] or raise SourceError, "Unknown message id #{id}. #@recover_msg"
     begin
       f = @imap.fetch imap_id, [field, 'RFC822.SIZE', 'INTERNALDATE']
       got_id = make_id f[0]
-      raise SourceError, "IMAP message mismatch: requested #{id}, got #{got_id}. It is likely the IMAP mailbox has been modified." unless got_id == id
+      raise SourceError, "IMAP message mismatch: requested #{id}, got #{got_id}. #@recover_msg" unless got_id == id
     rescue Net::IMAP::Error => e
       raise SourceError, e.message
     rescue Errno::EPIPE
@@ -178,7 +181,11 @@ class IMAP < Source
     @mutex.synchronize { connect or raise SourceError, broken_msg }
 
     start = @ids.index(cur_offset || start_offset)
-    start.upto(@ids.length - 1) do |i|
+    if start.nil? # couldn't find the most recent email
+      self.broken_msg = "Unknown message id #{cur_offset || start_offset}. #@recover_msg" 
+      raise SourceError, broken_msg
+    end
+    start.upto(@ids.length - 1) do |i|         
       id = @ids[i]
       self.cur_offset = id
       yield id, labels
index 19e8d9ff40e33a10714ea6fa070dfb9e87533a41..b1dc6a7d9c5ae27eda6c03e314cc7d489eeda198 100644 (file)
@@ -54,10 +54,10 @@ class PollManager
       start_offset = nil
       num = 0
       num_inbox = 0
-      source.each do |offset, labels|
-        start_offset ||= offset
-        yield "Found message at #{offset} with labels #{labels * ', '}"
-        begin
+      begin
+        source.each do |offset, labels|
+          start_offset ||= offset
+          yield "Found message at #{offset} with labels #{labels * ', '}"
           m = Redwood::Message.new :source => source, :source_info => offset,
                                    :labels => labels
           if found[m.id]
@@ -73,17 +73,20 @@ class PollManager
             total_num += 1
             total_numi += 1 if m.labels.include? :inbox
           end
-        rescue SourceError, MessageFormatError => e
-          yield "Ignoring erroneous message at #{source}##{offset}: #{e.message}"
         end
-
+        
         if num % 1000 == 0 && num > 0
           elapsed = Time.now - start
           pctdone = (offset.to_f - start_offset) / (source.total.to_f - start_offset)
           remaining = (source.end_offset.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset))
           yield "## #{num} (#{(pctdone * 100.0)}% done) read; #{elapsed.to_time_s} elapsed; est. #{remaining.to_time_s} remaining"
         end
+      rescue SourceError, MessageFormatError => e
+        msg = "#{source.broken? ? 'Fatal' : 'Non-fatal'} error loading from #{source}: #{e.message}"
+        Redwood::log msg
+        yield msg
       end
+
       yield "Found #{num} messages" unless num == 0
     end
     yield "Done polling; loaded #{total_num} new messages total"