bin/sup-sync-back in sup-0.8.1 vs bin/sup-sync-back in sup-0.9
- old
+ new
@@ -2,20 +2,25 @@
require 'rubygems'
require 'uri'
require 'tempfile'
require 'trollop'
+require 'enumerator'
require "sup"
## save a message 'm' to an open file pointer 'fp'
def save m, fp
m.source.each_raw_message_line(m.source_info) { |l| fp.print l }
end
def die msg
$stderr.puts "Error: #{msg}"
exit(-1)
end
+def has_any_from_source_with_label? index, source, label
+ query = { :source_id => source.id, :label => label, :limit => 1, :load_spam => true, :load_deleted => true, :load_killed => true }
+ not Enumerable::Enumerator.new(index, :each_id, query).map.empty?
+end
opts = Trollop::options do
version "sup-sync-back (sup #{Redwood::VERSION})"
banner <<EOS
Drop or move messages from Sup sources that are marked as deleted or
@@ -58,12 +63,12 @@
exit
end
Redwood::start
-index = Redwood::Index.new
-index.lock_or_die
+index = Redwood::Index.init
+index.lock_interactively or exit
deleted_fp, spam_fp = nil
unless opts[:dry_run]
deleted_fp = File.open(opts[:move_deleted], "a") if opts[:move_deleted]
spam_fp = File.open(opts[:move_spam], "a") if opts[:move_spam]
@@ -73,17 +78,17 @@
begin
index.load
sources = ARGV.map do |uri|
- s = index.source_for(uri) or die "unknown source: #{uri}. Did you add it with sup-add first?"
+ s = Redwood::SourceManager.source_for(uri) or die "unknown source: #{uri}. Did you add it with sup-add first?"
s.is_a?(Redwood::MBox::Loader) or die "#{uri} is not an mbox source."
s
end
if sources.empty?
- sources = index.usual_sources.select { |s| s.is_a? Redwood::MBox::Loader }
+ sources = Redwood::SourceManager.usual_sources.select { |s| s.is_a? Redwood::MBox::Loader }
end
unless sources.all? { |s| s.file_path.nil? } || File.executable?(dotlockfile) || opts[:dont_use_dotlockfile]
die <<EOS
can't execute dotlockfile binary: #{dotlockfile}. Specify --with-dotlockfile
@@ -94,51 +99,49 @@
modified_sources = []
sources.each do |source|
$stderr.puts "Scanning #{source}..."
- unless ((opts[:drop_deleted] || opts[:move_deleted]) && index.has_any_from_source_with_label?(source, :deleted)) || ((opts[:drop_spam] || opts[:move_spam]) && index.has_any_from_source_with_label?(source, :spam))
+ unless ((opts[:drop_deleted] || opts[:move_deleted]) && has_any_from_source_with_label?(index, source, :deleted)) || ((opts[:drop_spam] || opts[:move_spam]) && has_any_from_source_with_label?(index, source, :spam))
$stderr.puts "Nothing to do from this source; skipping"
next
end
source.reset!
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.each_message_from source do |m|
num_scanned += 1
- if entry
- labels = entry[:label].symbolistize.to_boolean_h
+ if(m_old = index.build_message(m.id))
+ labels = m_old.labels
if labels.member? :deleted
if opts[:drop_deleted]
- puts "Dropping deleted message #{source}##{offset}" if opts[:verbose]
+ puts "Dropping deleted message #{source}##{m.source_info}" if opts[:verbose]
num_dropped += 1
elsif opts[:move_deleted] && labels.member?(:deleted)
- puts "Moving deleted message #{source}##{offset}" if opts[:verbose]
+ puts "Moving deleted message #{source}##{m.source_info}" if opts[:verbose]
save m, deleted_fp unless opts[:dry_run]
num_moved += 1
end
elsif labels.member? :spam
if opts[:drop_spam]
- puts "Dropping spam message #{source}##{offset}" if opts[:verbose]
+ puts "Dropping spam message #{source}##{m.source_info}" if opts[:verbose]
num_dropped += 1
elsif opts[:move_spam] && labels.member?(:spam)
- puts "Moving spam message #{source}##{offset}" if opts[:verbose]
+ puts "Moving spam message #{source}##{m.source_info}" if opts[:verbose]
save m, spam_fp unless opts[:dry_run]
num_moved += 1
end
else
save m, out_fp unless opts[:dry_run]
end
else
save m, out_fp unless opts[:dry_run]
end
-
- nil # don't actually add anything!
end
$stderr.puts "Scanned #{num_scanned}, dropped #{num_dropped}, moved #{num_moved} messages from #{source}."
modified_sources << source if num_dropped > 0 || num_moved > 0
out_fp.close unless opts[:dry_run]