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]