From b170c27dec95e7d03857c338e85b862dfc91ce95 Mon Sep 17 00:00:00 2001 From: wmorgan Date: Sun, 1 Apr 2007 21:36:44 +0000 Subject: [PATCH] misc. source-related bugfixes git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@359 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- doc/TODO | 2 +- lib/sup/draft.rb | 2 +- lib/sup/maildir.rb | 10 +++++++++- lib/sup/mbox/loader.rb | 10 +++++----- lib/sup/poll.rb | 13 ++++++++++--- lib/sup/sent.rb | 2 +- lib/sup/source.rb | 4 ++-- 7 files changed, 29 insertions(+), 14 deletions(-) diff --git a/doc/TODO b/doc/TODO index 87ccb52..42c97e0 100644 --- 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 index 4beaf3e..59eef8c 100644 --- 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 index 5bc884b..58be596 100644 --- 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 index dfca5b2..6c9c701 100644 --- 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 index cae97ae..adf1d06 100644 --- 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 index 37b9524..8a546b6 100644 --- 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 index dce2f63..55e1bac 100644 --- 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 -- 2.45.2