bin/sup-dump (1089B) - raw
1 #!/usr/bin/env ruby
2
3 $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
5 require 'xapian'
6 require 'optimist'
7 require 'set'
8
9 BASE_DIR = ENV["SUP_BASE"] || File.join(ENV["HOME"], ".sup")
10
11 $opts = Optimist::options do
12 version "sup-dump"
13 banner <<EOS
14 Dumps all message state from the sup index to standard out. You can
15 later use sup-sync --restored --restore <filename> to recover the index.
16
17 This tool is primarily useful in the event that a Sup upgrade breaks index
18 format compatibility.
19
20 Usage:
21 sup-dump > <filename>
22 sup-dump | bzip2 > <filename> # even better
23 EOS
24 end
25
26 xapian = Xapian::Database.new File.join(BASE_DIR, 'xapian')
27 version = xapian.get_metadata 'rescue-version'
28 version = '0' if version.empty?
29
30 case version
31 when '0'
32 xapian.postlist('Kmail').each do |x|
33 begin
34 entry = Marshal.load(xapian.document(x.docid).data)
35 puts "#{entry[:message_id]} (#{entry[:labels].sort_by { |l| l.to_s } * ' '})"
36 rescue
37 $stderr.puts "failed to dump document #{x.docid}"
38 end
39 end
40 else
41 abort "this sup-dump version doesn't understand your index"
42 end