]> git.cworth.org Git - sup/blob - bin/sup-add
added maildir support (finally!)
[sup] / bin / sup-add
1 #!/usr/bin/env ruby
2
3 require 'uri'
4 require 'rubygems'
5 require 'highline/import'
6 require 'trollop'
7 require "sup"
8
9 $opts = Trollop::options do
10   version "sup-add (sup #{Redwood::VERSION})"
11   banner <<EOS
12 Adds a source to the Sup source list.
13
14 Usage:
15   sup-add [options] <source>+
16
17 where <source>+ is one or more sources.
18
19 For mbox files on local disk, use the form:
20     mbox://<path to mbox file>
21 or simply
22     <path to mbox file>
23
24 For mbox files on remote machines, use the form:
25     mbox+ssh://<machine name>/<path to mbox file>
26
27 For IMAP folders, use the form (note no username or password!):
28     imap://<machine name>/          # unsecure, "INBOX" folder  
29     imap://<machine name>/<folder>  # unsecure, arbitrary
30     imaps://<machine name>/         # secure, "INBOX" folder
31     imaps://<machine name>/<folder> # secure, arbitrary folder 
32
33 For Maildir folders, use the form:
34     maildir://<path to Maildir directory>
35
36 Options are:
37 EOS
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 :force_new, "Create a new account for this source, even if one already exists."
41 end
42
43 Trollop::die "require one or more sources" if ARGV.empty?
44
45 ## for sources that require login information, prompt the user for
46 ## that. also provide a list of previously-defined login info to
47 ## choose from, if any.
48 def get_login_info uri, sources
49   uri = URI(uri)
50   accounts = sources.map do |s|
51     next unless s.respond_to?(:username)
52     suri = URI(s.uri)
53     [suri.host, s.username, s.password]
54   end.compact.uniq.sort_by { |h, u, p| h == uri.host ? 0 : 1 }
55
56   username, password = nil, nil
57   unless accounts.empty? || $opts[:force_new]
58     say "Would you like to use the same account as for a previous source for #{uri}?"
59     choose do |menu|
60       accounts.each do |host, olduser, oldpw|
61         menu.choice("Use the account info for #{olduser}@#{host}") { username, password = olduser, oldpw }
62       end
63       menu.choice("Use a new account") { }
64       menu.prompt = "Account selection? "
65     end
66   end
67
68   unless username && password
69     username = ask("Username for #{uri.host}: ");
70     password = ask("Password for #{uri.host}: ") { |q| q.echo = false }
71     puts # why?
72   end
73
74   [username, password]
75 end
76
77 $terminal.wrap_at = :auto
78 Redwood::start
79 index = Redwood::Index.new
80 index.load
81
82 ARGV.each do |uri|
83   uri = "mbox://#{uri}" unless uri =~ %r!://!
84
85   if !$opts[:force_new] && index.source_for(uri) 
86     say "Already know about #{uri}; skipping."
87     next
88   end
89
90   parsed_uri = URI(uri)
91
92   source = 
93     case parsed_uri.scheme
94     when "mbox+ssh"
95       say "For SSH connections, if you will use public key authentication, you may leave the username and password blank."
96       say ""
97       username, password = get_login_info uri, index.sources
98       Redwood::MBox::SSHLoader.new uri, username, password, nil, !$opts[:unusual], $opts[:archive]
99     when "imap", "imaps"
100       username, password = get_login_info uri, index.sources
101       Redwood::IMAP.new uri, username, password, nil, !$opts[:unusual], $opts[:archive]
102     when "maildir"
103       Redwood::Maildir.new uri, nil, !$opts[:unusual], $opts[:archive]
104     when "mbox"
105       Redwood::MBox::Loader.new uri, nil, !$opts[:unusual], $opts[:archive]
106     else
107       Trollop::die "Unknown source type #{parsed_uri.scheme.inspect}"      
108     end
109   say "Adding #{source}..."
110   index.add_source source
111 end
112
113 say "Saving source list..."
114 index.save
115 Redwood::finish