4 require 'highline/import'
9 $opts = Trollop::options do
10 version "sup-config (sup #{Redwood::VERSION})"
12 Interactive configuration tool for Sup. Won't destroy existing
20 end #' stupid ruby-mode
22 def axe q, default=nil
24 if default && !default.empty?
25 ask "#{q} (enter for \"#{default}\"): "
29 ans.empty? ? default : ans
32 def axe_yes q, default="n"
33 axe(q, default) =~ /^y|yes$/i
37 (ENV["RUBY_INVOCATION"] ? ENV["RUBY_INVOCATION"] + " " : "") + File.join(File.dirname($0), cmd)
43 say "Ok, adding a new source."
45 menu.prompt = "What type of mail source is it?"
46 menu.choice("mbox file") { type = :mbox }
47 menu.choice("maildir directory") { type = :maildir }
48 menu.choice("remote mbox file (accessible via ssh)") { type = :mboxssh }
49 menu.choice("IMAP server (secure)") { type = :imaps }
50 menu.choice("IMAP server (unsecure)") { type = :imap }
51 menu.choice("Get me out of here!") { return }
55 say "Now for the details."
60 fn = axe "What's the full path to the mbox file?", ENV["MAIL"] #"srm
61 return if fn.nil? || fn.empty?
62 { :scheme => "mbox", :path => fn }
64 fn = axe "What's the full path to the maildir directory?", ENV["MAIL"] #"srm
65 return if fn.nil? || fn.empty?
66 { :scheme => "maildir", :path => fn }
68 srv = axe "What machine is the mbox file located on?", $last_server
69 return if srv.nil? || srv.empty?
71 fn = axe "What's the full path to the mbox file?", ENV["MAIL"] #"srm
72 return if fn.nil? || fn.empty?
74 { :scheme => "mbox+ssh", :host => srv, :path => fn }
76 srv = axe "What is the IMAP server (host, or host:port notation)?", $last_server
77 return if srv.nil? || srv.empty?
79 fn = axe "What's the folder path?", "INBOX" #"srm
80 return if fn.nil? || fn.empty?
83 if srv =~ /^(\w+):(\d+)$/
84 host, port = $1, $2.to_i
88 { :scheme => type.to_s, :host => host, :port => port, :path => fn }
93 URI::Generic.build components
94 rescue URI::Error => e
95 say "Whoopsie! I couldn't build a URI from that: #{e.message}"
96 if axe_yes("Try again?") then next else return end
99 say "I'm going to add this source: #{uri}."
100 unless axe("Does that look right?", "y") =~ /^y|yes$/i
101 if axe_yes("Try again?") then next else return end
104 usual = axe_yes "Does this source ever receive new messages?", "y"
105 archive = usual ? axe_yes("Should those new messages be automatically archived?") : false
107 cmd = build_cmd "sup-add"
108 cmd += " --unusual" unless usual
109 cmd += " --archive" if archive
112 puts "Ok, trying to run \"#{cmd}\"..."
119 say "Rats, that failed. You may have to do it manually."
120 if axe_yes("Try again?") then next else return end
125 $terminal.wrap_at = :auto
127 index = Redwood::Index.new
131 Howdy neighbor! This here's sup-config, ready to help you jack in to
132 the next generation of digital cyberspace: the text-based email
133 program. Get ready to be the envy of everyone in your internets
134 with your amazing keyboarding skills! Jump from email to email with
135 nary a click of the mouse!
137 Just answer these simple questions and you'll be on your way! Press
138 enter at any point to accept the default answer.
143 account = $config[:accounts][:default]
145 name = axe "What's your name?", account[:name]
146 email = axe "What's your email address?", account[:email] #'srm
148 say "Ok, your header will look like this:"
149 say " From: #{name} <#{email}>"
151 say "\nDo you have any alternate email addresses that also receive email?"
152 say "If so, enter them now, separated by spaces."
153 alts = axe("Alternate email addresses", account[:alternates].join(" ")).split(/\s+/)
155 sigfn = axe "What file contains your signature?", account[:signature]
156 editor = axe "What editor would you like to use?", $config[:editor]
158 $config[:accounts][:default][:name] = name
159 $config[:accounts][:default][:email] = email
160 $config[:accounts][:default][:alternates] = alts
161 $config[:accounts][:default][:signature] = sigfn
162 $config[:editor] = editor
164 Redwood::save_yaml_obj $config, Redwood::CONFIG_FN
166 say "Ok, I've saved you up a nice lil' #{Redwood::CONFIG_FN}."
170 say "\nNow, we'll tell Sup where to find all your email."
172 say "Current sources:"
173 if index.sources.empty?
176 index.sources.each { |s| puts "* #{s}" }
181 menu.prompt = "Your wish?"
182 menu.choice("Add a new source.") { add_source }
183 menu.choice("Done adding sources!") { done = true }
189 Ok. The final step is to import all your messages into the Sup index.
190 Depending on how many messages are in the sources, this could take
193 IMPORTANT NOTE: this import will archive messages if the source is
194 marked archival, and won't otherwise. It will preserve read/unread
195 status as given by the source, and it will automatically add one label
196 per source. All of this behavior can be controlled on per-source
197 basis by running sup-sync manually.
201 if axe_yes "Run sup-sync to import all messages now?"
203 cmd = build_cmd("sup-sync") + " --all-sources"
204 puts "Ok, trying to run \"#{cmd}\"..."
207 say "Great! It worked!"
210 say "Rats, that failed. You may have to do it manually."
211 if axe_yes("Try again?") then next else break end
220 Okee doke, you've got yourself an index of #{index.size} messages. Looks
221 like you're ready to jack in to cyberspace there, cowboy.
223 Just one last command: