]> git.cworth.org Git - sup/blobdiff - bin/sup-add
Merge branch 'locking-refactor'
[sup] / bin / sup-add
old mode 100644 (file)
new mode 100755 (executable)
index caff68d..e27a0eb
@@ -12,14 +12,13 @@ $opts = Trollop::options do
 Adds a source to the Sup source list.
 
 Usage:
-  sup-add [options] <source>+
+  sup-add [options] <source uri>+
 
-where <source>+ is one or more sources.
+where <source uri>+ is one or more source URIs.
 
 For mbox files on local disk, use the form:
+    mbox:<path to mbox file>, or
     mbox://<path to mbox file>
-or simply
-    <path to mbox file>
 
 For mbox files on remote machines, use the form:
     mbox+ssh://<machine name>/<path to mbox file>
@@ -31,12 +30,14 @@ For IMAP folders, use the form (note no username or password!):
     imaps://<machine name>/<folder> # secure, arbitrary folder 
 
 For Maildir folders, use the form:
+    maildir:<path to Maildir directory>; or
     maildir://<path to Maildir directory>
 
 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
 
@@ -76,39 +77,47 @@ end
 
 $terminal.wrap_at = :auto
 Redwood::start
-index = Redwood::Index.new
-index.load
+index = Redwood::Index.init
 
-ARGV.each do |uri|
-  uri = "mbox://#{uri}" unless uri =~ %r!://!
+index.lock_interactively or exit
 
-  if !$opts[:force_new] && index.source_for(uri) 
-    say "Already know about #{uri}; skipping."
-    next
-  end
+begin
+  Redwood::SourceManager.load_sources
+
+  ARGV.each do |uri|
+    labels = $opts[:labels] ? $opts[:labels].split(/\s*,\s*/).uniq : []
 
-  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, index.sources
-      Redwood::MBox::SSHLoader.new uri, username, password, nil, !$opts[:unusual], $opts[:archive]
-    when "imap", "imaps"
-      username, password = get_login_info uri, index.sources
-      Redwood::IMAP.new uri, username, password, nil, !$opts[:unusual], $opts[:archive]
-    when "maildir"
-      Redwood::Maildir.new uri, nil, !$opts[:unusual], $opts[:archive]
-    when "mbox"
-      Redwood::MBox::Loader.new uri, nil, !$opts[:unusual], $opts[:archive]
-    else
-      Trollop::die "Unknown source type #{parsed_uri.scheme.inspect}"      
+    if !$opts[:force_new] && Redwood::SourceManager.source_for(uri)
+      say "Already know about #{uri}; skipping."
+      next
     end
-  say "Adding #{source}..."
-  index.add_source source
-end
 
-index.save
-Redwood::finish
+    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