#!/usr/bin/env ruby require 'uri' require 'rubygems' require 'highline/import' require 'trollop' require "sup" $opts = Trollop::options do version "sup-add (sup #{Redwood::VERSION})" banner <+ where + is one or more source URIs. For mbox files on local disk, use the form: mbox:, or mbox:// For mbox files on remote machines, use the form: mbox+ssh:/// For IMAP folders, use the form (note no username or password!): imap:/// # unsecure, "INBOX" folder imap:/// # unsecure, arbitrary imaps:/// # secure, "INBOX" folder imaps:/// # secure, arbitrary folder For Maildir folders, use the form: maildir:; or maildir:// Options are: EOS opt :archive, "Automatically archive all new messages from these sources." opt :unusual, "Do not automatically poll these sources for new messages." opt :labels, "A comma-separated set of labels to apply to all messages from this source", :type => String opt :force_new, "Create a new account for this source, even if one already exists." end Trollop::die "require one or more sources" if ARGV.empty? ## for sources that require login information, prompt the user for ## that. also provide a list of previously-defined login info to ## choose from, if any. def get_login_info uri, sources uri = URI(uri) accounts = sources.map do |s| next unless s.respond_to?(:username) suri = URI(s.uri) [suri.host, s.username, s.password] end.compact.uniq.sort_by { |h, u, p| h == uri.host ? 0 : 1 } username, password = nil, nil unless accounts.empty? || $opts[:force_new] say "Would you like to use the same account as for a previous source for #{uri}?" choose do |menu| accounts.each do |host, olduser, oldpw| menu.choice("Use the account info for #{olduser}@#{host}") { username, password = olduser, oldpw } end menu.choice("Use a new account") { } menu.prompt = "Account selection? " end end unless username && password username = ask("Username for #{uri.host}: "); password = ask("Password for #{uri.host}: ") { |q| q.echo = false } puts # why? end [username, password] end $terminal.wrap_at = :auto Redwood::start index = Redwood::Index.init index.lock_interactively or exit begin Redwood::SourceManager.load_sources ARGV.each do |uri| labels = $opts[:labels] ? $opts[:labels].split(/\s*,\s*/).uniq : [] if !$opts[:force_new] && Redwood::SourceManager.source_for(uri) say "Already know about #{uri}; skipping." next end parsed_uri = URI(uri) source = case parsed_uri.scheme when "mbox+ssh" say "For SSH connections, if you will use public key authentication, you may leave the username and password blank." say "" username, password = get_login_info uri, Redwood::SourceManager.sources Redwood::MBox::SSHLoader.new uri, username, password, nil, !$opts[:unusual], $opts[:archive], nil, labels when "imap", "imaps" username, password = get_login_info uri, Redwood::SourceManager.sources Redwood::IMAP.new uri, username, password, nil, !$opts[:unusual], $opts[:archive], nil, labels when "maildir" Redwood::Maildir.new uri, nil, !$opts[:unusual], $opts[:archive], nil, labels when "mbox" Redwood::MBox::Loader.new uri, nil, !$opts[:unusual], $opts[:archive], nil, labels when nil Trollop::die "Sources must be specified with an URI" else Trollop::die "Unknown source type #{parsed_uri.scheme.inspect}" end say "Adding #{source}..." Redwood::SourceManager.add_source source end ensure index.save index.unlock Redwood::finish end