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