]> git.cworth.org Git - sup/commitdiff
bug fixes with new strict mbox checking
authorwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Mon, 4 Dec 2006 06:42:12 +0000 (06:42 +0000)
committerwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Mon, 4 Dec 2006 06:42:12 +0000 (06:42 +0000)
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@64 5c8cc53c-5e98-4d25-b20a-d8db53a31250

lib/sup/mbox/loader.rb

index f4cbe802f080ff9841c3f2e022075fc3fd146cd0..dfc0dd2519c03613fe85058bf30e54e36f533f5e 100644 (file)
@@ -14,9 +14,9 @@ class Loader
   ## end_offset is the last offsets within the file which we've read.
   ## everything after that is considered new messages that haven't
   ## been indexed.
-  def initialize filename, end_offset=0, usual=true, archived=false, id=nil
+  def initialize filename, end_offset=nil, usual=true, archived=false, id=nil
     @filename = filename.gsub(%r(^mbox://), "")
-    @end_offset = end_offset
+    @end_offset = end_offset || 0
     @dirty = false
     @usual = usual
     @archived = archived
@@ -50,6 +50,8 @@ class Loader
     header = nil
     @mutex.synchronize do
       @f.seek offset if offset
+      l = @f.gets
+      raise Error, "offset mismatch in mbox file: #{l.inspect}. Run 'sup-import --rebuild #{to_s}' to correct this." unless l =~ BREAK_RE
       header = MBox::read_header @f
     end
     header
@@ -91,22 +93,30 @@ class Loader
   def next
     return nil if done?
     @dirty = true
+    start_offset = nil
     next_end_offset = @end_offset
 
+    ## @end_offset could be at one of two places here: before a \n and
+    ## a mbox separator, if it was previously at EOF and a new message
+    ## was added; or, at the beginning of an mbox separator (in all
+    ## other cases).
     @mutex.synchronize do
       @f.seek @end_offset
+      l = @f.gets or return nil
+      if l =~ /^\s*$/
+        start_offset = @f.tell
+        @f.gets
+      else
+        start_offset = @end_offset
+      end
 
-      @f.gets # skip the From separator
-      next_end_offset = @f.tell
       while(line = @f.gets)
         break if line =~ BREAK_RE
         next_end_offset = @f.tell
       end
     end
 
-    start_offset = @end_offset
     @end_offset = next_end_offset
-
     start_offset
   end
 
@@ -117,10 +127,6 @@ class Loader
     end
   end
 
-  def each_header
-    each { |offset, labels| yield offset, labels, load_header(offset) }
-  end
-
   def done?; @end_offset >= File.size(@f); end 
   def total; File.size @f; end
 end