sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/

bin/sup-add (3493B) - raw

      1 #!/usr/bin/env ruby
      2 
      3 $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
      4 
      5 require 'uri'
      6 require 'optimist'
      7 require "sup"
      8 require 'sup/util/axe'
      9 
     10 $opts = Optimist::options do
     11   version "sup-add (sup #{Redwood::VERSION})"
     12   banner <<EOS
     13 Adds a source to the Sup source list.
     14 
     15 Usage:
     16   sup-add [options] <source uri>+
     17 
     18 where <source uri>+ is one or more source URIs.
     19 
     20 For mbox files on local disk, use the form:
     21     mbox:<path to mbox file>, or
     22     mbox://<path to mbox file>
     23 
     24 For Maildir folders, use the form:
     25     maildir:<path to Maildir directory>; or
     26     maildir://<path to Maildir directory>
     27 
     28 Options are:
     29 EOS
     30   opt :archive, "Automatically archive all new messages from these sources."
     31   opt :unusual, "Do not automatically poll these sources for new messages."
     32   opt :sync_back, "Synchronize status flags back into messages, defaults to true (Maildir sources only).", :default => true
     33   opt :labels, "A comma-separated set of labels to apply to all messages from this source", :type => String
     34   opt :force_new, "Create a new account for this source, even if one already exists."
     35   opt :force_account, "Reuse previously defined account user@hostname.", :type => String
     36 end
     37 
     38 Optimist::die "require one or more sources" if ARGV.empty?
     39 
     40 ## for sources that require login information, prompt the user for
     41 ## that. also provide a list of previously-defined login info to
     42 ## choose from, if any.
     43 def get_login_info uri, sources
     44   uri = URI(uri)
     45   accounts = sources.map do |s|
     46     next unless s.respond_to?(:username)
     47     suri = URI(s.uri)
     48     [suri.host, s.username, s.password]
     49   end.compact.uniq.sort_by { |h, u, p| h == uri.host ? 0 : 1 }
     50 
     51   username, password = nil, nil
     52   unless accounts.empty? || $opts[:force_new]
     53     if $opts[:force_account]
     54       host, username, password = accounts.find { |h, u, p| $opts[:force_account] == "#{u}@#{h}" }
     55       unless username && password
     56         @cli.say "No previous account #{$opts[:force_account].inspect} found."
     57       end
     58     else
     59       @cli.say "Would you like to use the same account as for a previous source for #{uri}?"
     60       @cli.choose do |menu|
     61         accounts.each do |host, olduser, oldpw|
     62           menu.choice("Use the account info for #{olduser}@#{host}") { username, password = olduser, oldpw }
     63         end
     64         menu.choice("Use a new account") { }
     65         menu.prompt = "Account selection? "
     66       end
     67     end
     68   end
     69 
     70   unless username && password
     71     username = @cli.ask("Username for #{uri.host}: ");
     72     password = @cli.ask("Password for #{uri.host}: ") { |q| q.echo = false }
     73     puts # why?
     74   end
     75 
     76   [username, password]
     77 end
     78 
     79 @cli.wrap_at = :auto
     80 Redwood::start
     81 index = Redwood::Index.init
     82 index.load
     83 
     84 index.lock_interactively or exit
     85 
     86 begin
     87   Redwood::SourceManager.load_sources
     88 
     89   ARGV.each do |uri|
     90     labels = $opts[:labels] ? $opts[:labels].split(/\s*,\s*/).uniq : []
     91 
     92     if !$opts[:force_new] && Redwood::SourceManager.source_for(uri)
     93       @cli.say "Already know about #{uri}; skipping."
     94       next
     95     end
     96 
     97     source =
     98       case uri
     99       when /^maildir:/
    100         Redwood::Maildir.new uri, !$opts[:unusual], $opts[:archive], $opts[:sync_back], nil, labels
    101       when /^mbox:/
    102         Redwood::MBox.new uri, !$opts[:unusual], $opts[:archive], nil, labels
    103       when nil
    104         Optimist::die "Sources must be specified with a maildir:// or mbox:// URI"
    105       end
    106     @cli.say "Adding #{source}..."
    107     Redwood::SourceManager.add_source source
    108   end
    109 ensure
    110   index.save
    111   index.unlock
    112   Redwood::finish
    113 end