commit b170c27dec95e7d03857c338e85b862dfc91ce95
parent 19d89a244a6a4357077517df02defdb7764e07fe
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date: Sun, 1 Apr 2007 21:36:44 +0000
misc. source-related bugfixes
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@359 5c8cc53c-5e98-4d25-b20a-d8db53a31250
Diffstat:
7 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/doc/TODO b/doc/TODO
@@ -9,7 +9,7 @@ _ bugfix: triggering a pageup when cursor scrolling up jumps to the
_ bugfix: add new message counts until keypress
_ bugfix: attachment filenames sometimes not detected (filename=)
_ bugfix: final logging messages to stdout?
-_ bugfix: mbox directory shouldn't generate an exception, just an error
+x bugfix: mbox directory shouldn't generate an exception, just an error
x bugfix: m in thread-view-mode when a person is not selected should open up a
x bugfix: stars on messages with blue backgrounds still have green bgs
x ferret upgrade script (dump & restore)
diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb
@@ -12,7 +12,7 @@ class DraftManager
def self.source_name; "sup://drafts"; end
def self.source_id; 9999; end
- def new_source; @source = DraftLoader.new; end
+ def new_source; @source = Recoverable.new DraftLoader.new; end
def write_draft
offset = @source.gen_offset
diff --git a/lib/sup/maildir.rb b/lib/sup/maildir.rb
@@ -13,8 +13,12 @@ class Maildir < Source
def initialize uri, last_date=nil, usual=true, archived=false, id=nil
super
+ uri = URI(uri)
- @dir = URI(uri).path
+ raise ArgumentError, "not a maildir URI" unless uri.scheme == "maildir"
+ raise ArgumentError, "maildir URI cannot have a host: #{uri.host}" if uri.host
+
+ @dir = uri.path
@ids = []
@ids_to_fns = {}
@last_scan = nil
@@ -52,6 +56,9 @@ class Maildir < Source
cdir = File.join(@dir, 'cur')
ndir = File.join(@dir, 'new')
+
+ raise FatalSourceError, "#{cdir} not a directory" unless File.directory? cdir
+ raise FatalSourceError, "#{ndir} not a directory" unless File.directory? ndir
begin
@ids, @ids_to_fns = @mutex.synchronize do
@@ -61,6 +68,7 @@ class Maildir < Source
ids << id
ids_to_fns[id] = fn
end
+ p [ids.sort, ids_to_fns]
[ids.sort, ids_to_fns]
end
rescue SystemCallError => e
diff --git a/lib/sup/mbox/loader.rb b/lib/sup/mbox/loader.rb
@@ -13,13 +13,13 @@ class Loader < Source
case uri_or_fp
when String
- raise ArgumentError, "not an mbox uri" unless uri_or_fp =~ %r!mbox://!
-
- fn = URI(uri_or_fp).path
+ uri = URI(uri_or_fp)
+ raise ArgumentError, "not an mbox uri" unless uri.scheme == "mbox"
+ raise ArgumentError, "mbox uri cannot have a host: #{uri.host}" if uri.host
## heuristic: use the filename as a label, unless the file
## has a path that probably represents an inbox.
- @labels << File.basename(fn).intern unless File.dirname(fn) =~ /\b(var|usr|spool)\b/
- @f = File.open fn
+ @labels << File.basename(uri.path).intern unless File.dirname(uri.path) =~ /\b(var|usr|spool)\b/
+ @f = File.open uri.path
else
@f = uri_or_fp
end
diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb
@@ -43,7 +43,14 @@ class PollManager
@mutex.synchronize do
Index.usual_sources.each do |source|
# yield "source #{source} is done? #{source.done?} (cur_offset #{source.cur_offset} >= #{source.end_offset})"
- yield "Loading from #{source}... " unless source.done? || source.has_errors?
+ begin
+ yield "Loading from #{source}... " unless source.done? || source.has_errors?
+ rescue SourceError => e
+ Redwood::log "problem getting messages from #{source}: #{e.message}"
+ Redwood::report_broken_sources
+ next
+ end
+
num = 0
numi = 0
add_messages_from source do |m, offset, entry|
@@ -82,9 +89,9 @@ class PollManager
## the index labels, if they exist, so that state is not lost when
## e.g. a new version of a message from a mailing list comes in.
def add_messages_from source
- return if source.done? || source.has_errors?
-
begin
+ return if source.done? || source.has_errors?
+
source.each do |offset, labels|
if source.has_errors?
Redwood::log "error loading messages from #{source}: #{source.broken_msg}"
diff --git a/lib/sup/sent.rb b/lib/sup/sent.rb
@@ -12,7 +12,7 @@ class SentManager
def self.source_name; "sup://sent"; end
def self.source_id; 9998; end
- def new_source; @source = SentLoader.new; end
+ def new_source; @source = Recoverable.new SentLoader.new; end
def write_sent_message date, from_email
need_blank = File.exists?(@fn) && !File.zero?(@fn)
diff --git a/lib/sup/source.rb b/lib/sup/source.rb
@@ -61,7 +61,7 @@ class Source
def initialize uri, initial_offset=nil, usual=true, archived=false, id=nil
@uri = uri
- @cur_offset = initial_offset || start_offset
+ @cur_offset = initial_offset
@usual = usual
@archived = archived
@id = id
@@ -71,7 +71,7 @@ class Source
def to_s; @uri.to_s; end
def seek_to! o; self.cur_offset = o; end
def reset!; seek_to! start_offset; end
- def == o; o.to_s == to_s; end
+ def == o; o.uri == uri; end
def done?; (self.cur_offset ||= start_offset) >= end_offset; end
def is_source_for? uri; URI(self.uri) == URI(uri); end