bin/sup-add (3493B) - raw
1 #!/usr/bin/env ruby
2
3 $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
5 require 'uri'
6 require 'optimist'
7 require "sup"
8 require 'sup/util/axe'
9
10 $opts = Optimist::options do
11 version "sup-add (sup #{Redwood::VERSION})"
12 banner <<EOS
13 Adds a source to the Sup source list.
14
15 Usage:
16 sup-add [options] <source uri>+
17
18 where <source uri>+ is one or more source URIs.
19
20 For mbox files on local disk, use the form:
21 mbox:<path to mbox file>, or
22 mbox://<path to mbox file>
23
24 For Maildir folders, use the form:
25 maildir:<path to Maildir directory>; or
26 maildir://<path to Maildir directory>
27
28 Options are:
29 EOS
30 opt :archive, "Automatically archive all new messages from these sources."
31 opt :unusual, "Do not automatically poll these sources for new messages."
32 opt :sync_back, "Synchronize status flags back into messages, defaults to true (Maildir sources only).", :default => true
33 opt :labels, "A comma-separated set of labels to apply to all messages from this source", :type => String
34 opt :force_new, "Create a new account for this source, even if one already exists."
35 opt :force_account, "Reuse previously defined account user@hostname.", :type => String
36 end
37
38 Optimist::die "require one or more sources" if ARGV.empty?
39
40 ## for sources that require login information, prompt the user for
41 ## that. also provide a list of previously-defined login info to
42 ## choose from, if any.
43 def get_login_info uri, sources
44 uri = URI(uri)
45 accounts = sources.map do |s|
46 next unless s.respond_to?(:username)
47 suri = URI(s.uri)
48 [suri.host, s.username, s.password]
49 end.compact.uniq.sort_by { |h, u, p| h == uri.host ? 0 : 1 }
50
51 username, password = nil, nil
52 unless accounts.empty? || $opts[:force_new]
53 if $opts[:force_account]
54 host, username, password = accounts.find { |h, u, p| $opts[:force_account] == "#{u}@#{h}" }
55 unless username && password
56 @cli.say "No previous account #{$opts[:force_account].inspect} found."
57 end
58 else
59 @cli.say "Would you like to use the same account as for a previous source for #{uri}?"
60 @cli.choose do |menu|
61 accounts.each do |host, olduser, oldpw|
62 menu.choice("Use the account info for #{olduser}@#{host}") { username, password = olduser, oldpw }
63 end
64 menu.choice("Use a new account") { }
65 menu.prompt = "Account selection? "
66 end
67 end
68 end
69
70 unless username && password
71 username = @cli.ask("Username for #{uri.host}: ");
72 password = @cli.ask("Password for #{uri.host}: ") { |q| q.echo = false }
73 puts # why?
74 end
75
76 [username, password]
77 end
78
79 @cli.wrap_at = :auto
80 Redwood::start
81 index = Redwood::Index.init
82 index.load
83
84 index.lock_interactively or exit
85
86 begin
87 Redwood::SourceManager.load_sources
88
89 ARGV.each do |uri|
90 labels = $opts[:labels] ? $opts[:labels].split(/\s*,\s*/).uniq : []
91
92 if !$opts[:force_new] && Redwood::SourceManager.source_for(uri)
93 @cli.say "Already know about #{uri}; skipping."
94 next
95 end
96
97 source =
98 case uri
99 when /^maildir:/
100 Redwood::Maildir.new uri, !$opts[:unusual], $opts[:archive], $opts[:sync_back], nil, labels
101 when /^mbox:/
102 Redwood::MBox.new uri, !$opts[:unusual], $opts[:archive], nil, labels
103 when nil
104 Optimist::die "Sources must be specified with a maildir:// or mbox:// URI"
105 end
106 @cli.say "Adding #{source}..."
107 Redwood::SourceManager.add_source source
108 end
109 ensure
110 index.save
111 index.unlock
112 Redwood::finish
113 end