X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=bin%2Fsup-sync-back;h=6298c97c3e6190e8704ff2cd1333843f09511fea;hb=e127eef693956080b06bc8c0157071aa0c8549cb;hp=871af880216fcb55802aceb80bda7e616913fc07;hpb=3ba2d5d731d76f16dc5f3003b6e061cf1d60f4a6;p=sup diff --git a/bin/sup-sync-back b/bin/sup-sync-back old mode 100644 new mode 100755 index 871af88..6298c97 --- a/bin/sup-sync-back +++ b/bin/sup-sync-back @@ -4,18 +4,26 @@ 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_full_message_line(m.source_info) { |l| fp.print l } + 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 <* is zero or more source URIs. If no sources are given, sync back all usual sources. -You probably want to run sup-sync --changed after this command. +You almost certainly want to run sup-sync --changed after this command. +Running this does not change the index. Options include: EOS - opt :delete_deleted, "Delete deleted messages.", :default => false, :short => "d" + opt :drop_deleted, "Drop deleted messages.", :default => false, :short => "d" opt :move_deleted, "Move deleted messages to a local mbox file.", :type => String, :short => :none - opt :delete_spam, "Delete spam messages.", :default => false, :short => "s" + opt :drop_spam, "Drop spam messages.", :default => false, :short => "s" opt :move_spam, "Move spam messages to a local mbox file.", :type => String, :short => :none + + opt :with_dotlockfile, "Specific dotlockfile location (mbox files only).", :default => "/usr/bin/dotlockfile", :short => :none + opt :dont_use_dotlockfile, "Don't use dotlockfile to lock mbox files. Dangerous if other processes modify them concurrently.", :default => false, :short => :none + opt :verbose, "Print message ids as they're processed." opt :dry_run, "Don't actually modify the index. Probably only useful with --verbose.", :short => "-n" opt :version, "Show version information", :short => :none - conflicts :delete_deleted, :move_deleted - conflicts :delete_spam, :move_spam + conflicts :drop_deleted, :move_deleted + conflicts :drop_spam, :move_spam +end + +unless opts[:drop_deleted] || opts[:move_deleted] || opts[:drop_spam] || opts[:move_spam] + puts < 0 || num_moved > 0 + $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] - unless opts[:dry_run] + unless opts[:dry_run] || (num_dropped == 0 && num_moved == 0) deleted_fp.flush if deleted_fp spam_fp.flush if spam_fp - out_fp.close - FileUtils.mv out_fp.path, URI(source.uri).path + unless opts[:dont_use_dotlockfile] + puts "Locking #{source.file_path}..." + system "#{opts[:dotlockfile]} -l #{source.file_path}" + puts "Writing #{source.file_path}..." + FileUtils.cp out_fp.path, source.file_path + puts "Unlocking #{source.file_path}..." + system "#{opts[:dotlockfile]} -u #{source.file_path}" + end end end @@ -121,12 +166,13 @@ begin end $stderr.puts "Done." - $stderr.puts "You should run sup-sync --changed #{sources.join(' ')}." if any_modified + unless modified_sources.empty? + $stderr.puts "You should now run: sup-sync --changed #{modified_sources.join(' ')}" + end rescue Exception => e File.open("sup-exception-log.txt", "w") { |f| f.puts e.backtrace } raise ensure - index.save Redwood::finish index.unlock end