## this is for debugging purposes because i keep calling #id on the
   ## wrong object and i want it to throw an exception
   def id
-    raise "wrong id called"
+    raise "wrong id called on #{self.inspect}"
   end
 end
 
 
 
 require 'thread'
 require 'fileutils'
-require_gem 'ferret', ">= 0.10.13"
+require 'ferret'
+#require_gem 'ferret', ">= 0.10.13"
 
 module Redwood
 
       source ||= entry[:source_id].to_i
       source_info ||= entry[:source_info].to_i
     end
+
+    ## this happens sometimes. i'm not sure why. ferret bug?
     raise "no entry and no source info for message #{m.id}" unless source && source_info
 
     raise "deleting non-corresponding entry #{docid}" unless @index[docid][:message_id] == m.id
 
     @status = header["status"]
   end
 
+  def broken?; @source.nil?; end
   def snippet; @snippet || to_chunks && @snippet; end
   def is_list_message?; !@list_address.nil?; end
   def is_draft?; DraftLoader === @source; end
   end
 
   def save index
+    return if broken?
     index.update_message self if @dirty
     @dirty = false
   end
 
   end
 
   def update_text_for_line l
+    return unless l # not sure why this happens, but it does, occasionally
     @text[l] = text_for_thread @threads[l]
     buffer.mark_dirty if buffer
   end
 
       num_inbox = 0
       source.each do |offset, labels|
         start_offset ||= offset
-        yield " Found message at #{offset} with labels #{labels * ', '}"
+        yield "Found message at #{offset} with labels #{labels * ', '}"
         begin
           m = Redwood::Message.new :source => source, :source_info => offset,
                                    :labels => labels