5 require 'highline/import'
9 $opts = Trollop::options do
10 version "sup-add (sup #{Redwood::VERSION})"
12 Adds a source to the Sup source list.
15 sup-add [options] <source uri>+
17 where <source uri>+ is one or more source URIs.
19 For mbox files on local disk, use the form:
20 mbox:<path to mbox file>, or
21 mbox://<path to mbox file>
23 For mbox files on remote machines, use the form:
24 mbox+ssh://<machine name>/<path to mbox file>
26 For IMAP folders, use the form (note no username or password!):
27 imap://<machine name>/ # unsecure, "INBOX" folder
28 imap://<machine name>/<folder> # unsecure, arbitrary
29 imaps://<machine name>/ # secure, "INBOX" folder
30 imaps://<machine name>/<folder> # secure, arbitrary folder
32 For Maildir folders, use the form:
33 maildir:<path to Maildir directory>; or
34 maildir://<path to Maildir directory>
38 opt :archive, "Automatically archive all new messages from these sources."
39 opt :unusual, "Do not automatically poll these sources for new messages."
40 opt :labels, "A comma-separated set of labels to apply to all messages from this source", :type => String
41 opt :force_new, "Create a new account for this source, even if one already exists."
44 Trollop::die "require one or more sources" if ARGV.empty?
46 ## for sources that require login information, prompt the user for
47 ## that. also provide a list of previously-defined login info to
48 ## choose from, if any.
49 def get_login_info uri, sources
51 accounts = sources.map do |s|
52 next unless s.respond_to?(:username)
54 [suri.host, s.username, s.password]
55 end.compact.uniq.sort_by { |h, u, p| h == uri.host ? 0 : 1 }
57 username, password = nil, nil
58 unless accounts.empty? || $opts[:force_new]
59 say "Would you like to use the same account as for a previous source for #{uri}?"
61 accounts.each do |host, olduser, oldpw|
62 menu.choice("Use the account info for #{olduser}@#{host}") { username, password = olduser, oldpw }
64 menu.choice("Use a new account") { }
65 menu.prompt = "Account selection? "
69 unless username && password
70 username = ask("Username for #{uri.host}: ");
71 password = ask("Password for #{uri.host}: ") { |q| q.echo = false }
78 $terminal.wrap_at = :auto
80 index = Redwood::Index.new
84 labels = $opts[:labels] ? $opts[:labels].split(/\s*,\s*/).uniq : []
86 if !$opts[:force_new] && index.source_for(uri)
87 say "Already know about #{uri}; skipping."
92 Trollop::die "no path component to uri: #{parsed_uri}" unless parsed_uri.path
95 case parsed_uri.scheme
97 say "For SSH connections, if you will use public key authentication, you may leave the username and password blank."
99 username, password = get_login_info uri, index.sources
100 Redwood::MBox::SSHLoader.new uri, username, password, nil, !$opts[:unusual], $opts[:archive], nil, labels
102 username, password = get_login_info uri, index.sources
103 Redwood::IMAP.new uri, username, password, nil, !$opts[:unusual], $opts[:archive], nil, labels
105 Redwood::Maildir.new uri, nil, !$opts[:unusual], $opts[:archive], nil, labels
107 Redwood::MBox::Loader.new uri, nil, !$opts[:unusual], $opts[:archive], nil, labels
109 Trollop::die "Unknown source type #{parsed_uri.scheme.inspect}"
111 say "Adding #{source}..."
112 index.add_source source