This leads to an extra index lookup in the sup-sync update path, but I think
it's worth it for the sake of API simplicity.
---
bin/sup-sync | 8 ++++----
bin/sup-sync-back | 6 +++---
lib/sup/index.rb | 18 ++++--------------
lib/sup/message.rb | 6 ++++++
lib/sup/poll.rb | 33 ++++++++++++++-------------------
lib/sup/sent.rb | 2 +-
6 files changed, 32 insertions(+), 41 deletions(-)
diff --git a/bin/sup-sync b/bin/sup-sync
index a759cbe..18a3cab 100755
--- a/bin/sup-sync
+++ b/bin/sup-sync
@@ -137,7 +137,7 @@ begin
num_added = num_updated = num_scanned = num_restored = 0
last_info_time = start_time = Time.now
- Redwood::PollManager.add_messages_from source, :force_overwrite => true do
|m, offset, entry|
+ Redwood::PollManager.add_messages_from source, :force_overwrite => true do
|m_old, m, offset|
num_scanned += 1
seen[m.id] = true
@@ -153,10 +153,10 @@ begin
## skip if we're operating only on changed messages, the message
## is in the index, and it's unchanged from what the source is
## reporting.
- next if target == :changed && entry && entry[:source_id].to_i ==
source.id && entry[:source_info].to_i == offset
+ next if target == :changed && m_old && m_old.source.id == source.id &&
m_old.source_info == offset
## get the state currently in the index
- index_state = entry[:label].symbolistize if entry
+ index_state = m_old.labels.dup if m_old
## skip if we're operating on restored messages, and this one
## ain't.
@@ -196,7 +196,7 @@ begin
puts "Adding message #{source}##{offset} from #{m.from} with state
{#{m.labels * ', '}}" if opts[:verbose]
num_added += 1
else
- puts "Updating message #{source}##{offset}, source
#{entry[:source_id]} => #{source.id}, offset #{entry[:source_info]} =>
#{offset}, state {#{index_state * ', '}} => {#{m.labels * ', '}}" if
opts[:verbose]
+ puts "Updating message #{source}##{offset}, source #{m_old.source.id}
=> #{source.id}, offset #{m_old.source_info} => #{offset}, state {#{index_state
* ', '}} => {#{m.labels * ', '}}" if opts[:verbose]
num_updated += 1
end
diff --git a/bin/sup-sync-back b/bin/sup-sync-back
index 4f1387e..1c746d2 100755
--- a/bin/sup-sync-back
+++ b/bin/sup-sync-back
@@ -105,11 +105,11 @@ EOS
num_dropped = num_moved = num_scanned = 0
out_fp = Tempfile.new "sup-sync-back-#{source.id}"
- Redwood::PollManager.add_messages_from source do |m, offset, entry|
+ Redwood::PollManager.add_messages_from source do |m_old, m, offset|
num_scanned += 1
- if entry
- labels = entry[:label].symbolistize.to_boolean_h
+ if m_old
+ labels = m_old.labels
if labels.member? :deleted
if opts[:drop_deleted]
diff --git a/lib/sup/index.rb b/lib/sup/index.rb
index b5d0e5d..89795da 100644
--- a/lib/sup/index.rb
+++ b/lib/sup/index.rb
@@ -174,16 +174,10 @@ EOS
## Syncs the message to the index, replacing any previous version. adding
## either way. Index state will be determined by the message's #labels
## accessor.
- ##
- ## if need_load is false, docid and entry are assumed to be set to the
- ## result of load_entry_for_id (which can be nil).
- def sync_message m, need_load=true, docid=nil, entry=nil, opts={}
- docid, entry = load_entry_for_id m.id if need_load
+ def sync_message m, opts={}
+ entry = @index[m.id]
raise "no source info for message #{m.id}" unless m.source && m.source_info
- @index_mutex.synchronize do
- raise "trying to delete non-corresponding entry #{docid} with index
message-id #...@index[docid][:message_id].inspect} and parameter message id
#{m.id.inspect}" if docid && @index[docid][:message_id] != m.id
- end
source_id = if m.source.is_a? Integer
m.source
@@ -256,13 +250,9 @@ EOS
}
@index_mutex.synchronize do
- @index.delete docid if docid
+ @index.delete m.id
@index.add_document d
end
-
- ## this hasn't been triggered in a long time.
- ## docid, entry = load_entry_for_id m.id
- ## raise "just added message #{m.id.inspect} but couldn't find it in a
search" unless docid
end
def save_index fn=File.join(@dir, "ferret")
@@ -391,7 +381,7 @@ EOS
## builds a message object from a ferret result
def build_message docid
@index_mutex.synchronize do
- doc = @index[docid]
+ doc = @index[docid] or return
source = @source_mutex.synchronize { @sources[doc[:source_id].to_i] }
raise "invalid source #{doc[:source_id]}" unless source
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
index 8525fdf..b667cb3 100644
--- a/lib/sup/message.rb
+++ b/lib/sup/message.rb
@@ -288,6 +288,12 @@ EOS
"Subject: #...@subj}"]
end
+ def self.build_from_source source, source_info
+ m = Message.new :source => source, :source_info => source_info
+ m.load_from_source!
+ m
+ end
+
private
## here's where we handle decoding mime attachments. unfortunately
diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb
index 74f7d1c..bbad5f2 100644
--- a/lib/sup/poll.rb
+++ b/lib/sup/poll.rb
@@ -95,11 +95,11 @@ EOS
num = 0
numi = 0
- add_messages_from source do |m, offset, entry|
+ add_messages_from source do |m_old, m, offset|
## always preserve the labels on disk.
- m.labels = ((m.labels - [:unread, :inbox]) +
entry[:label].symbolistize).uniq if entry
+ m.labels = ((m.labels - [:unread, :inbox]) + m_old.labels).uniq if
m_old
yield "Found message at #{offset} with labels {#{m.labels * ', '}}"
- unless entry
+ unless m_old
num += 1
from_and_subj << [m.from && m.from.longname, m.subj]
if m.has_label?(:inbox) && ([:spam, :deleted, :killed] &
m.labels).empty?
@@ -138,29 +138,24 @@ EOS
begin
return if source.done? || source.has_errors?
- source.each do |offset, labels|
+ source.each do |offset, default_labels|
if source.has_errors?
Redwood::log "error loading messages from #{source}:
#{source.error.message}"
return
end
- labels << :sent if source.uri.eql?(SentManager.source_uri)
- labels.each { |l| LabelManager << l }
- labels = labels + (source.archived? ? [] : [:inbox])
+ m_new = Message.build_from_source source, offset
+ m_old = Index.build_message m_new.id
- m = Message.new :source => source, :source_info => offset, :labels =>
labels
- m.load_from_source!
+ m_new.labels = default_labels + (source.archived? ? [] : [:inbox])
+ m_new.labels << :sent if source.uri.eql?(SentManager.source_uri)
+ m_new.labels.delete :unread if m_new.source_marked_read?
+ m_new.labels.each { |l| LabelManager << l }
- if m.source_marked_read?
- m.remove_label :unread
- labels.delete :unread
- end
-
- docid, entry = Index.load_entry_for_id m.id
- HookManager.run "before-add-message", :message => m
- m = yield(m, offset, entry) or next if block_given?
- times = Index.sync_message m, false, docid, entry, opts
- UpdateManager.relay self, :added, m unless entry
+ HookManager.run "before-add-message", :message => m_new
+ m_ret = yield(m_old, m_new, offset) or next if block_given?
+ Index.sync_message m_ret, opts
+ UpdateManager.relay self, :added, m_ret unless m_old
end
rescue SourceError => e
Redwood::log "problem getting messages from #{source}: #{e.message}"
diff --git a/lib/sup/sent.rb b/lib/sup/sent.rb
index e6ae856..b750d71 100644
--- a/lib/sup/sent.rb
+++ b/lib/sup/sent.rb
@@ -30,7 +30,7 @@ class SentManager
def write_sent_message date, from_email, &block
@source.store_message date, from_email, &block
- PollManager.add_messages_from(@source) do |m, o, e|
+ PollManager.add_messages_from(@source) do |m_old, m, offset|
m.remove_label :unread
m
end
--
1.6.0.4
_______________________________________________
sup-talk mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/sup-talk