sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit ef385eced7f0a2bbc3bb909861a9f5d077b5f179
parent aaa852fbe513291144301bb31af50558177f891c
Author: Gaute Hope <eg@gaute.vetsj.com>
Date:   Wed, 15 May 2013 10:34:45 +0200

Merge branch 'develop'

Conflicts:
	lib/sup.rb

Diffstat:
D .ditz-plugins | 1 -
M .gitignore | 10 ++++++++--
A .travis.yml | 16 ++++++++++++++++
M CONTRIBUTORS | 37 +++++++++++++++++++++++++------------
A Gemfile | 3 +++
M History.txt | 5 +++++
A README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
D README.txt | 128 -------------------------------------------------------------------------------
M Rakefile | 70 ++++++++++++----------------------------------------------------------
M ReleaseNotes | 5 +++++
M bin/sup | 34 +++++++++++++++-------------------
D bin/sup-cmd | 138 -------------------------------------------------------------------------------
M bin/sup-config | 3 +--
D bin/sup-server | 44 --------------------------------------------
D bugs/issue-0240b36671ecb019e57ef27e0901bff055385371.yaml | 22 ----------------------
D bugs/issue-08d6bae05fa885bf6fcae39f864eb923c1e9a79e.yaml | 27 ---------------------------
D bugs/issue-09479a2ada22c2a0d76427e12ef2514d4753d070.yaml | 18 ------------------
D bugs/issue-15738247f939d20f8f202f80ccb85d9ad92101e0.yaml | 18 ------------------
D bugs/issue-182841e15d6909892adf43678bae03597ce10519.yaml | 25 -------------------------
D bugs/issue-1a1527438c2d198eae9a264ce9e6b847854d9837.yaml | 30 ------------------------------
D bugs/issue-2312263b6a2b7de6ae1ec4ab315c7829763e61be.yaml | 22 ----------------------
D bugs/issue-23658477a445c2e61405fecb4cb641a2298caba6.yaml | 27 ---------------------------
D bugs/issue-2673f091c15dd90222a59621a1842d4ef0a743f7.yaml | 19 -------------------
D bugs/issue-2a0363cdf9d25edfa2a04b21299a538365e8b319.yaml | 30 ------------------------------
D bugs/issue-2e74aa6843feee4daefe740b6e3f1fc54ff4bfcb.yaml | 22 ----------------------
D bugs/issue-314f0cdac8d1998c46759a4ebef9077999bcef09.yaml | 18 ------------------
D bugs/issue-3408c200a5f47f92d12b5c063a00ce891c2ba4ce.yaml | 22 ----------------------
D bugs/issue-3441fb8b7f955d625633d06fa0bf67a9afab046e.yaml | 18 ------------------
D bugs/issue-38d6f805b0c8bad013ec73f56e6245c890528591.yaml | 29 -----------------------------
D bugs/issue-3b25f1d56b9be533edaf232b9e60dc24e00cba0b.yaml | 26 --------------------------
D bugs/issue-42ab0840f9a1924f1c0561e8ddcf7e6988543ba0.yaml | 26 --------------------------
D bugs/issue-46df983ccdb75408a37b3911472d4015664a3cf6.yaml | 20 --------------------
D bugs/issue-47aab6443b6c107c3067cdb614186099db570acf.yaml | 37 -------------------------------------
D bugs/issue-4af242013994ae557e431ba350a92c4f9e1739ef.yaml | 28 ----------------------------
D bugs/issue-4daa2721dac8dfeb8730ee081f73b6c62702bd3e.yaml | 23 -----------------------
D bugs/issue-4e501973cea5bd1f28739ae4cea98edce8249895.yaml | 32 --------------------------------
D bugs/issue-5348fec2b1112250e241afc7467de29e5691d1be.yaml | 21 ---------------------
D bugs/issue-57668c69d0190d6e849309834d4ad1d215efa779.yaml | 21 ---------------------
D bugs/issue-5795c3c1b47e88f7261f57f31d33fe15ad08465d.yaml | 20 --------------------
D bugs/issue-5fab957dcd16f1da8962fe5b1f3a58d970315deb.yaml | 24 ------------------------
D bugs/issue-60d86dd32054533a6206f698033ec668af6a7574.yaml | 29 -----------------------------
D bugs/issue-61949ec83770b5d46f89eff21799968187012cce.yaml | 22 ----------------------
D bugs/issue-65506670167642cc581956bc1b25c26b5bff215b.yaml | 30 ------------------------------
D bugs/issue-658389418b5f0038cc3e6bc20fd3fd1566eb7111.yaml | 26 --------------------------
D bugs/issue-69f785cddcc6e09ef0a357151373b3aa923d5e3f.yaml | 22 ----------------------
D bugs/issue-6c053cca2eb05af486a2d09c6772fd5bd0cca444.yaml | 20 --------------------
D bugs/issue-6e0d634de74b2eb8297174ecd408b3810ba9351b.yaml | 24 ------------------------
D bugs/issue-6e7960514f66ee67da083bc7bb5632d5808fc607.yaml | 30 ------------------------------
D bugs/issue-7456c2d8fbd5de4dac651f6f4e9756f577497e01.yaml | 26 --------------------------
D bugs/issue-76802330c4fdd091e8b1dd08dcc29ed432f003d4.yaml | 26 --------------------------
D bugs/issue-799771a6a435dcad66dc80e7e051d91d24d005b1.yaml | 31 -------------------------------
D bugs/issue-7a68c1e7120a8540c7c51c6095f4815918d16641.yaml | 28 ----------------------------
D bugs/issue-7c77e757321c2639daea013824ad1a14099815b1.yaml | 26 --------------------------
D bugs/issue-7d8474dfeeefaa50151c3ce48bee6b686d36a216.yaml | 29 -----------------------------
D bugs/issue-829b449c51fca9a39047d00fabc552cc110c69b2.yaml | 24 ------------------------
D bugs/issue-82c80f6dc2ce7b10b9e8f503d68253ced0ee8a1b.yaml | 24 ------------------------
D bugs/issue-8a5cf9242ca60fa6c81091e425f734b4fb03e41a.yaml | 53 -----------------------------------------------------
D bugs/issue-8aa7ea95f066fd0668452093b85903bd142905c9.yaml | 26 --------------------------
D bugs/issue-8c0e627c500f679badca28f60ba76998fd65d46a.yaml | 26 --------------------------
D bugs/issue-8e825caee33a6ac144580bf44d0d3060ad162394.yaml | 21 ---------------------
D bugs/issue-91e1549102c0bfa2c201476d9618f7d234d1a626.yaml | 22 ----------------------
D bugs/issue-9f7e28de46d74f7f1e445ae75ea4e230c7473374.yaml | 22 ----------------------
D bugs/issue-a1a3427de5e8d4f74c0620f99e97ed92d21e924c.yaml | 30 ------------------------------
D bugs/issue-a1e622dbae0e1841b4d9a376d419aed1d91460e0.yaml | 26 --------------------------
D bugs/issue-a533480a30a18c3e823dbe20b759e1dcb32ca2b9.yaml | 26 --------------------------
D bugs/issue-a68148169baa3838051f4bdb4c175e11cbf7f143.yaml | 22 ----------------------
D bugs/issue-aae5ae6378afa9bd2a8e1b15d28ba7ccef867791.yaml | 27 ---------------------------
D bugs/issue-ad82aa00f4064fc7e1332cee0dae2c2ae95bb217.yaml | 26 --------------------------
D bugs/issue-b1f1579fd8350d8add15c5cb588169acfdc5ea24.yaml | 29 -----------------------------
D bugs/issue-b80aa39ef3b8d33bd57e4988c55d89c7c0df5c96.yaml | 24 ------------------------
D bugs/issue-bc03bc702f41e6a9687b52d3e32db29132c0f65a.yaml | 25 -------------------------
D bugs/issue-bdd4415a9d4c8fd3602500111bf9268aa7c7c6a4.yaml | 27 ---------------------------
D bugs/issue-bff2527210b3aacae2f74029e5856fed82f1689c.yaml | 33 ---------------------------------
D bugs/issue-c48f7fc58bba0b38ff6ae14cca01b08a5a7a6c33.yaml | 21 ---------------------
D bugs/issue-c52f9762bc24a8f45863eb2e7beefa4201db34e8.yaml | 22 ----------------------
D bugs/issue-c660ddfa9d633501140dd199bdfd7cd9fed5df0b.yaml | 22 ----------------------
D bugs/issue-cef3096582de268c050f78223eb6a22ac2599606.yaml | 31 -------------------------------
D bugs/issue-cf09ec6ec7c35d7d8c002b0521f97b6e94dc9b3e.yaml | 26 --------------------------
D bugs/issue-cfbfc65dc90280fa5ecc63094af01d2a47ff0c6e.yaml | 22 ----------------------
D bugs/issue-d131464e921aefc35571c119aac4d9f1decdebae.yaml | 30 ------------------------------
D bugs/issue-d994a360c9cb2a6e12a734962a39ffbc6486a725.yaml | 34 ----------------------------------
D bugs/issue-d9e6be1b524c6c0a5c31c9c468bda170c2a8cb58.yaml | 33 ---------------------------------
D bugs/issue-e24df153080c6e7a16335018b04d70d9381258b8.yaml | 20 --------------------
D bugs/issue-e43b18777ea3aef3566bd80acd126e9ef8a5883a.yaml | 34 ----------------------------------
D bugs/issue-e7739718b4dbf49bbd3dd47133affbf7cb1e2361.yaml | 24 ------------------------
D bugs/issue-e9c2f66a7ff4fb4525c2719e77ac8eedf3835dfd.yaml | 20 --------------------
D bugs/issue-f767a9d2071da7b0f66698ce74e642bf347be96b.yaml | 21 ---------------------
D bugs/issue-fd7c7a7d7caf41ff20e7d10ca3f074fc02c14a5b.yaml | 30 ------------------------------
D bugs/issue-fdfc906e8f4f6eb10f1ebdf39c416415d9ab6af9.yaml | 26 --------------------------
D bugs/project.yaml | 53 -----------------------------------------------------
M contrib/colorpicker.rb | 6 +-----
M lib/sup.rb | 11 ++++++++---
M lib/sup/buffer.rb | 6 +-----
D lib/sup/client.rb | 92 -------------------------------------------------------------------------------
M lib/sup/contact.rb | 5 +++--
M lib/sup/crypto.rb | 18 +++++++++++++++++-
M lib/sup/index.rb | 5 ++---
M lib/sup/message-chunks.rb | 3 ++-
M lib/sup/message.rb | 2 +-
M lib/sup/modes/edit-message-mode.rb | 58 +++++++++++++++++++++++++++++++++++++++++++++-------------
M lib/sup/modes/reply-mode.rb | 60 +++++++++++++++++++++++++++++++-----------------------------
M lib/sup/modes/thread-view-mode.rb | 2 +-
D lib/sup/protocol.rb | 161 -------------------------------------------------------------------------------
D lib/sup/server.rb | 116 -------------------------------------------------------------------------------
M lib/sup/source.rb | 2 +-
M lib/sup/util.rb | 1 +
A lib/sup/version.rb | 3 +++
D protocol.md | 168 -------------------------------------------------------------------------------
D sup-files.rb | 11 -----------
D sup-version.rb | 15 ---------------
A sup.gemspec | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
M test/dummy_source.rb | 2 +-
M test/test_header_parsing.rb | 27 +++++++++++++++++++--------
M test/test_message.rb | 18 +++++++++++-------
D test/test_server.rb | 106 -------------------------------------------------------------------------------
A test/test_yaml_regressions.rb | 17 +++++++++++++++++
D www/index.html | 224 -------------------------------------------------------------------------------
D www/main.css | 36 ------------------------------------
D www/ss1.png | 0
D www/ss2.png | 0
D www/ss3.png | 0
D www/ss4.png | 0
D www/ss5.png | 0
D www/ss6.png | 0
124 files changed, 376 insertions(+), 3390 deletions(-)
diff --git a/.ditz-plugins b/.ditz-plugins
@@ -1 +0,0 @@
-- git
diff --git a/.gitignore b/.gitignore
@@ -1,7 +1,13 @@
 # i use vi
 *.swp
-.ditz-config
 # i use emacs
 *~
-# i use rake package task
+# artifact
 pkg/
+*.gem
+# i have accidently added this one one too many times
+sup-exception-log.txt
+
+# bundler stuff
+Gemfile.lock
+.bundle
diff --git a/.travis.yml b/.travis.yml
@@ -0,0 +1,16 @@
+language: ruby
+
+rvm:
+  - 2.0.0
+  - 1.9.3
+  - 1.8.7
+
+before_install:
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq uuid-dev uuid libncursesw5-dev libncursesw5
+
+script: bundle exec rake travis
+
+matrix:
+  allow_failures:
+    - rvm: 2.0.0
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
@@ -1,26 +1,29 @@
 William Morgan <wmorgan-sup at the masanjin dot nets>
 Rich Lane <rlane at the club.cc.cmu dot edus>
+Gaute Hope <eg at the gaute.vetsj dot coms>
+Hamish Downer <dmishd at the gmail dot coms>
+Whyme Lyu <callme5long at the gmail dot coms>
+Sascha Silbe <sascha-pgp at the silbe dot orgs>
 Ismo Puustinen <ismo at the iki dot fis>
 Nicolas Pouillard <nicolas.pouillard at the gmail dot coms>
-Eric Sherman <hyperbolist at the gmail dot coms>
 Michael Stapelberg <michael at the stapelberg dot des>
+Eric Sherman <hyperbolist at the gmail dot coms>
+Tero Tilus <tero at the tilus dot nets>
 Ben Walton <bwalton at the artsci.utoronto dot cas>
 Mike Stipicevic <stipim at the rpi dot edus>
 Marcus Williams <marcus-sup at the bar-coded dot nets>
 Lionel Ott <white.magic at the gmx dot des>
-Tero Tilus <tero at the tilus dot nets>
+Gaudenz Steinlin <gaudenz at the soziologie dot chs>
+Damien Leone <damien.leone at the fensalir dot frs>
 Ingmar Vanhassel <ingmar at the exherbo dot orgs>
 Mark Alexander <marka at the pobox dot coms>
-Gaute Hope <eg at the gaute.vetsj dot coms>
+Eric Weikl <eric.weikl at the tngtech dot coms>
 Christopher Warrington <chrisw at the rice dot edus>
 W. Trevor King <wking at the drexel dot edus>
-Gaudenz Steinlin <gaudenz at the soziologie dot chs>
 Richard Brown <rbrown at the exherbo dot orgs>
 Marc Hartstein <marc.hartstein at the alum.vassar dot edus>
-Sascha Silbe <sascha-pgp at the silbe dot orgs>
 Israel Herraiz <israel.herraiz at the gmail dot coms>
 Anthony Martinez <pi+sup at the pihost dot uss>
-Hamish Downer <dmishd at the gmail dot coms>
 Bo Borgerson <gigabo at the gmail dot coms>
 William Erik Baxter <web at the superscript dot coms>
 Michael Hamann <michael at the content-space dot des>
@@ -29,26 +32,36 @@ Adeodato Simó <dato at the net.com.org dot ess>
 Daniel Schoepe <daniel.schoepe at the googlemail dot coms>
 Jason Petsod <jason at the petsod dot orgs>
 Steve Goldman <sgoldman at the tower-research dot coms>
+Robin Burchell <viroteck at the viroteck dot nets>
+Peter Harkins <ph at the malaprop dot orgs>
 Edward Z. Yang <ezyang at the MIT dot EDUs>
 Decklin Foster <decklin at the red-bean dot coms>
 Cameron Matheson <cam+sup at the cammunism dot orgs>
 Carl Worth <cworth at the cworth dot orgs>
 Jeff Balogh <its.jeff.balogh at the gmail dot coms>
-Andrew Pimlott <andrew at the pimlott dot nets>
 Alex Vandiver <alexmv at the mit dot edus>
-Peter Harkins <ph at the malaprop dot orgs>
+Andrew Pimlott <andrew at the pimlott dot nets>
+Matías Aguirre <matiasaguirre at the gmail dot coms>
+Anthony Martinez <pi at the pihost dot uss>
 Kornilios Kourtis <kkourt at the cslab.ece.ntua dot grs>
+Kevin Riggle <kevinr at the free-dissociation dot coms>
 Giorgio Lando <patroclo7 at the gmail dot coms>
-Damien Leone <damien.leone at the fensalir dot frs>
 Benoît PIERRE <benoit.pierre at the gmail dot coms>
 Alvaro Herrera <alvherre at the alvh.no-ip dot orgs>
+Eric Weikl <eric.weikl at the gmx dot nets>
 Jonah <Jonah at the GoodCoffee dot cas>
+ian <ian at the lorf dot orgs>
 Adam Lloyd <adam at the alloy-d dot nets>
 Todd Eisenberger <teisenbe at the andrew.cmu dot edus>
-ian <ian at the lorf dot orgs>
 Steven Walter <swalter at the monarch.(none)>
-ian <itaylor at the uark dot edus>
-Jon M. Dugan <jdugan at the es dot nets>
+Alex Vandiver <alex at the chmrr dot nets>
 Gregor Hoffleit <gregor at the sam.mediasupervision dot des>
+Jon M. Dugan <jdugan at the es dot nets>
+Matthieu Rakotojaona <matthieu.rakotojaona at the gmail dot coms>
 Stefan Lundström <lundst at the snabb.(none)>
+Matthias Vallentin <vallentin at the icir dot orgs>
+Steven Lawrance <stl at the redhat dot coms>
+Jonathan Lassoff <jof at the thejof dot coms>
+ian <itaylor at the uark dot edus>
+Gregor Hoffleit <gregor at the hoffleit dot des>
 Kirill Smelkov <kirr at the landau.phys.spbu dot rus>
diff --git a/Gemfile b/Gemfile
@@ -0,0 +1,3 @@
+source 'http://rubygems.org/'
+
+gemspec
diff --git a/History.txt b/History.txt
@@ -1,3 +1,8 @@
+== 0.13.0 / 2013-05-15
+
+* Bugfixes
+* Depend on ncursesw-sup
+
 == 0.12.1 / 2011-01-23
 * Depend on ncursesw rather than ncurses (Ruby 1.9 compatibility)
 * Add sup-import-dump
diff --git a/README.md b/README.md
@@ -0,0 +1,70 @@
+# Sup
+
+A console-based email client with the best features of GMail, mutt and
+Emacs.
+
+## Installation
+
+[See the wiki][Installation]
+
+## Features / Problems
+
+Features:
+
+* GMail-like thread-centered archiving, tagging and muting
+* [Handling mail from multiple mbox and Maildir sources][sources]
+* Blazing fast full-text search with a [rich query language][search]
+* Multiple accounts - pick the right one when sending mail
+* [Ruby-programmable hooks][hooks]
+* Automatically tracking recent contacts
+
+Current limitations which will be fixed:
+
+* [Doesn't run on Ruby 2.0][ruby20]
+
+* Sup doesn't play nicely with other mail clients. Changes in Sup won't be
+  synced back to mail source.
+
+* Unix-centrism in MIME attachment handling and in sendmail invocation.
+
+## Problems
+
+Please report bugs to the [Github issue tracker](https://github.com/sup-heliotrope/sup/issues).
+
+## Links
+
+* [Homepage](http://supmua.org/)
+* [Code repository](https://github.com/sup-heliotrope/sup)
+* [Wiki](https://github.com/sup-heliotrope/sup/wiki)
+* IRC: [#sup @ freenode.net](http://webchat.freenode.net/?channels=#sup)
+* Mailing list: [sup-talk] and [sup-devel]
+
+## License
+
+```
+Copyright (c) 2013       Sup developers.
+Copyright (c) 2006--2009 William Morgan.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA.
+```
+
+[sources]: https://github.com/sup-heliotrope/sup/wiki/Adding-sources
+[hooks]: https://github.com/sup-heliotrope/sup/wiki/Hooks
+[search]: https://github.com/sup-heliotrope/sup/wiki/Searching-your-mail
+[Installation]: https://github.com/sup-heliotrope/sup/wiki#installation
+[ruby20]: https://github.com/sup-heliotrope/sup/wiki/Development#sup-014
+[sup-talk]: http://rubyforge.org/mailman/listinfo/sup-talk
+[sup-devel]: http://rubyforge.org/mailman/listinfo/sup-devel
diff --git a/README.txt b/README.txt
@@ -1,128 +0,0 @@
-sup
-    by William Morgan <wmorgan-sup@masanjin.net>
-    http://sup.rubyforge.org
-
-== DESCRIPTION:
-
-Sup is a console-based email client for people with a lot of email.
-It supports tagging, very fast full-text search, automatic contact-
-list management, and more. If you're the type of person who treats
-email as an extension of your long-term memory, Sup is for you.
-
-Sup makes it easy to:
-- Handle massive amounts of email.
-
-- Mix email from different sources: mbox files and Maildirs.
-
-- Instantaneously search over your entire email collection. Search over
-  body text, or use a query language to combine search predicates in any
-  way.
-
-- Handle multiple accounts. Replying to email sent to a particular
-  account will use the correct SMTP server, signature, and from address.
-
-- Add custom code to customize Sup to whatever particular and bizarre
-  needs you may have.
-
-- Organize email with user-defined labels, automatically track recent
-  contacts, and much more!
-
-The goal of Sup is to become the email client of choice for nerds
-everywhere.
-
-== FEATURES/PROBLEMS:
-
-Features:
-
-- Scalability to massive amounts of email. Immediate startup and
-  operability, regardless of how much amount of email you have.
-
-- Immediate full-text search of your entire email archive, using the
-  Xapian query language. Search over message bodies, labels, from: and
-  to: fields, or any combination thereof.
-
-- Thread-centrism. Operations are performed at the thread, not the
-  message level. Entire threads are manipulated and viewed (with
-  redundancies removed) at a time.
-
-- Labels instead of folders. Drop that tired old metaphor and you'll see
-  how much easier it is to organize email.
-
-- GMail-style thread management. Archive a thread, and it will disappear
-  from your inbox until someone replies. Kill a thread, and it will
-  never come back to your inbox (but will still show up in searches.)
-  Mark a thread as spam and you'll never again see it unless explicitly
-  searching for spam.
-
-- Console based interface. No mouse clicking required!
-
-- Programmability. It's in Ruby. The code is good. It has an extensive
-  hook system that makes it easy to extend and customize.
-
-- Multiple buffer support. Why be limited to viewing one thing at a
-  time?
-
-- Tons of other little features, like automatic context-sensitive help,
-  multi-message operations, MIME attachment viewing, recent contact list
-  generation, etc.
-
-Current limitations which will be fixed:
-
-- Sup doesn't play nicely with other mail clients. If you alter a mail
-  source (read, move, delete, etc) with another client Sup will punish
-  you with a lengthy reindexing process.
-
-- Unix-centrism in MIME attachment handling and in sendmail invocation.
-
-== SYNOPSYS:
-
-  0. sup-config
-  1. sup
-
-  Note that Sup never changes the contents of any mailboxes; it only
-  indexes in to them. So it shouldn't ever corrupt your mail. The flip
-  side is that if you change a mailbox (e.g. delete messages, or, in the
-  case of mbox files, read an unread message) then Sup will be unable to
-  load messages from that source and will ask you to run sup-sync
-  --changed.
-
-== REQUIREMENTS:
-
- - xapian-full >= 1.1.3.2
- - ncurses >= 0.9.1
- - rmail >= 0.17
- - highline
- - net-ssh
- - trollop >= 1.12
- - lockfile
- - mime-types
- - gettext
- - fastthread
-
-== INSTALL:
-
-* gem install sup
-
-== PROBLEMS:
-
-See FAQ.txt for some common problems and their solutions.
-
-== LICENSE:
-
-Copyright (c) 2006--2009 William Morgan.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.
-
diff --git a/Rakefile b/Rakefile
@@ -1,64 +1,18 @@
-## is there really no way to make a rule for this?
-WWW_FILES = %w(www/index.html README.txt doc/Philosophy.txt doc/FAQ.txt doc/NewUserGuide.txt www/main.css)
-
-rule 'ss?.png' => 'ss?-small.png' do |t|
-end
-SCREENSHOTS = FileList["www/ss?.png"]
-SCREENSHOTS_SMALL = []
-SCREENSHOTS.each do |fn|
-  fn =~ /ss(\d+)\.png/
-  sfn = "www/ss#{$1}-small.png"
-  file sfn => [fn] do |t|
-    sh "cat #{fn} | pngtopnm | pnmscale -xysize 320 240 | pnmtopng > #{sfn}"
-  end
-  SCREENSHOTS_SMALL << sfn
-end
-
-task :upload_webpage => WWW_FILES do |t|
-  sh "rsync -essh -cavz #{t.prerequisites * ' '} wmorgan@rubyforge.org:/var/www/gforge-projects/sup/"
-end
-
-task :upload_webpage_images => (SCREENSHOTS + SCREENSHOTS_SMALL) do |t|
-  sh "rsync -essh -cavz #{t.prerequisites * ' '} wmorgan@rubyforge.org:/var/www/gforge-projects/sup/"
-end
-
-# vim: syntax=ruby
-# -*- ruby -*-
-task :upload_report do |t|
-  sh "ditz html ditz"
-  sh "rsync -essh -cavz ditz wmorgan@rubyforge.org:/var/www/gforge-projects/sup/"
-end
-
-$:.push "lib"
 require 'rubygems'
-require "sup-files"
-require "sup-version"
-require 'rake/gempackagetask.rb'
-
-spec = Gem::Specification.new do |s|
-  s.name = %q{sup}
-  s.version = SUP_VERSION
-  s.date = Time.now.to_s
-  s.authors = ["William Morgan"]
-  s.email = %q{wmorgan-sup@masanjin.net}
-  s.summary = %q{A console-based email client with the best features of GMail, mutt, and emacs. Features full text search, labels, tagged operations, multiple buffers, recent contacts, and more.}
-  s.homepage = %q{http://sup.rubyforge.org/}
-  s.description = %q{Sup is a console-based email client for people with a lot of email. It supports tagging, very fast full-text search, automatic contact-list management, and more. If you're the type of person who treats email as an extension of your long-term memory, Sup is for you.  Sup makes it easy to: - Handle massive amounts of email.  - Mix email from different sources: mbox files (even across different machines), Maildir directories, POP accounts, and GMail accounts.  - Instantaneously search over your entire email collection. Search over body text, or use a query language to combine search predicates in any way.  - Handle multiple accounts. Replying to email sent to a particular account will use the correct SMTP server, signature, and from address.  - Add custom code to handle certain types of messages or to handle certain types of text within messages.  - Organize email with user-defined labels, automatically track recent contacts, and much more!  The goal of Sup is to become the email client of choice for nerds everywhere.}
-  s.files = SUP_FILES
-  s.executables = SUP_EXECUTABLES
+require 'rake/testtask'
 
-  s.add_dependency "xapian-full", ">= 1.2.1"
-  s.add_dependency "ncursesw"
-  s.add_dependency "rmail", ">= 0.17"
-  s.add_dependency "highline"
-  s.add_dependency "trollop", ">= 1.12"
-  s.add_dependency "lockfile"
-  s.add_dependency "mime-types", "~> 1"
-  s.add_dependency "gettext"
+Rake::TestTask.new(:test) do |test|
+  test.libs << 'test'
+  test.test_files = FileList.new('test/test_*.rb')
+  test.verbose = true
 end
 
-Rake::GemPackageTask.new(spec) do |pkg|
-    pkg.need_tar = true
+require 'rubygems/package_task'
+# For those who don't have `rubygems-bundler` installed
+load 'sup.gemspec' unless defined? Redwood::Gemspec
+
+Gem::PackageTask.new(Redwood::Gemspec) do |pkg|
+  pkg.need_tar = true
 end
 
-task :tarball => ["pkg/sup-#{SUP_VERSION}.tgz"]
+task :travis => [:test, :gem]
diff --git a/ReleaseNotes b/ReleaseNotes
@@ -1,3 +1,8 @@
+Release 0.13.0:
+
+Collection of bugfixes and stability fixes since 0.12.1. We now depend on our
+own ncursesw-sup fork.
+
 Release 0.12.1:
 
 This release changes the gem dependency on ncurses to ncursesw, which
diff --git a/bin/sup b/bin/sup
@@ -2,16 +2,12 @@
 
 require 'rubygems'
 
-no_ncursesw = false
-begin
-  require 'ncursesw'
-rescue LoadError
-  require 'ncurses'
-  no_ncursesw = true
-end
+require 'ncursesw'
 
 no_gpgme = false
 begin
+  # gpgme broke its API in 2.0, so make sure we have the old version for now.
+  gem 'gpgme', '=1.0.8'
   require 'gpgme'
 rescue LoadError
   no_gpgme = true
@@ -26,10 +22,6 @@ if ENV['SUP_PROFILE']
   RubyProf.start
 end
 
-if no_ncursesw
-  info "No 'ncursesw' gem detected. Install it for wide character support."
-end
-
 if no_gpgme
   info "No 'gpgme' gem detected. Install it for email encryption, decryption and signatures."
 end
@@ -115,9 +107,10 @@ end
 ##
 ## BSD users: if libc.so.6 is not found, try installing compat6x.
 require 'dl/import'
+require 'rbconfig'
 module LibC
   extend DL.const_defined?(:Importer) ? DL::Importer : DL::Importable
-  setlocale_lib = case Config::CONFIG['arch']
+  setlocale_lib = case RbConfig::CONFIG['arch']
     when /darwin/; "libc.dylib"
     when /cygwin/; "cygwin1.dll"
     else; "libc.so.6"
@@ -132,7 +125,7 @@ module LibC
   rescue RuntimeError => e
     warn "cannot dlload setlocale(); ncurses wide character support probably broken."
     warn "dlload error was #{e.class}: #{e.message}"
-    if Config::CONFIG['arch'] =~ /bsd/
+    if RbConfig::CONFIG['arch'] =~ /bsd/
       warn "BSD variant detected. You may have to install a compat6x package to acquire libc."
     end
   end
@@ -298,7 +291,10 @@ begin
       b, new = bm.spawn_unless_exists("Contact List") { ContactListMode.new }
       b.mode.load_in_background if new
     when :search
-      query = BufferManager.ask :search, "Search all messages (enter for saved searches): "
+      completions = LabelManager.all_labels.map { |l| "label:#{LabelManager.string_for l}" }
+      completions = completions.each { |l| l.force_encoding 'UTF-8' if l.methods.include?(:encoding) }
+      completions += ["from:", "to:", "after:", "before:", "date:", "limit:", "AND", "OR", "NOT"]
+      query = BufferManager.ask_many_with_completions :search, "Search all messages (enter for saved searches): ", completions
       unless query.nil?
         if query.empty?
           bm.spawn_unless_exists("Saved searches") { SearchListMode.new }
@@ -415,14 +411,14 @@ unless Redwood::exceptions.empty?
   end
   $stderr.puts <<EOS
 ----------------------------------------------------------------
-I'm very sorry. It seems that an error occurred in Sup. Please
-accept my sincere apologies. Please submit the contents of
+We are very sorry. It seems that an error occurred in Sup. Please
+accept our sincere apologies. Please submit the contents of
 #{BASE_DIR}/exception-log.txt and a brief report of the
-circumstances to http://masanjin.net/sup-bugs/ so that I might
-address this problem. Thank you!
+circumstances to https://github.com/sup-heliotrope/sup/issues so that 
+we might address this problem. Thank you!
 
 Sincerely,
-William
+The Sup Developers
 ----------------------------------------------------------------
 EOS
   Redwood::exceptions.each do |e, name|
diff --git a/bin/sup-cmd b/bin/sup-cmd
@@ -1,138 +0,0 @@
-#!/usr/bin/env ruby
-require 'rubygems'
-require 'trollop'
-require 'sup'
-require 'sup/client'
-require 'pp'
-require 'yaml'
-include Redwood
-
-SUB_COMMANDS = %w(query count label add)
-global_opts = Trollop::options do
-  #version = "sup-cmd (sup #{Redwood::VERSION})"
-  banner <<EOS
-Connect to a running sup-server.
-
-Usage:
-  sup-cmd [global options] command [options]
-
-  Valid commands: #{SUB_COMMANDS * ', '}
-
-  Global options:
-EOS
-
-  opt :host, "server address", :type => :string, :default => 'localhost', :short => 'o'
-  opt :port, "server port", :type => :int, :default => 4300
-  opt :socket, "unix domain socket path", :type => :string, :default => nil
-  opt :verbose
-
-  conflicts :host, :socket
-  conflicts :port, :socket
-
-  stop_on SUB_COMMANDS
-end
-
-cmd = ARGV.shift
-cmd_opts = case cmd
-when "query"
-  Trollop.options do
-    opt :offset, "Offset", :default => 0, :type => :int
-    opt :limit, "Limit", :type => :int
-    opt :raw, "Retrieve raw message text", :default => false
-  end
-when "count"
-  Trollop.options do
-  end
-when "label"
-  Trollop.options do
-    opt :add_labels, "Labels to add", :default => ""
-    opt :remove_labels, "Labels to remove", :default => ""
-  end
-when "add"
-  Trollop.options do
-    opt :labels, "Labels separated by commas", :default => ""
-    opt :mbox, "Treat input files as mboxes", :default => false
-  end
-else
-  Trollop::die "unrecognized command #{cmd.inspect}"
-end
-
-class SupCmd < Redwood::Client
-  def initialize cmd, args, opts
-    @cmd = cmd
-    @opts = opts
-    @args = args
-    super()
-  end
-
-  def get_query
-    @args.first or fail "query argument required"
-  end
-
-  def connection_established
-    case @cmd
-    when "query"
-      query get_query, @opts[:offset], @opts[:limit], @opts[:raw] do |result|
-        if result
-          puts YAML.dump(result['summary'])
-          puts YAML.dump(result['raw']) if @opts[:raw]
-        else
-          close_connection
-        end
-      end
-    when "count"
-      count(get_query) do |x|
-        puts x
-        close_connection
-      end
-    when "label"
-      label get_query, @opts[:remove_labels].split(','), @opts[:add_labels].split(',') do
-        close_connection
-      end
-    when "add"
-      ARGF.binmode
-      labels = @opts[:labels].split(',')
-      get_message = lambda do
-        return ARGF.gets(nil) unless @opts[:mbox]
-        str = ""
-        l = ARGF.gets
-        str << l until ARGF.closed? || ARGF.eof? || MBox::is_break_line?(l = ARGF.gets)
-        str.empty? ? nil : str
-      end
-      i_s = i = 0
-      t = Time.now
-      while raw = get_message[]
-        i += 1
-        t_d = Time.now - t
-        if t_d >= 5
-          i_d = i - i_s
-          puts "indexed #{i} messages (#{i_d/t_d} m/s)" if global_opts[:verbose]
-          t = Time.now
-          i_s = i
-        end
-        add raw, labels do
-          close_connection
-        end
-      end
-    else
-      fail "#{@cmd} command unimplemented"
-      close_connection
-    end
-  end
-
-  def unbind
-    EM.stop
-  end
-end
-
-
-EM.run do
-  if global_opts[:socket]
-    EM.connect global_opts[:socket], SupCmd, cmd, ARGV, cmd_opts.merge(global_opts)
-  else
-    EM.connect global_opts[:host], global_opts[:port], SupCmd, cmd, ARGV, cmd_opts.merge(global_opts)
-  end
-end
-
-exit 0
-
diff --git a/bin/sup-config b/bin/sup-config
@@ -2,7 +2,6 @@
 
 require 'rubygems'
 require 'highline/import'
-require 'yaml'
 require 'trollop'
 require "sup"
 
@@ -25,7 +24,7 @@ def axe q, default=nil
   else
     ask "#{q}: "
   end
-  ans.empty? ? default : ans
+  ans.empty? ? default : ans.to_s
 end
 
 def axe_yes q, default="n"
diff --git a/bin/sup-server b/bin/sup-server
@@ -1,44 +0,0 @@
-#!/usr/bin/env ruby
-require 'rubygems'
-require 'trollop'
-require 'sup'
-require 'sup/server'
-require 'pp'
-require 'yaml'
-include Redwood
-
-global_opts = Trollop::options do
-  #version = "sup-cmd (sup #{Redwood::VERSION})"
-  banner <<EOS
-Interact with a Sup index.
-
-Usage:
-  sup-server [options]
-EOS
-
-  opt :host, "address to listen on", :type => :string, :default => 'localhost', :short => 'o'
-  opt :port, "port to listen on", :type => :int, :default => 4300
-  opt :verbose
-end
-
-Redwood.start
-Index.init
-Index.lock_interactively or exit
-begin
-  if(s = Redwood::SourceManager.source_for SentManager.source_uri)
-    SentManager.source = s
-  else
-    Redwood::SourceManager.add_source SentManager.default_source
-  end
-
-  Index.load
-
-  EM.run do
-    EM.start_server global_opts[:host], global_opts[:port],
-                    Redwood::Server, Index.instance
-    EM.next_tick { puts "ready" }
-  end
-
-ensure
-  Index.unlock
-end
diff --git a/bugs/issue-0240b36671ecb019e57ef27e0901bff055385371.yaml b/bugs/issue-0240b36671ecb019e57ef27e0901bff055385371.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: messages with unparseable date headers are being discarded entirely
-desc: it's better to forge the date headers and keep the messages
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 03:57:25.399978 Z
-references: []
-
-id: 0240b36671ecb019e57ef27e0901bff055385371
-log_events: 
-- - 2008-03-07 03:57:25.400014 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:57:29.249827 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-08d6bae05fa885bf6fcae39f864eb923c1e9a79e.yaml b/bugs/issue-08d6bae05fa885bf6fcae39f864eb923c1e9a79e.yaml
@@ -1,27 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: reply-from hook
-desc: "hook for setting the from: address of a reply programmatically"
-type: :feature
-component: hooks
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-06-19 17:58:26.142289 Z
-references: []
-
-id: 08d6bae05fa885bf6fcae39f864eb923c1e9a79e
-log_events: 
-- - 2008-06-19 17:58:27.334371 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-06-19 17:58:40.526270 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch reply-from-hook, merged into next
-- - 2008-07-30 23:41:56.898257 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed with disposition fixed
-  - merged into master
-git_branch: reply-from-hook
diff --git a/bugs/issue-09479a2ada22c2a0d76427e12ef2514d4753d070.yaml b/bugs/issue-09479a2ada22c2a0d76427e12ef2514d4753d070.yaml
@@ -1,18 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: forwarded messages should be threaded under original
-desc: ""
-type: :feature
-component: threading
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-06-07 23:45:11.606455 Z
-references: []
-
-id: 09479a2ada22c2a0d76427e12ef2514d4753d070
-log_events: 
-- - 2008-06-07 23:45:12.746568 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-15738247f939d20f8f202f80ccb85d9ad92101e0.yaml b/bugs/issue-15738247f939d20f8f202f80ccb85d9ad92101e0.yaml
@@ -1,18 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: command to reload hooks
-desc: useful for debugging hooks without having to restart sup each time
-type: :feature
-component: hooks
-release: 
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-09 06:09:46.127686 Z
-references: []
-
-id: 15738247f939d20f8f202f80ccb85d9ad92101e0
-log_events: 
-- - 2008-05-09 06:09:46.803222 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-182841e15d6909892adf43678bae03597ce10519.yaml b/bugs/issue-182841e15d6909892adf43678bae03597ce10519.yaml
@@ -1,25 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: external mime viewing logic not quite right
-desc: |-
-  weird things happen depending on the specifics on whether you have
-  certain binaries in your path, or you implement the mime-view hook,
-  you can get very weird behavior
-type: :bugfix
-component: hooks
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:05:53.956188 Z
-references: []
-
-id: 182841e15d6909892adf43678bae03597ce10519
-log_events: 
-- - 2008-03-07 04:05:53.956222 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:06:02.239869 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-1a1527438c2d198eae9a264ce9e6b847854d9837.yaml b/bugs/issue-1a1527438c2d198eae9a264ce9e6b847854d9837.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: attachment name searchability
-desc: ""
-type: :feature
-component: indexing
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-25 03:53:44.524558 Z
-references: []
-
-id: 1a1527438c2d198eae9a264ce9e6b847854d9837
-log_events: 
-- - 2008-05-25 03:53:45.177580 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-05-25 03:54:05.978412 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch attachments, merged into next
-- - 2008-05-31 17:09:04.254381 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - commented
-  - see {issue 65506670167642cc581956bc1b25c26b5bff215b} and {issue 7a68c1e7120a8540c7c51c6095f4815918d16641}
-- - 2008-06-19 18:20:41.656527 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-2312263b6a2b7de6ae1ec4ab315c7829763e61be.yaml b/bugs/issue-2312263b6a2b7de6ae1ec4ab315c7829763e61be.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: sup-sync-back "nothing to do" error message not informative
-desc: should tell the user that one of the four magic options are required
-type: :bugfix
-component: sup-sync-back
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 03:37:41.693484 Z
-references: []
-
-id: 2312263b6a2b7de6ae1ec4ab315c7829763e61be
-log_events: 
-- - 2008-03-07 03:37:41.693520 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:37:46.110644 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-23658477a445c2e61405fecb4cb641a2298caba6.yaml b/bugs/issue-23658477a445c2e61405fecb4cb641a2298caba6.yaml
@@ -1,27 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: wide character ncurses support
-desc: ""
-type: :feature
-component: curses
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :in_progress
-disposition: 
-creation_time: 2008-04-22 22:43:23.153185 Z
-references: []
-
-id: 23658477a445c2e61405fecb4cb641a2298caba6
-log_events: 
-- - 2008-04-22 22:43:24.808717 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-22 22:45:52.511820 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - |-
-    Branch 'ncurses-widechar' has been merged into next.
-    
-    Branch "ncursesw" now has a copy of the ncurses 0.9.2 gem with wide character
-    modifications, and a script "run-this-for-sup.sh" to build and install it
-    (assuming you're running from git, of course.)
diff --git a/bugs/issue-2673f091c15dd90222a59621a1842d4ef0a743f7.yaml b/bugs/issue-2673f091c15dd90222a59621a1842d4ef0a743f7.yaml
@@ -1,19 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: make sup-sync-back work on IMAP folders
-desc: ""
-type: :feature
-component: sup-sync-back
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-10-14 01:14:08.690909 Z
-references: []
-
-id: 2673f091c15dd90222a59621a1842d4ef0a743f7
-log_events: 
-- - 2008-10-14 01:14:09.898338 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-git_branch: 
diff --git a/bugs/issue-2a0363cdf9d25edfa2a04b21299a538365e8b319.yaml b/bugs/issue-2a0363cdf9d25edfa2a04b21299a538365e8b319.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: gpg mode hook
-desc: |-
-  need a hook for controlling the default setting of the gpg mode (none,
-  sign, sign & encrypt) in reply-mode, based on the gpg mode of the original
-  message.
-type: :feature
-component: hooks
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 02:42:29.391022 Z
-references: []
-
-id: 2a0363cdf9d25edfa2a04b21299a538365e8b319
-log_events: 
-- - 2008-03-07 02:42:29.391058 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-20 21:18:14.263736 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - assigned to release 0.6 from 0.5
-  - ""
-- - 2008-07-31 00:54:02.960978 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-git_branch: 
diff --git a/bugs/issue-2e74aa6843feee4daefe740b6e3f1fc54ff4bfcb.yaml b/bugs/issue-2e74aa6843feee4daefe740b6e3f1fc54ff4bfcb.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: oldest-first thread ordering
-desc: ""
-type: :feature
-component: indexing
-release: 
-reporter: Matt Liggett <mml@pobox.com>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-14 18:33:01.603318 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-March/001271.html
-id: 2e74aa6843feee4daefe740b6e3f1fc54ff4bfcb
-log_events: 
-- - 2008-03-14 18:33:01.603569 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-14 18:33:31.116057 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
diff --git a/bugs/issue-314f0cdac8d1998c46759a4ebef9077999bcef09.yaml b/bugs/issue-314f0cdac8d1998c46759a4ebef9077999bcef09.yaml
@@ -1,18 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: new user welcome screen the first time you start up
-desc: ""
-type: :feature
-component: curses
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 02:44:24.399133 Z
-references: []
-
-id: 314f0cdac8d1998c46759a4ebef9077999bcef09
-log_events: 
-- - 2008-03-07 02:44:24.399167 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-3408c200a5f47f92d12b5c063a00ce891c2ba4ce.yaml b/bugs/issue-3408c200a5f47f92d12b5c063a00ce891c2ba4ce.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: "email header parsing: space doesn't need to follow colon"
-desc: ""
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:31:55.733379 Z
-references: []
-
-id: 3408c200a5f47f92d12b5c063a00ce891c2ba4ce
-log_events: 
-- - 2008-03-07 04:31:55.733416 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:31:59.580856 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-3441fb8b7f955d625633d06fa0bf67a9afab046e.yaml b/bugs/issue-3441fb8b7f955d625633d06fa0bf67a9afab046e.yaml
@@ -1,18 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: saving a message as a draft drops attachments
-desc: ""
-type: :bugfix
-component: sup
-release: 
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-25 02:14:13.362087 Z
-references: []
-
-id: 3441fb8b7f955d625633d06fa0bf67a9afab046e
-log_events: 
-- - 2008-05-25 02:14:14.224040 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-38d6f805b0c8bad013ec73f56e6245c890528591.yaml b/bugs/issue-38d6f805b0c8bad013ec73f56e6245c890528591.yaml
@@ -1,29 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: "'m' in edit-message-mode should prompt for a to: with a default"
-desc: |-
-  the current behavior is to just go ahead and compose the message, which
-  is irritating if you're just trying to compose a message incidental to
-  having highlighted someone's email address.
-type: :bugfix
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-03-07 02:37:38.905689 Z
-references: []
-
-id: 38d6f805b0c8bad013ec73f56e6245c890528591
-log_events: 
-- - 2008-03-07 02:37:38.905723 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-20 21:44:06.473431 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - assigned to release 0.6 from 0.5
-  - ""
-- - 2008-05-25 03:47:42.600153 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - fixed in master
diff --git a/bugs/issue-3b25f1d56b9be533edaf232b9e60dc24e00cba0b.yaml b/bugs/issue-3b25f1d56b9be533edaf232b9e60dc24e00cba0b.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: maildir speedups
-desc: caching mtimes, using dir mtimes as an upper bound on file mtimes
-type: :feature
-component: maildir
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-25 02:30:42.010965 Z
-references: []
-
-id: 3b25f1d56b9be533edaf232b9e60dc24e00cba0b
-log_events: 
-- - 2008-05-25 02:30:42.815974 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-05-25 02:30:59.062438 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch maildir-speedups. merged into next.
-- - 2008-06-19 18:09:27.239553 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-42ab0840f9a1924f1c0561e8ddcf7e6988543ba0.yaml b/bugs/issue-42ab0840f9a1924f1c0561e8ddcf7e6988543ba0.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: query normalization breaking disjunctive queries, date modifers, etc
-desc: ""
-type: :bugfix
-component: indexing
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-03-07 03:39:26.683059 Z
-references: []
-
-id: 42ab0840f9a1924f1c0561e8ddcf7e6988543ba0
-log_events: 
-- - 2008-03-07 03:39:26.683093 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:50:16.796313 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - ""
-- - 2008-04-20 22:10:39.075075 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-46df983ccdb75408a37b3911472d4015664a3cf6.yaml b/bugs/issue-46df983ccdb75408a37b3911472d4015664a3cf6.yaml
@@ -1,20 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: curses interface generally sluggish
-desc: |-
-  moving cursors around, etc is sluggish. should be faster. will require
-  profiling. might require dipping into the C level.
-type: :bugfix
-component: curses
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-19 23:38:35.608104 Z
-references: []
-
-id: 46df983ccdb75408a37b3911472d4015664a3cf6
-log_events: 
-- - 2008-05-19 23:38:36.229747 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-47aab6443b6c107c3067cdb614186099db570acf.yaml b/bugs/issue-47aab6443b6c107c3067cdb614186099db570acf.yaml
@@ -1,37 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: before-add-hook not applied to sent messages
-desc: |-
-  they're not being polled in the regular way but in a vestigal irregular
-  way
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 03:54:10.773413 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-March/001259.html
-- http://rubyforge.org/pipermail/sup-talk/2008-February/001203.html
-id: 47aab6443b6c107c3067cdb614186099db570acf
-log_events: 
-- - 2008-03-07 03:54:10.773449 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:54:15.699906 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - ""
-- - 2008-03-08 22:02:45.840451 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from in_progress to fixed
-  - merged down to master.
-- - 2008-03-08 22:16:00.346710 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
-- - 2008-03-08 22:22:02.528552 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 2
-  - ""
diff --git a/bugs/issue-4af242013994ae557e431ba350a92c4f9e1739ef.yaml b/bugs/issue-4af242013994ae557e431ba350a92c4f9e1739ef.yaml
@@ -1,28 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: sup-sync shouldn't save the index and sources if an error occurred
-desc: |-
-  If the error was caused by a particular message, saving the source file
-  will move the pointer past the message, so it will never get added.
-type: :bugfix
-component: sup-sync
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:14:07.913103 Z
-references: []
-
-id: 4af242013994ae557e431ba350a92c4f9e1739ef
-log_events: 
-- - 2008-03-07 04:14:07.913140 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:14:12.599051 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
-- - 2008-03-09 18:29:51.789364 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed description
-  - ""
diff --git a/bugs/issue-4daa2721dac8dfeb8730ee081f73b6c62702bd3e.yaml b/bugs/issue-4daa2721dac8dfeb8730ee081f73b6c62702bd3e.yaml
@@ -1,23 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: last message of every source is returned twice during polling
-desc: http://rubyforge.org/pipermail/sup-talk/2008-April/001358.html
-type: :bugfix
-component: sup
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-01 01:11:50.650800 Z
-references: []
-
-id: 4daa2721dac8dfeb8730ee081f73b6c62702bd3e
-log_events: 
-- - 2008-05-01 01:11:51.434589 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-07-31 00:54:39.589377 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-git_branch: 
diff --git a/bugs/issue-4e501973cea5bd1f28739ae4cea98edce8249895.yaml b/bugs/issue-4e501973cea5bd1f28739ae4cea98edce8249895.yaml
@@ -1,32 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: thread joining is not preserved when reindexing
-desc: |
-  the current thread joining just adds references to the index entries. that's
-  fine but if the messages are reindexed, the references obviously won't be
-  there.
-  i think we need to add some separate blob of information somewhere that
-  maintains these references, which sup-sync is aware of.
-  
-  if we're going down the bdb route for state preservation, that might be an
-  obvious place to put this too, because it's essentially a hashtable keyed on
-  message ids.
-
-type: :bugfix
-component: indexing
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-14 18:39:59.697902 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-March/001270.html
-id: 4e501973cea5bd1f28739ae4cea98edce8249895
-log_events: 
-- - 2008-03-14 18:39:59.698163 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-14 18:40:26.559418 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
diff --git a/bugs/issue-5348fec2b1112250e241afc7467de29e5691d1be.yaml b/bugs/issue-5348fec2b1112250e241afc7467de29e5691d1be.yaml
@@ -1,21 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: imap header caching
-desc: |-
-  imap headers aren't cached at all. that would speed up the initial
-  connection, at least for servers that didn't set uid_validity to
-  the current time (blearf).
-type: :feature
-component: imap
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 04:26:31.474463 Z
-references: []
-
-id: 5348fec2b1112250e241afc7467de29e5691d1be
-log_events: 
-- - 2008-03-07 04:26:31.474497 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-57668c69d0190d6e849309834d4ad1d215efa779.yaml b/bugs/issue-57668c69d0190d6e849309834d4ad1d215efa779.yaml
@@ -1,21 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: make sup-sync-back work on Maildir folders
-desc: |-
-  possibly we could abstract things entirely between mbox and maildir, but
-  it might just be easiest to have a sup-sync-back-maildir or a big if
-  statement.
-type: :feature
-component: sup-sync-back
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-06-12 19:24:51.772444 Z
-references: []
-
-id: 57668c69d0190d6e849309834d4ad1d215efa779
-log_events: 
-- - 2008-06-12 19:24:53.668373 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-5795c3c1b47e88f7261f57f31d33fe15ad08465d.yaml b/bugs/issue-5795c3c1b47e88f7261f57f31d33fe15ad08465d.yaml
@@ -1,20 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: flat (gmail-style) version of thread-view-mode
-desc: |-
-  make thread-view-mode show a flat, chronological list of messages
-  instead of a tree, based on some configuration variable.
-type: :feature
-component: curses
-release: 
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-25 02:38:06.098950 Z
-references: []
-
-id: 5795c3c1b47e88f7261f57f31d33fe15ad08465d
-log_events: 
-- - 2008-05-25 02:38:06.823848 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-5fab957dcd16f1da8962fe5b1f3a58d970315deb.yaml b/bugs/issue-5fab957dcd16f1da8962fe5b1f3a58d970315deb.yaml
@@ -1,24 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: extra-contact-addresses hook for lbdb (etc.) integration
-desc: |-
-  add an extra-contact-addresses hook for inserting addresses into the
-  tab-completion list for To:, Cc:, etc. entries.
-type: :feature
-component: hooks
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-20 20:43:06.972853 Z
-references: []
-
-id: 5fab957dcd16f1da8962fe5b1f3a58d970315deb
-log_events: 
-- - 2008-04-20 20:43:08.667355 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-20 20:43:20.678566 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-60d86dd32054533a6206f698033ec668af6a7574.yaml b/bugs/issue-60d86dd32054533a6206f698033ec668af6a7574.yaml
@@ -1,29 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: killed threads showing up in inbox-mode
-desc: this goddamn problem is recurring
-type: :bugfix
-component: indexing
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-25 19:28:51.369257 Z
-references: []
-
-id: 60d86dd32054533a6206f698033ec668af6a7574
-log_events: 
-- - 2008-04-25 19:28:52.476687 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-07-31 00:54:38.916308 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-- - 2008-11-21 14:23:17.566852 Z
-  - Nicolas Pouillard <nicolas.pouillard@gmail.com>
-  - closed with disposition fixed
-  - |-
-    Loading options was not given to load_thread_for_message in
-    ThreadIndexMode.add_or_unhide.
-git_branch: 
diff --git a/bugs/issue-61949ec83770b5d46f89eff21799968187012cce.yaml b/bugs/issue-61949ec83770b5d46f89eff21799968187012cce.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: \127 should be handled like backspace (it's the 70's all over again)
-desc: ""
-type: :bugfix
-component: curses
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:29:46.043812 Z
-references: []
-
-id: 61949ec83770b5d46f89eff21799968187012cce
-log_events: 
-- - 2008-03-07 04:29:46.043850 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:29:52.233706 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-65506670167642cc581956bc1b25c26b5bff215b.yaml b/bugs/issue-65506670167642cc581956bc1b25c26b5bff215b.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: attachment markers in thread-index-mode
-desc: show a little @ if the message has an attachment
-type: :feature
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-25 03:53:10.005404 Z
-references: []
-
-id: 65506670167642cc581956bc1b25c26b5bff215b
-log_events: 
-- - 2008-05-25 03:53:10.994290 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-05-25 03:53:26.388023 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch attachments, merged into next
-- - 2008-05-31 17:09:17.710631 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - commented
-  - see {issue 1a1527438c2d198eae9a264ce9e6b847854d9837} and {issue 7a68c1e7120a8540c7c51c6095f4815918d16641}
-- - 2008-06-19 18:20:33.912937 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-658389418b5f0038cc3e6bc20fd3fd1566eb7111.yaml b/bugs/issue-658389418b5f0038cc3e6bc20fd3fd1566eb7111.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: add a startup hook
-desc: ""
-type: :feature
-component: hooks
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-03-07 04:03:52.999956 Z
-references: []
-
-id: 658389418b5f0038cc3e6bc20fd3fd1566eb7111
-log_events: 
-- - 2008-03-07 04:03:52.999992 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:03:56.880347 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - ""
-- - 2008-04-20 20:45:20.047253 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-69f785cddcc6e09ef0a357151373b3aa923d5e3f.yaml b/bugs/issue-69f785cddcc6e09ef0a357151373b3aa923d5e3f.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: escape filenames in call to run-mailcap
-desc: otherwise, filenames with spaces don't work
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:10:43.771843 Z
-references: []
-
-id: 69f785cddcc6e09ef0a357151373b3aa923d5e3f
-log_events: 
-- - 2008-03-07 04:10:43.771878 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:10:48.789189 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-6c053cca2eb05af486a2d09c6772fd5bd0cca444.yaml b/bugs/issue-6c053cca2eb05af486a2d09c6772fd5bd0cca444.yaml
@@ -1,20 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: cache threading
-desc: |-
-  thread information should be cached so that it doesn't have to be
-  recomputed each time.
-type: :feature
-component: threading
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-19 23:39:19.716625 Z
-references: []
-
-id: 6c053cca2eb05af486a2d09c6772fd5bd0cca444
-log_events: 
-- - 2008-05-19 23:39:20.190260 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-6e0d634de74b2eb8297174ecd408b3810ba9351b.yaml b/bugs/issue-6e0d634de74b2eb8297174ecd408b3810ba9351b.yaml
@@ -1,24 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: imap connection sharing
-desc: |
-  current behavior is a separate connection for each folder, which is kinda
-  silly.
-  potentially want to still keep a separate connection for polling, but that
-  might be micro-optimization, especially given that the whole ruby imap
-  library seems quite slow.
-
-type: :feature
-component: imap
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 04:25:12.351934 Z
-references: []
-
-id: 6e0d634de74b2eb8297174ecd408b3810ba9351b
-log_events: 
-- - 2008-03-07 04:25:12.351966 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-6e7960514f66ee67da083bc7bb5632d5808fc607.yaml b/bugs/issue-6e7960514f66ee67da083bc7bb5632d5808fc607.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: "'!!' will load all threads in current search"
-desc: |-
-  can be dangerous, but sometimes you know there aren't a million and you
-  just want them all loaded, e.g. to apply some mass tagging operation.
-  with the cancel-search feature, can always be canceled if
-  onerous.
-type: :feature
-component: sup
-release: "0.5"
-reporter: Marcus Williams <marcus-sup@bar-coded.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:17:44.706909 Z
-references: []
-
-id: 6e7960514f66ee67da083bc7bb5632d5808fc607
-log_events: 
-- - 2008-03-07 04:17:44.706948 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:17:48.834972 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
-- - 2008-03-11 06:52:15.604233 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed description
-  - ""
diff --git a/bugs/issue-7456c2d8fbd5de4dac651f6f4e9756f577497e01.yaml b/bugs/issue-7456c2d8fbd5de4dac651f6f4e9756f577497e01.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: edit-as-new doesn't preserve replyto and references headers
-desc: ""
-type: :bugfix
-component: sup
-release: "0.6"
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-31 17:07:05.126884 Z
-references: []
-
-id: 7456c2d8fbd5de4dac651f6f4e9756f577497e01
-log_events: 
-- - 2008-05-31 17:07:07.008637 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
-- - 2008-05-31 17:07:22.611383 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - changed status from unstarted to in_progress
-  - in branch edit-as-new-fix, merged into next
-- - 2008-06-19 18:22:24.036557 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-76802330c4fdd091e8b1dd08dcc29ed432f003d4.yaml b/bugs/issue-76802330c4fdd091e8b1dd08dcc29ed432f003d4.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: in-buffer search always shifts the screen, even when unnecessary
-desc: ""
-type: :bugfix
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-01 22:34:01.983057 Z
-references: []
-
-id: 76802330c4fdd091e8b1dd08dcc29ed432f003d4
-log_events: 
-- - 2008-05-01 22:34:02.958758 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-05-01 22:34:24.254778 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch find-in-buffer-fix, merged into next
-- - 2008-05-25 04:19:45.168367 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-799771a6a435dcad66dc80e7e051d91d24d005b1.yaml b/bugs/issue-799771a6a435dcad66dc80e7e051d91d24d005b1.yaml
@@ -1,31 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: IMAP server restart crashes sup
-desc: |-
-  this very bizarre backtrace:
-  
-  --- SystemExit from thread: main
-  closed stream
-  /usr/lib/ruby/1.8/openssl/buffering.rb:237:in `select'
-  ./lib/sup/buffer.rb:31:in `nonblocking_getch'
-  bin/sup:227
-  
-  wtf?
-  
-  There's no reason that
-  nonblocking_getch would be calling the openssl stuff, and openssl's
-  buffering.rb doesn't mention select at all. Weird.
-type: :bugfix
-component: imap
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-19 23:17:32.271870 Z
-references: []
-
-id: 799771a6a435dcad66dc80e7e051d91d24d005b1
-log_events: 
-- - 2008-05-19 23:17:33.615525 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-7a68c1e7120a8540c7c51c6095f4815918d16641.yaml b/bugs/issue-7a68c1e7120a8540c7c51c6095f4815918d16641.yaml
@@ -1,28 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: attachment markers in thread-view-mode
-desc: |-
-  i'd like to see them in thread-view-mode as well
-  (c.f. {issue 65506670167642cc581956bc1b25c26b5bff215b} and {issue 1a1527438c2d198eae9a264ce9e6b847854d9837})
-type: :feature
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-31 17:08:28.081944 Z
-references: []
-
-id: 7a68c1e7120a8540c7c51c6095f4815918d16641
-log_events: 
-- - 2008-05-31 17:08:28.710190 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
-- - 2008-05-31 17:08:50.679595 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - changed status from unstarted to in_progress
-  - on branch attachments as well, remerged into next
-- - 2008-06-19 18:20:56.657318 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-7c77e757321c2639daea013824ad1a14099815b1.yaml b/bugs/issue-7c77e757321c2639daea013824ad1a14099815b1.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: in-buffer searches should move buffer horizontally when necessary
-desc: ""
-type: :feature
-component: curses
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-03-07 03:56:17.653639 Z
-references: []
-
-id: 7c77e757321c2639daea013824ad1a14099815b1
-log_events: 
-- - 2008-03-07 03:56:17.653674 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:56:21.870750 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - ""
-- - 2008-04-20 20:44:07.668281 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-7d8474dfeeefaa50151c3ce48bee6b686d36a216.yaml b/bugs/issue-7d8474dfeeefaa50151c3ce48bee6b686d36a216.yaml
@@ -1,29 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: reply-to mode hook
-desc: |-
-  need a hook for selecting the default setting of the reply-to
-  horizontal selector
-type: :feature
-component: hooks
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-06-04 03:04:10.253690 Z
-references: []
-
-id: 7d8474dfeeefaa50151c3ce48bee6b686d36a216
-log_events: 
-- - 2008-06-04 03:04:10.945071 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-06-04 03:04:21.284329 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch 'reply-to-hook', merged into next
-- - 2008-07-30 23:41:50.393799 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed with disposition fixed
-  - merged into master
-git_branch: reply-to-hook
diff --git a/bugs/issue-829b449c51fca9a39047d00fabc552cc110c69b2.yaml b/bugs/issue-829b449c51fca9a39047d00fabc552cc110c69b2.yaml
@@ -1,24 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: don't crash when people.txt is corrupted
-desc: |-
-  This was a debug check, but if Sup crashes when writing out people.txt,
-  this will prevent it from ever starting again!
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:07:56.208521 Z
-references: []
-
-id: 829b449c51fca9a39047d00fabc552cc110c69b2
-log_events: 
-- - 2008-03-07 04:07:56.208558 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:21:04.553157 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-82c80f6dc2ce7b10b9e8f503d68253ced0ee8a1b.yaml b/bugs/issue-82c80f6dc2ce7b10b9e8f503d68253ced0ee8a1b.yaml
@@ -1,24 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: gpg generates invalid signature when :edit_signature is on
-desc: |-
-  when :edit_signature is on and there's a signature, gpg signatures are invalid,
-  ccording to mutt and other clients. sup itself thinks they're fine.
-type: :bugfix
-component: crypto
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-19 21:19:23.267668 Z
-references: []
-
-id: 82c80f6dc2ce7b10b9e8f503d68253ced0ee8a1b
-log_events: 
-- - 2008-05-19 21:19:24.611826 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-05-19 21:19:49.649415 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - turns out it was a newline issue. patch directly applied to master.
diff --git a/bugs/issue-8a5cf9242ca60fa6c81091e425f734b4fb03e41a.yaml b/bugs/issue-8a5cf9242ca60fa6c81091e425f734b4fb03e41a.yaml
@@ -1,53 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: index speedup
-desc: |
-  I've just merged in a changeset that makes Sup store message body
-  content in the Ferret index. (They've always been indexed, but now
-  they're stored as well.) This means that changing the labels on a
-  message can be a copy operation of the previous Ferret document, rather
-  than requiring downloading and parsing the original message to create a
-  new Ferret document.
-  So, this should have two effects:
-  
-  1. The Ferret index size will expand by about 50%. Sorry.
-  2. Tweaking message labels should be much, much faster, since the
-  message no longer has to be downloaded from the source in order to
-  change the labels. If you've ever tried to label a large IMAP thread,
-  you no longer have to wait 5 minutes just to save. :)
-  
-  The index size increase is unfortunate, but it's something that has to
-  happen anyways if we want search-results-mode to have matching text in
-  the snippets, which is in the future TODO.
-  
-  The change was made in such a way that it's incrementally applied
-  whenever a message is saved or changed in the Ferret index. So, if you
-  want the above behavior on all messages immediately, you must do
-  sup-sync --all on a source (which will require downloading each
-  message). Otherwise, you will get the slow behavior (message body needs
-  to be downloaded from the source) the first time you save a message
-  after merging this change, and the fast behavior (no downloading
-  required) on all subsequent times.
-
-type: :feature
-component: indexing
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-03-07 02:48:23.885656 Z
-references: []
-
-id: 8a5cf9242ca60fa6c81091e425f734b4fb03e41a
-log_events: 
-- - 2008-03-07 02:48:23.885693 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 02:48:50.979828 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - ""
-- - 2008-04-20 22:10:33.970635 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-8aa7ea95f066fd0668452093b85903bd142905c9.yaml b/bugs/issue-8aa7ea95f066fd0668452093b85903bd142905c9.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: "'q' asks and 'Q' quits without asking"
-desc: ""
-type: :feature
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-20 03:25:17.109472 Z
-references: []
-
-id: 8aa7ea95f066fd0668452093b85903bd142905c9
-log_events: 
-- - 2008-05-20 03:25:19.265580 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
-- - 2008-05-25 02:13:32.219668 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - closed issue with disposition fixed
-  - fixed in master
-- - 2008-05-25 02:13:40.344453 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - assigned to release 0.6 from unassigned
-  - ""
diff --git a/bugs/issue-8c0e627c500f679badca28f60ba76998fd65d46a.yaml b/bugs/issue-8c0e627c500f679badca28f60ba76998fd65d46a.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: workaround for rubymail quoting bug in pgp MIME header
-desc: gpg MIME headers are being double-quoted due to a rubymail bug
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: Jan Spakula <teatime@gmx.com>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 03:35:36.731751 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-February/001222.html
-id: 8c0e627c500f679badca28f60ba76998fd65d46a
-log_events: 
-- - 2008-03-07 03:35:36.731787 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:36:24.938159 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
-- - 2008-03-08 22:22:59.515414 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
diff --git a/bugs/issue-8e825caee33a6ac144580bf44d0d3060ad162394.yaml b/bugs/issue-8e825caee33a6ac144580bf44d0d3060ad162394.yaml
@@ -1,21 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: From lines detected over-aggressively
-desc: |-
-  mbox lines starting with "From " should only be considered new-message
-  delimiters if they have a valid email address, date, etc.
-type: :bugfix
-component: mbox
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-11-10 03:56:07.002467 Z
-references: []
-
-id: 8e825caee33a6ac144580bf44d0d3060ad162394
-log_events: 
-- - 2008-11-10 03:56:07.002940 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-git_branch: 
diff --git a/bugs/issue-91e1549102c0bfa2c201476d9618f7d234d1a626.yaml b/bugs/issue-91e1549102c0bfa2c201476d9618f7d234d1a626.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: gpg should use exact match for email address
-desc: otherwise substring matches can select the wrong key
-type: :bugfix
-component: crypto
-release: "0.6"
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-25 02:15:58.006265 Z
-references: []
-
-id: 91e1549102c0bfa2c201476d9618f7d234d1a626
-log_events: 
-- - 2008-05-25 02:15:59.100203 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
-- - 2008-05-25 02:16:07.730483 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - closed issue with disposition fixed
-  - fixed in master
diff --git a/bugs/issue-9f7e28de46d74f7f1e445ae75ea4e230c7473374.yaml b/bugs/issue-9f7e28de46d74f7f1e445ae75ea4e230c7473374.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: threads with unsent draft messages are now shown in red
-desc: ""
-type: :feature
-component: curses
-release: "0.5"
-reporter: Nicolas Pouillard <nicolas.pouillard@gmail.com>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:30:53.909487 Z
-references: []
-
-id: 9f7e28de46d74f7f1e445ae75ea4e230c7473374
-log_events: 
-- - 2008-03-07 04:30:53.909522 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:31:03.704713 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-a1a3427de5e8d4f74c0620f99e97ed92d21e924c.yaml b/bugs/issue-a1a3427de5e8d4f74c0620f99e97ed92d21e924c.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: sup-config name guessing logic can generate nil and crash
-desc: ""
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: Jean-Hadrien CHABRAN <jh@chabran.fr>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-09 17:45:46.095924 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-March/001260.html
-id: a1a3427de5e8d4f74c0620f99e97ed92d21e924c
-log_events: 
-- - 2008-03-09 17:45:46.095961 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-09 17:46:21.702965 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
-- - 2008-03-09 17:46:45.446763 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed reporter
-  - ""
-- - 2008-03-09 17:47:06.797832 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - fixed in master
diff --git a/bugs/issue-a1e622dbae0e1841b4d9a376d419aed1d91460e0.yaml b/bugs/issue-a1e622dbae0e1841b4d9a376d419aed1d91460e0.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: non-ascii characters in message id need to be normalized
-desc: apparently this happens. in spam email, of course.
-type: :bugfix
-component: sup
-release: "0.6"
-reporter: William Morgan <wmorgan-ditz@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-11 23:04:01.078305 Z
-references: []
-
-id: a1e622dbae0e1841b4d9a376d419aed1d91460e0
-log_events: 
-- - 2008-05-11 23:04:01.677838 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - created
-  - ""
-- - 2008-05-11 23:21:40.281018 Z
-  - William Morgan <wmorgan-ditz@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch non-ascii-message-id, merged into next
-- - 2008-06-19 18:09:04.143173 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-a533480a30a18c3e823dbe20b759e1dcb32ca2b9.yaml b/bugs/issue-a533480a30a18c3e823dbe20b759e1dcb32ca2b9.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: forward/reply without saving in the editor drops all newlines
-desc: ""
-type: :bugfix
-component: sup
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-23 01:31:16.072859 Z
-references: []
-
-id: a533480a30a18c3e823dbe20b759e1dcb32ca2b9
-log_events: 
-- - 2008-04-23 01:31:16.640737 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-23 01:39:10.304801 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch unedited-newlines, merged into next
-- - 2008-05-25 04:22:44.178693 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-a68148169baa3838051f4bdb4c175e11cbf7f143.yaml b/bugs/issue-a68148169baa3838051f4bdb4c175e11cbf7f143.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: all ferret access needs to be wrapped in a mutex
-desc: |-
-  concurrent access breaks things. at least, that's what I *think* is
-  going on here.
-  
-  http://rubyforge.org/pipermail/sup-talk/2008-April/001333.html
-type: :bugfix
-component: indexing
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-01 01:09:39.706808 Z
-references: []
-
-id: a68148169baa3838051f4bdb4c175e11cbf7f143
-log_events: 
-- - 2008-05-01 01:09:40.747646 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-aae5ae6378afa9bd2a8e1b15d28ba7ccef867791.yaml b/bugs/issue-aae5ae6378afa9bd2a8e1b15d28ba7ccef867791.yaml
@@ -1,27 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: remove email->name mapping
-desc: it doesn't work and wouldn't buy that much even if it did
-type: :bugfix
-component: sup
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-05-19 23:42:25.910550 Z
-references: []
-
-id: aae5ae6378afa9bd2a8e1b15d28ba7ccef867791
-log_events: 
-- - 2008-05-19 23:42:26.490587 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-07-31 00:54:39.921596 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-- - 2008-11-22 16:31:27.450146 Z
-  - Nicolas Pouillard <nicolas.pouillard@gmail.com>
-  - closed with disposition fixed
-  - This mapping and the PersonManager are now removed.
-git_branch: 
diff --git a/bugs/issue-ad82aa00f4064fc7e1332cee0dae2c2ae95bb217.yaml b/bugs/issue-ad82aa00f4064fc7e1332cee0dae2c2ae95bb217.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: add more vi keys
-desc: ""
-type: :feature
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-26 22:23:43.675951 Z
-references: []
-
-id: ad82aa00f4064fc7e1332cee0dae2c2ae95bb217
-log_events: 
-- - 2008-04-26 22:23:44.484689 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-26 22:24:00.893661 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch more-vi-keys. in next.
-- - 2008-05-25 04:12:57.577438 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-b1f1579fd8350d8add15c5cb588169acfdc5ea24.yaml b/bugs/issue-b1f1579fd8350d8add15c5cb588169acfdc5ea24.yaml
@@ -1,29 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: offer to delete lockfile after trying to kill owner process
-desc: |-
-  often the lockfile points to a dead process, so repeatedly offering to kill
-  it isn't all that useful.
-type: :feature
-component: sup
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-04-14 01:25:59.111165 Z
-references: []
-
-id: b1f1579fd8350d8add15c5cb588169acfdc5ea24
-log_events: 
-- - 2008-04-14 01:26:00.135062 Z
-  - William Morgan <w@adap.tv>
-  - created
-  - ""
-- - 2008-05-19 23:40:28.102694 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - assigned to release 0.6 from unassigned
-  - ""
-- - 2008-07-31 00:54:38.573917 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-git_branch: 
diff --git a/bugs/issue-b80aa39ef3b8d33bd57e4988c55d89c7c0df5c96.yaml b/bugs/issue-b80aa39ef3b8d33bd57e4988c55d89c7c0df5c96.yaml
@@ -1,24 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: spurious messages appearing in inbox
-desc: |-
-  this is because ThreadSet is claiming that non-relevant videos are actually
-  relevant
-type: :bugfix
-component: indexing
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 03:55:29.353904 Z
-references: []
-
-id: b80aa39ef3b8d33bd57e4988c55d89c7c0df5c96
-log_events: 
-- - 2008-03-07 03:55:29.353940 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:55:34.495965 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-bc03bc702f41e6a9687b52d3e32db29132c0f65a.yaml b/bugs/issue-bc03bc702f41e6a9687b52d3e32db29132c0f65a.yaml
@@ -1,25 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: add a mark-as-spam hook
-desc: |-
-  a simple hook that triggers when a message is marked as spam, so that
-  users can trigger additional stuff.
-type: :feature
-component: hooks
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-07-31 00:50:51.282526 Z
-references: []
-
-id: bc03bc702f41e6a9687b52d3e32db29132c0f65a
-log_events: 
-- - 2008-07-31 00:50:52.114135 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-07-31 00:51:10.671706 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed with disposition fixed
-  - branch mark-as-spam-hook, merged into master
-git_branch: 
diff --git a/bugs/issue-bdd4415a9d4c8fd3602500111bf9268aa7c7c6a4.yaml b/bugs/issue-bdd4415a9d4c8fd3602500111bf9268aa7c7c6a4.yaml
@@ -1,27 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: configurable colors
-desc: All colors should be user-configurable.
-type: :feature
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-06-04 02:27:15.458560 Z
-references: []
-
-id: bdd4415a9d4c8fd3602500111bf9268aa7c7c6a4
-log_events: 
-- - 2008-06-04 02:27:16.721829 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-06-04 02:27:27.256556 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch 'colors', merged into next.
-- - 2008-07-30 23:41:33.553377 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed with disposition fixed
-  - merged into master
-git_branch: color
diff --git a/bugs/issue-bff2527210b3aacae2f74029e5856fed82f1689c.yaml b/bugs/issue-bff2527210b3aacae2f74029e5856fed82f1689c.yaml
@@ -1,33 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: wide characters break screen clearing
-desc: |-
-  if you look at a message with wide characters using the new wide-char-aware
-  ncurses library, there will often be snippets of the previous screen
-  immediately to the right of the end of the lines that have wide characters
-  in them.
-  
-  some kind of line length issue maybe? (because everything is done in terms
-  of bytes still. thanks ruby!)
-type: :bugfix
-component: curses
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :wontfix
-creation_time: 2008-04-26 21:35:31.519359 Z
-references: []
-
-id: bff2527210b3aacae2f74029e5856fed82f1689c
-log_events: 
-- - 2008-04-26 21:35:32.384516 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-26 21:44:04.152193 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - depends on {issue 23658477a445c2e61405fecb4cb641a2298caba6} and that's not necessarily destined for 0.6 yet.
-- - 2008-04-28 02:36:51.698817 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition wontfix
-  - dup of {issue c48f7fc58bba0b38ff6ae14cca01b08a5a7a6c33}. you'd think i'd'a remembered.
diff --git a/bugs/issue-c48f7fc58bba0b38ff6ae14cca01b08a5a7a6c33.yaml b/bugs/issue-c48f7fc58bba0b38ff6ae14cca01b08a5a7a6c33.yaml
@@ -1,21 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: wide characters screw up line cursor display
-desc: |-
-  in a message with wide characters, the screen isn't cleared properly, or
-  something. probably due to the # of characters for something being calculated
-  wrong (bytes instead of chars).
-type: :bugfix
-component: curses
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-04-23 02:05:47.272610 Z
-references: []
-
-id: c48f7fc58bba0b38ff6ae14cca01b08a5a7a6c33
-log_events: 
-- - 2008-04-23 02:05:49.360399 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-c52f9762bc24a8f45863eb2e7beefa4201db34e8.yaml b/bugs/issue-c52f9762bc24a8f45863eb2e7beefa4201db34e8.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: add a --compose option to spawn a compose-message buffer on startup
-desc: ""
-type: :feature
-component: sup
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:28:32.198492 Z
-references: []
-
-id: c52f9762bc24a8f45863eb2e7beefa4201db34e8
-log_events: 
-- - 2008-03-07 04:28:32.198527 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:28:37.471873 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-c660ddfa9d633501140dd199bdfd7cd9fed5df0b.yaml b/bugs/issue-c660ddfa9d633501140dd199bdfd7cd9fed5df0b.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: ctrl-g should interrupt thread search operation
-desc: ""
-type: :feature
-component: sup
-release: "0.5"
-reporter: Marcus Williams <marcus-sup@bar-coded.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:15:47.155992 Z
-references: []
-
-id: c660ddfa9d633501140dd199bdfd7cd9fed5df0b
-log_events: 
-- - 2008-03-07 04:15:47.156031 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:15:52.274258 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-cef3096582de268c050f78223eb6a22ac2599606.yaml b/bugs/issue-cef3096582de268c050f78223eb6a22ac2599606.yaml
@@ -1,31 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: ruby 1.8.7 breaks sup in weird ways
-desc: |-
-  --- ArgumentError from thread: main
-  wrong number of arguments (2 for 1)
-  /home/benjamin/projects/sup/lib/sup/index.rb:422:in `respond_to?'
-  /home/benjamin/projects/sup/lib/sup/index.rb:422:in `flatten'
-  /home/benjamin/projects/sup/lib/sup/index.rb:422:in `load_sources'
-  /home/benjamin/projects/sup/lib/sup/index.rb:108:in `load'
-  /home/benjamin/projects/sup/lib/sup/util.rb:497:in `send'
-  /home/benjamin/projects/sup/lib/sup/util.rb:497:in `method_missing'
-  /home/benjamin/projects/sup/bin/sup:122
-type: :bugfix
-component: sup
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-06-04 17:39:39.013305 Z
-references: []
-
-id: cef3096582de268c050f78223eb6a22ac2599606
-log_events: 
-- - 2008-06-04 17:39:39.670176 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-06-19 17:57:46.648682 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - fixed directly in master
diff --git a/bugs/issue-cf09ec6ec7c35d7d8c002b0521f97b6e94dc9b3e.yaml b/bugs/issue-cf09ec6ec7c35d7d8c002b0521f97b6e94dc9b3e.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: invalid gecos can cause sup-config to crash
-desc: ""
-type: :bugfix
-component: sup
-release: "0.5"
-reporter: Jean-Hadrien CHABRAN <jh@chabran.fr>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-14 18:54:32.560987 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-March/001260.html
-id: cf09ec6ec7c35d7d8c002b0521f97b6e94dc9b3e
-log_events: 
-- - 2008-03-14 18:54:32.561241 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-14 18:54:52.486259 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
-- - 2008-03-14 18:55:10.323790 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-cfbfc65dc90280fa5ecc63094af01d2a47ff0c6e.yaml b/bugs/issue-cfbfc65dc90280fa5ecc63094af01d2a47ff0c6e.yaml
@@ -1,22 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: exception thrown when a forwarded attachment is not a known mime type
-desc: a minor typo
-type: :bugfix
-component: sup
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-23 01:23:06.368926 Z
-references: []
-
-id: cfbfc65dc90280fa5ecc63094af01d2a47ff0c6e
-log_events: 
-- - 2008-04-23 01:23:07.968757 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-23 01:23:14.995087 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - fixed in master
diff --git a/bugs/issue-d131464e921aefc35571c119aac4d9f1decdebae.yaml b/bugs/issue-d131464e921aefc35571c119aac4d9f1decdebae.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: blank message-id headers are treated as valid and crash indexing
-desc: |-
-  specifically, they trigger the "just added message to index" debug exception
-  because the id consists of nothing but spaces.
-  
-  header parsing needs to be fixed to not grab headers that are empty.
-type: :bugfix
-component: mbox
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-26 21:07:33.463910 Z
-references: []
-
-id: d131464e921aefc35571c119aac4d9f1decdebae
-log_events: 
-- - 2008-04-26 21:07:34.221325 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-26 21:41:55.731750 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch header-parsing-fix. merged into next.
-- - 2008-05-25 04:19:15.986573 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/issue-d994a360c9cb2a6e12a734962a39ffbc6486a725.yaml b/bugs/issue-d994a360c9cb2a6e12a734962a39ffbc6486a725.yaml
@@ -1,34 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: flags need a separate backup outside of the ferret index
-desc: |
-  Ferret still occasionally barfs and corrupts its own index. Currently all
-  user state is stored in the index and only in the index, so that means
-  you lose big-time if that happens. You can sup-dump your labels, but really,
-  how often are you going to do that.
-  Sup should maintain a separate backup of all labels in some fast on-disk
-  hashtable (message ids to label sets). Bdb comes to mind.
-
-type: :feature
-component: sup
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 04:22:50.236621 Z
-references: []
-
-id: d994a360c9cb2a6e12a734962a39ffbc6486a725
-log_events: 
-- - 2008-03-07 04:22:50.236657 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-20 21:44:51.655741 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - assigned to release 0.6 from 0.5
-  - ""
-- - 2008-07-31 00:54:37.881077 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-git_branch: 
diff --git a/bugs/issue-d9e6be1b524c6c0a5c31c9c468bda170c2a8cb58.yaml b/bugs/issue-d9e6be1b524c6c0a5c31c9c468bda170c2a8cb58.yaml
@@ -1,33 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: temp files disappear on sup crash
-desc: |-
-  because we're using the Tempfile library, Sup crashes mean that tempfiles
-  containing message bodies are lost. Sup needs to manage its own tempfiles.
-type: :bugfix
-component: sup
-release: 
-reporter: "Marko Myllym\xC3\xA4ki <marko.myllymaki@iki.fi>"
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 04:59:51.404664 Z
-references: 
-- http://rubyforge.org/pipermail/sup-talk/2008-February/001174.html
-id: d9e6be1b524c6c0a5c31c9c468bda170c2a8cb58
-log_events: 
-- - 2008-03-07 04:59:51.404701 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-11 06:20:47.540967 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - added reference 1
-  - ""
-- - 2008-04-20 21:45:00.615452 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - assigned to release 0.6 from 0.5
-  - ""
-- - 2008-07-31 00:54:38.222035 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-git_branch: 
diff --git a/bugs/issue-e24df153080c6e7a16335018b04d70d9381258b8.yaml b/bugs/issue-e24df153080c6e7a16335018b04d70d9381258b8.yaml
@@ -1,20 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: Pulling new threads should not shift the cursor.
-desc: |-
-  In thread-view-index, the selected thread should not change due to additions
-  of new threads.
-type: :bugfix
-component: curses
-release: 
-reporter: Nicolas Pouillard <nicolas.pouillard@gmail.com>
-status: :unstarted
-disposition: 
-creation_time: 2008-04-21 08:26:00.191881 Z
-references: []
-
-id: e24df153080c6e7a16335018b04d70d9381258b8
-log_events: 
-- - 2008-04-21 08:26:03.807376 Z
-  - Nicolas Pouillard <nicolas.pouillard@gmail.com>
-  - created
-  - ""
diff --git a/bugs/issue-e43b18777ea3aef3566bd80acd126e9ef8a5883a.yaml b/bugs/issue-e43b18777ea3aef3566bd80acd126e9ef8a5883a.yaml
@@ -1,34 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: long message ids (>255 characters) never get matched by ferret
-desc: |
-  this is a ferret bug.
-  Apparently, constructing a TermQuery object with a field value of more than
-  255 characters never successfully matches.
-  
-  This is not a good long-term solution. A good one would be to take the SHA1
-  of every message id instead. That will require an index rebuild, so I will
-  save that patch until later.
-
-type: :bugfix
-component: indexing
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-03-07 03:40:55.475449 Z
-references: []
-
-id: e43b18777ea3aef3566bd80acd126e9ef8a5883a
-log_events: 
-- - 2008-03-07 03:40:55.475485 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 03:50:18.590242 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - ""
-- - 2008-04-20 22:10:44.010446 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - ""
diff --git a/bugs/issue-e7739718b4dbf49bbd3dd47133affbf7cb1e2361.yaml b/bugs/issue-e7739718b4dbf49bbd3dd47133affbf7cb1e2361.yaml
@@ -1,24 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: "maildir speedup: don't scan directory except when polling"
-desc: |-
-  lots of useless scanning. removing it should make things faster for large
-  maildirs.
-type: :feature
-component: maildir
-release: "0.5"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: fixed
-creation_time: 2008-03-07 04:20:32.735159 Z
-references: []
-
-id: e7739718b4dbf49bbd3dd47133affbf7cb1e2361
-log_events: 
-- - 2008-03-07 04:20:32.735194 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-03-07 04:20:37.257919 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to fixed
-  - ""
diff --git a/bugs/issue-e9c2f66a7ff4fb4525c2719e77ac8eedf3835dfd.yaml b/bugs/issue-e9c2f66a7ff4fb4525c2719e77ac8eedf3835dfd.yaml
@@ -1,20 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: force hook reload feature
-desc: |-
-  would be nice for hook debugging. otherwise you have to restart sup
-  each time.
-type: :feature
-component: hooks
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-05-19 23:19:38.202269 Z
-references: []
-
-id: e9c2f66a7ff4fb4525c2719e77ac8eedf3835dfd
-log_events: 
-- - 2008-05-19 23:19:38.757600 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-f767a9d2071da7b0f66698ce74e642bf347be96b.yaml b/bugs/issue-f767a9d2071da7b0f66698ce74e642bf347be96b.yaml
@@ -1,21 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: mbox file handle closing
-desc: |-
-  currently an open file handle is maintained for every single mbox folder.
-  (well, every one that's accessed by polling or by opening a message therefrom.)
-  that is plum crazy.
-type: :feature
-component: mbox
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-03-07 04:27:35.146273 Z
-references: []
-
-id: f767a9d2071da7b0f66698ce74e642bf347be96b
-log_events: 
-- - 2008-03-07 04:27:35.146307 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
diff --git a/bugs/issue-fd7c7a7d7caf41ff20e7d10ca3f074fc02c14a5b.yaml b/bugs/issue-fd7c7a7d7caf41ff20e7d10ca3f074fc02c14a5b.yaml
@@ -1,30 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: thread joining doesn't always work
-desc: |
-  sometimes it works, and sometimes it doesn't, and i haven't found the
-  pattern yet.
-  
-  also, UpdateManager isn't being called properly (maybe even needs a
-  custom event). e.g. if you join in search-results-mode, the results
-  aren't joined in inbox-mode.
-
-type: :bugfix
-component: indexing
-release: 
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :unstarted
-disposition: 
-creation_time: 2008-04-29 00:09:38.366801 Z
-references: []
-
-id: fd7c7a7d7caf41ff20e7d10ca3f074fc02c14a5b
-log_events: 
-- - 2008-04-29 00:09:38.998592 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-07-31 00:54:39.251862 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - unassigned from release 0.6
-  - ""
-git_branch: 
diff --git a/bugs/issue-fdfc906e8f4f6eb10f1ebdf39c416415d9ab6af9.yaml b/bugs/issue-fdfc906e8f4f6eb10f1ebdf39c416415d9ab6af9.yaml
@@ -1,26 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/issue 
-title: archive-and-mark-read command in inbox-mode
-desc: ""
-type: :feature
-component: curses
-release: "0.6"
-reporter: William Morgan <wmorgan-sup@masanjin.net>
-status: :closed
-disposition: :fixed
-creation_time: 2008-04-26 23:32:53.791207 Z
-references: []
-
-id: fdfc906e8f4f6eb10f1ebdf39c416415d9ab6af9
-log_events: 
-- - 2008-04-26 23:32:57.083084 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - created
-  - ""
-- - 2008-04-26 23:33:12.980220 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - changed status from unstarted to in_progress
-  - branch read-and-archive. in next.
-- - 2008-05-25 04:14:48.307896 Z
-  - William Morgan <wmorgan-sup@masanjin.net>
-  - closed issue with disposition fixed
-  - merged into master
diff --git a/bugs/project.yaml b/bugs/project.yaml
@@ -1,53 +0,0 @@
---- !ditz.rubyforge.org,2008-03-06/project 
-name: sup
-version: 0.0.1
-components: 
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: sup
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: threading
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: indexing
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: curses
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: hooks
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: sup-sync
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: sup-sync-back
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: maildir
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: imap
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: mbox
-- !ditz.rubyforge.org,2008-03-06/component 
-  name: crypto
-releases: 
-- !ditz.rubyforge.org,2008-03-06/release 
-  name: "0.5"
-  status: :released
-  release_time: 2008-04-22 15:55:47.323776 Z
-  log_events: 
-  - - 2008-03-07 02:37:54.903172 Z
-    - William Morgan <wmorgan-sup@masanjin.net>
-    - created
-    - ""
-  - - 2008-04-22 15:55:47.323829 Z
-    - William Morgan <wmorgan-sup@masanjin.net>
-    - released
-    - ""
-- !ditz.rubyforge.org,2008-03-06/release 
-  name: "0.6"
-  status: :released
-  release_time: 2008-08-04 02:48:44.154676 Z
-  log_events: 
-  - - 2008-04-20 21:17:04.443432 Z
-    - William Morgan <wmorgan-sup@masanjin.net>
-    - created
-    - ""
-  - - 2008-08-04 02:48:44.154704 Z
-    - William Morgan <wmorgan-sup@masanjin.net>
-    - released
-    - ""
diff --git a/contrib/colorpicker.rb b/contrib/colorpicker.rb
@@ -1,10 +1,6 @@
 require 'rubygems'
 
-begin
-  require 'ncursesw'
-rescue LoadError
-  require 'ncurses'
-end
+require 'ncursesw'
 
 Ncurses.initscr
 Ncurses.noecho
diff --git a/lib/sup.rb b/lib/sup.rb
@@ -1,6 +1,11 @@
 require 'rubygems'
+
 require 'syck'
 require 'yaml'
+if YAML.const_defined? :ENGINE
+  YAML::ENGINE.yamler = 'syck'
+end
+
 require 'zlib'
 require 'thread'
 require 'fileutils'
@@ -39,8 +44,6 @@ class Module
 end
 
 module Redwood
-  VERSION = "git"
-
   BASE_DIR   = ENV["SUP_BASE"] || File.join(ENV["HOME"], ".sup")
   CONFIG_FN  = File.join(BASE_DIR, "config.yaml")
   COLOR_FN   = File.join(BASE_DIR, "colors.yaml")
@@ -285,7 +288,8 @@ EOS
       :poll_interval => 300,
       :wrap_width => 0,
       :slip_rows => 0,
-      :col_jump => 2
+      :col_jump => 2,
+      :stem_language => "english"
     }
     if File.exists? filename
       config = Redwood::load_yaml_obj filename
@@ -330,6 +334,7 @@ EOS
                   :load_config, :managers
 end
 
+require 'sup/version'
 require "sup/util"
 require "sup/hook"
 require "sup/time"
diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb
@@ -1,11 +1,7 @@
 require 'etc'
 require 'thread'
 
-begin
-  require 'ncursesw'
-rescue LoadError
-  require 'ncurses'
-end
+require 'ncursesw'
 
 if defined? Ncurses
 module Ncurses
diff --git a/lib/sup/client.rb b/lib/sup/client.rb
@@ -1,92 +0,0 @@
-require 'sup/protocol'
-
-module Redwood
-
-class Client < EM::P::RedwoodClient
-  def initialize *a
-    @next_tag = 1
-    @cbs = {}
-    super *a
-  end
-
-  def mktag &b
-    @next_tag.tap do |x|
-      @cbs[x] = b
-      @next_tag += 1
-    end
-  end
-
-  def rmtag tag
-    @cbs.delete tag
-  end
-
-  def query qstr, offset, limit, raw, &b
-    tag = mktag do |type,tag,args|
-      if type == 'message'
-        b.call args
-      else
-        fail unless type == 'done'
-        b.call nil
-        rmtag tag
-      end
-    end
-    send_message 'query', tag,
-                 'query' => qstr,
-                 'offset' => offset,
-                 'limit' => limit,
-                 'raw' => raw
-  end
-
-  def count qstr, &b
-    tag = mktag do |type,tag,args|
-      b.call args['count']
-      rmtag tag
-    end
-    send_message 'count', tag,
-                 'query' => qstr
-  end
-
-  def label qstr, add, remove, &b
-    tag = mktag do |type,tag,args|
-      b.call
-      rmtag tag
-    end
-    send_message 'label', tag,
-                 'query' => qstr,
-                 'add' => add,
-                 'remove' => remove
-  end
-
-  def add raw, labels, &b
-    tag = mktag do |type,tag,args|
-      b.call
-      rmtag tag
-    end
-    send_message 'add', tag,
-                 'raw' => raw,
-                 'labels' => labels
-  end
-
-  def thread msg_id, raw, &b
-    tag = mktag do |type,tag,args|
-      if type == 'message'
-        b.call args
-      else
-        fail unless type == 'done'
-        b.call nil
-        rmtag tag
-      end
-    end
-
-    send_message 'thread', tag,
-                 'message_id' => msg_id,
-                 'raw' => raw
-  end
-
-  def receive_message type, tag, args
-    cb = @cbs[tag] or fail "invalid tag #{tag.inspect}"
-    cb[type, tag, args]
-  end
-end
-
-end
diff --git a/lib/sup/contact.rb b/lib/sup/contact.rb
@@ -27,9 +27,10 @@ class ContactManager
   def contacts_with_aliases; @a2p.values.uniq end
 
   def update_alias person, aalias=nil
-    if(old_aalias = @p2a[person]) # remove old alias
+    old_aalias = @p2a[person]
+    if(old_aalias != nil and old_aalias != "") # remove old alias
       @a2p.delete old_aalias
-      @e2p.delete old_aalias.email
+      @e2p.delete person.email
     end
     @p2a[person] = aalias
     unless aalias.nil? || aalias.empty?
diff --git a/lib/sup/crypto.rb b/lib/sup/crypto.rb
@@ -1,4 +1,6 @@
 begin
+  # gpgme broke its API in 2.0, so make sure we have the old version for now.
+  gem 'gpgme', '=1.0.8'
   require 'gpgme'
 rescue LoadError
 end
@@ -39,6 +41,20 @@ from_key: the key that generated the signature (class is GPGME::Key)
 Return value: an array of lines of output
 EOS
 
+  HookManager.register "gpg-expand-keys", <<EOS
+Runs when the list of encryption recipients is created, allowing you to
+replace a recipient with one or more GPGME recipients. For example, you could
+replace the email address of a mailing list with the key IDs that belong to
+the recipients of that list. This is essentially what GPG groups do, which
+are not supported by GPGME.
+
+Variables:
+recipients: an array of recipients of the current email
+
+Return value: an array of recipients (email address or GPG key ID) to encrypt
+the email for
+EOS
+
   def initialize
     @mutex = Mutex.new
 
@@ -135,7 +151,7 @@ EOS
     gpg_opts = HookManager.run("gpg-options",
                                {:operation => "encrypt", :options => gpg_opts}) || gpg_opts
     recipients = to + [from]
-
+    recipients = HookManager.run("gpg-expand-keys", { :recipients => recipients }) || recipients
     begin
       cipher = GPGME.encrypt(recipients, format_payload(payload), gpg_opts)
     rescue GPGME::Error => exc
diff --git a/lib/sup/index.rb b/lib/sup/index.rb
@@ -25,7 +25,6 @@ module Redwood
 class Index
   include InteractiveLock
 
-  STEM_LANGUAGE = "english"
   INDEX_VERSION = '4'
 
   ## dates are converted to integers for xapian, and are used for document ids,
@@ -428,7 +427,7 @@ EOS
 
     qp = Xapian::QueryParser.new
     qp.database = @xapian
-    qp.stemmer = Xapian::Stem.new(STEM_LANGUAGE)
+    qp.stemmer = Xapian::Stem.new($config[:stem_language])
     qp.stemming_strategy = Xapian::QueryParser::STEM_SOME
     qp.default_op = Xapian::Query::OP_AND
     qp.add_valuerangeprocessor(Xapian::NumberValueRangeProcessor.new(DATE_VALUENO, 'date:', true))
@@ -804,7 +803,7 @@ class Xapian::Document
 
   def index_text text, prefix, weight=1
     term_generator = Xapian::TermGenerator.new
-    term_generator.stemmer = Xapian::Stem.new(Redwood::Index::STEM_LANGUAGE)
+    term_generator.stemmer = Xapian::Stem.new($config[:stem_language])
     term_generator.document = self
     term_generator.index_text text, weight, prefix
   end
diff --git a/lib/sup/message-chunks.rb b/lib/sup/message-chunks.rb
@@ -1,4 +1,5 @@
 require 'tempfile'
+require 'rbconfig'
 
 ## Here we define all the "chunks" that a message is parsed
 ## into. Chunks are used by ThreadViewMode to render a message. Chunks
@@ -146,7 +147,7 @@ EOS
     def initial_state; :open end
     def viewable?; @lines.nil? end
     def view_default! path
-      case Config::CONFIG['arch']
+      case RbConfig::CONFIG['arch']
         when /darwin/
           cmd = "open '#{path}'"
         else
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
@@ -615,7 +615,7 @@ private
         ## like ":a:a:a:a:a" that occurred in certain emails.
         if line =~ QUOTE_PATTERN || (line =~ /:$/ && line =~ /\w/ && nextline =~ QUOTE_PATTERN)
           newstate = :quote
-        elsif line =~ SIG_PATTERN && (lines.length - i) < MAX_SIG_DISTANCE
+        elsif line =~ SIG_PATTERN && (lines.length - i) < MAX_SIG_DISTANCE && !lines[(i+1)..-1].index { |l| l =~ /^-- $/ }
           newstate = :sig
         elsif line =~ BLOCK_QUOTE_PATTERN
           newstate = :block_quote
diff --git a/lib/sup/modes/edit-message-mode.rb b/lib/sup/modes/edit-message-mode.rb
@@ -93,7 +93,6 @@ EOS
     @header_lines = []
 
     @body = opts.delete(:body) || []
-    @body += sig_lines if $config[:edit_signature] && !opts.delete(:have_signature)
 
     if opts[:attachments]
       @attachments = opts[:attachments].values
@@ -112,10 +111,14 @@ EOS
 
     @message_id = "<#{Time.now.to_i}-sup-#{rand 10000}@#{hostname}>"
     @edited = false
+    @sig_edited = false
     @selectors = []
     @selector_label_width = 0
     @async_mode = nil
 
+    HookManager.run "before-edit", :header => @header, :body => @body
+
+    @account_selector = nil
     # only show account selector if there is more than one email address
     if $config[:account_selector] && AccountManager.user_emails.length > 1
       ## Duplicate e-mail strings to prevent a "can't modify frozen
@@ -144,7 +147,6 @@ EOS
       end
     add_selector @crypto_selector if @crypto_selector
 
-    HookManager.run "before-edit", :header => @header, :body => @body
     if @crypto_selector
       HookManager.run "crypto-mode", :header => @header, :body => @body, :crypto_selector => @crypto_selector
     end
@@ -185,14 +187,41 @@ EOS
   def edit_cc; edit_field "Cc" end
   def edit_subject; edit_field "Subject" end
 
-  def edit_message
-    old_from = @header["From"] if @account_selector
-
-    @file = Tempfile.new "sup.#{self.class.name.gsub(/.*::/, '').camel_to_hyphy}"
+  def save_message_to_file
+    sig = sig_lines.join("\n")
+    @file = Tempfile.new ["sup.#{self.class.name.gsub(/.*::/, '').camel_to_hyphy}", ".eml"]
     @file.puts format_headers(@header - NON_EDITABLE_HEADERS).first
     @file.puts
     @file.puts @body.join("\n")
+    @file.puts sig if ($config[:edit_signature] and !@sig_edited)
     @file.close
+  end
+
+  def set_sig_edit_flag
+    sig = sig_lines.join("\n")
+    if $config[:edit_signature]
+      pbody = @body.join("\n")
+      blen = pbody.length
+      slen = sig.length
+
+      if blen > slen and pbody[blen-slen..blen] == sig
+        @sig_edited = false
+        @body = pbody[0..blen-slen].split("\n")
+      else
+        @sig_edited = true
+      end
+    end
+  end
+
+  def edit_message
+    old_from = @header["From"] if @account_selector
+
+    begin
+      save_message_to_file
+    rescue SystemCallError => e
+      BufferManager.flash "Can't save message to file: #{e.message}"
+      return
+    end
 
     editor = $config[:editor] || ENV['EDITOR'] || "/usr/bin/vi"
 
@@ -204,6 +233,7 @@ EOS
 
     header, @body = parse_file @file.path
     @header = header - NON_EDITABLE_HEADERS
+    set_sig_edit_flag
 
     if @account_selector and @header["From"] != old_from
       @account_user = @header["From"]
@@ -218,11 +248,12 @@ EOS
   end
 
   def edit_message_async
-    @file = Tempfile.new ["sup.#{self.class.name.gsub(/.*::/, '').camel_to_hyphy}", ".eml"]
-    @file.puts format_headers(@header - NON_EDITABLE_HEADERS).first
-    @file.puts
-    @file.puts @body.join("\n")
-    @file.close
+    begin
+      save_message_to_file
+    rescue SystemCallError => e
+      BufferManager.flash "Can't save message to file: #{e.message}"
+      return
+    end
 
     @mtime = File.mtime @file.path
 
@@ -245,6 +276,7 @@ EOS
 
     header, @body = parse_file @file.path
     @header = header - NON_EDITABLE_HEADERS
+    set_sig_edit_flag
     handle_new_text @header, @body
     update
 
@@ -362,7 +394,7 @@ protected
   def regen_text
     header, @header_lines = format_headers(@header - NON_EDITABLE_HEADERS) + [""]
     @text = header + [""] + @body
-    @text += sig_lines unless $config[:edit_signature]
+    @text += sig_lines unless @sig_edited
 
     @attachment_lines_offset = 0
 
@@ -477,7 +509,7 @@ protected
     m = RMail::Message.new
     m.header["Content-Type"] = "text/plain; charset=#{$encoding}"
     m.body = @body.join("\n")
-    m.body += sig_lines.join("\n") unless $config[:edit_signature]
+    m.body += "\n" + sig_lines.join("\n") unless @sig_edited
     ## body must end in a newline or GPG signatures will be WRONG!
     m.body += "\n" unless m.body =~ /\n\Z/
 
diff --git a/lib/sup/modes/reply-mode.rb b/lib/sup/modes/reply-mode.rb
@@ -48,6 +48,7 @@ EOS
     ## the full headers (most importantly the list-post header, if
     ## any)
     body = reply_body_lines message
+    @body_orig = body
 
     ## first, determine the address at which we received this email. this will
     ## become our From: address in the reply.
@@ -97,14 +98,21 @@ EOS
     @headers = {}
     @headers[:recipient] = {
       "To" => cc.map { |p| p.full_address },
+      "Cc" => [],
     } if useful_recipient
 
     ## typically we don't want to have a reply-to-sender option if the sender
     ## is a user account. however, if the cc is empty, it's a message to
     ## ourselves, so for the lack of any other options, we'll add it.
-    @headers[:sender] = { "To" => [to.full_address], } if !AccountManager.is_account?(to) || !useful_recipient
+    @headers[:sender] = {
+      "To" => [to.full_address],
+      "Cc" => [],
+    } if !AccountManager.is_account?(to) || !useful_recipient
 
-    @headers[:user] = {}
+    @headers[:user] = {
+      "To" => [],
+      "Cc" => [],
+    }
 
     not_me_ccs = cc.select { |p| !AccountManager.is_account?(p) }
     @headers[:all] = {
@@ -114,22 +122,11 @@ EOS
 
     @headers[:list] = {
       "To" => [@m.list_address.full_address],
+      "Cc" => [],
     } if @m.is_list_message?
 
     refs = gen_references
 
-    @headers.each do |k, v|
-      @headers[k] = {
-               "From" => from.full_address,
-               "To" => [],
-               "Cc" => [],
-               "Bcc" => [],
-               "In-reply-to" => "<#{@m.id}>",
-               "Subject" => Message.reify_subj(@m.subj),
-               "References" => refs,
-             }.merge v
-    end
-
     types = REPLY_TYPES.select { |t| @headers.member?(t) }
     @type_selector = HorizontalSelector.new "Reply to:", types, types.map { |x| TYPE_DESCRIPTIONS[x] }
 
@@ -148,13 +145,17 @@ EOS
         :recipient
       end)
 
-    @bodies = {}
-    @headers.each do |k, v|
-      @bodies[k] = body
-      HookManager.run "before-edit", :header => v, :body => @bodies[k]
-    end
+    headers_full = {
+      "From" => from.full_address,
+      "Bcc" => [],
+      "In-reply-to" => "<#{@m.id}>",
+      "Subject" => Message.reify_subj(@m.subj),
+      "References" => refs,
+    }.merge @headers[@type_selector.val]
+
+    HookManager.run "before-edit", :header => headers_full, :body => body
 
-    super :header => @headers[@type_selector.val], :body => @bodies[@type_selector.val], :twiddles => false
+    super :header => headers_full, :body => body, :twiddles => false
     add_selector @type_selector
   end
 
@@ -163,8 +164,7 @@ protected
   def move_cursor_right
     super
     if @headers[@type_selector.val] != self.header
-      self.header = @headers[@type_selector.val]
-      self.body = @bodies[@type_selector.val] unless @edited
+      self.header = self.header.merge @headers[@type_selector.val]
       rerun_crypto_selector_hook
       update
     end
@@ -173,8 +173,7 @@ protected
   def move_cursor_left
     super
     if @headers[@type_selector.val] != self.header
-      self.header = @headers[@type_selector.val]
-      self.body = @bodies[@type_selector.val] unless @edited
+      self.header = self.header.merge @headers[@type_selector.val]
       rerun_crypto_selector_hook
       update
     end
@@ -192,14 +191,15 @@ protected
   end
 
   def handle_new_text new_header, new_body
-    if new_body != @bodies[@type_selector.val]
-      @bodies[@type_selector.val] = new_body
+    if new_body != @body_orig
+      @body_orig = new_body
       @edited = true
     end
     old_header = @headers[@type_selector.val]
-    if new_header.size != old_header.size || old_header.any? { |k, v| new_header[k] != v }
+    if old_header.any? { |k, v| new_header[k] != v }
       @type_selector.set_to :user
-      self.header = @headers[:user] = new_header
+      self.header["To"] = @headers[:user]["To"] = new_header["To"]
+      self.header["Cc"] = @headers[:user]["Cc"] = new_header["Cc"]
       update
     end
   end
@@ -210,8 +210,10 @@ protected
 
   def edit_field field
     edited_field = super
-    if edited_field && edited_field != "Subject"
+    if edited_field and (field == "To" or field == "Cc")
       @type_selector.set_to :user
+      @headers[:user]["To"] = self.header["To"]
+      @headers[:user]["Cc"] = self.header["Cc"]
       update
     end
   end
diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
@@ -846,7 +846,7 @@ private
       else
         width = buffer.content_width
       end
-      lines = lines.map { |l| l.chomp.wrap width }.flatten
+      lines = lines.map { |l| l.chomp.wrap width if l }.flatten
     end
     return lines
   end
diff --git a/lib/sup/protocol.rb b/lib/sup/protocol.rb
@@ -1,161 +0,0 @@
-require 'eventmachine'
-require 'socket'
-require 'stringio'
-require 'yajl'
-
-class EM::P::Redwood < EM::Connection
-  VERSION = 1
-  ENCODINGS = %w(marshal json)
-
-  attr_reader :debug
-
-  def initialize *args
-    @state = :negotiating
-    @version_buf = ""
-    @debug = false
-    super
-  end
-
-  def receive_data data
-    if @state == :negotiating
-      @version_buf << data
-      if i = @version_buf.index("\n")
-        l = @version_buf.slice!(0..i)
-        receive_version *parse_version(l.strip)
-        x = @version_buf
-        @version_buf = nil
-        @state = :established
-        connection_established
-        receive_data x
-      end
-    else
-      @filter.decode(data).each do |msg|
-        puts "#{self.class.name} received: #{msg.inspect}" if @debug
-        validate_message *msg
-        receive_message *msg
-      end
-    end
-  end
-
-  def connection_established
-  end
-
-  def send_version encodings, extensions
-    fail if encodings.empty?
-    send_data "Redwood #{VERSION} #{encodings * ','} #{extensions.empty? ? :none : (extensions * ',')}\n"
-  end
-
-  def send_message type, tag, params={}
-    fail "attempted to send message during negotiation" unless @state == :established
-    puts "#{self.class.name} sent: #{[type, tag, params].inspect}" if @debug
-    validate_message type, tag, params
-    send_data @filter.encode([type,tag,params])
-  end
-
-  def receive_version l
-    fail "unimplemented"
-  end
-
-  def receive_message type, tag, params
-    fail "unimplemented"
-  end
-
-private
-
-  def validate_message type, tag, params
-    fail unless type.is_a? String or type.is_a? Symbol
-    fail unless tag.is_a? String or tag.is_a? Integer
-    fail unless params.is_a? Hash
-  end
-
-  def parse_version l
-    l =~ /^Redwood\s+(\d+)\s+([\w,]+)\s+([\w,]+)$/ or fail "unexpected banner #{l.inspect}"
-    version, encodings, extensions = $1.to_i, $2, $3
-    encodings = encodings.split ','
-    extensions = extensions.split ','
-    extensions = [] if extensions == ['none']
-    fail unless version == VERSION
-    fail if encodings.empty?
-    [encodings, extensions]
-  end
-
-  def create_filter encoding
-    case encoding
-    when 'json' then JSONFilter.new
-    when 'marshal' then MarshalFilter.new
-    else fail "unknown encoding #{encoding.inspect}"
-    end
-  end
-
-  class JSONFilter
-    def initialize
-      @parser = Yajl::Parser.new :check_utf8 => false
-    end
-
-    def decode chunk
-      parsed = []
-      @parser.on_parse_complete = lambda { |o| parsed << o }
-      @parser << chunk
-      parsed
-    end
-
-    def encode *os
-      os.inject('') { |s, o| s << Yajl::Encoder.encode(o) }
-    end
-  end
-
-  class MarshalFilter
-    def initialize
-      @buf = ''
-      @state = :prefix
-      @size = 0
-    end
-
-    def decode chunk
-      received = []
-      @buf << chunk
-
-      begin
-        if @state == :prefix
-          break unless @buf.size >= 4
-          prefix = @buf.slice!(0...4)
-          @size = prefix.unpack('N')[0]
-          @state = :data
-        end
-
-        fail unless @state == :data
-        break if @buf.size < @size
-        received << Marshal.load(@buf.slice!(0...@size))
-        @state = :prefix
-      end until @buf.empty?
-
-      received
-    end
-
-    def encode o
-      data = Marshal.dump o
-      [data.size].pack('N') + data
-    end
-  end
-end
-
-class EM::P::RedwoodServer < EM::P::Redwood
-  def post_init
-    send_version ENCODINGS, []
-  end
-
-  def receive_version encodings, extensions
-    fail unless encodings.size == 1
-    fail unless ENCODINGS.member? encodings.first
-    @filter = create_filter encodings.first
-  end
-end
-
-class EM::P::RedwoodClient < EM::P::Redwood
-  def receive_version encodings, extensions
-    encoding = (ENCODINGS & encodings).first
-    fail unless encoding
-    @filter = create_filter encoding
-    send_version [encoding], []
-  end
-end
diff --git a/lib/sup/server.rb b/lib/sup/server.rb
@@ -1,116 +0,0 @@
-require 'sup/protocol'
-
-module Redwood
-
-class Server < EM::P::RedwoodServer
-  def initialize index
-    super
-    @index = index
-  end
-
-  def receive_message type, tag, params
-    if respond_to? :"request_#{type}"
-      send :"request_#{type}", tag, params
-    else
-      send_message 'error', tag, 'description' => "invalid request type #{type.inspect}"
-    end
-  end
-
-  def request_query tag, a
-    q = @index.parse_query a['query']
-    query q, a['offset'], a['limit'], a['raw'] do |r|
-      send_message 'message', tag, r
-    end
-    send_message 'done', tag
-  end
-
-  def request_count tag, a
-    q = @index.parse_query a['query']
-    c = count q
-    send_message 'count', tag, 'count' => c
-  end
-
-  def request_label tag, a
-    q = @index.parse_query a['query']
-    label q, a['add'], a['remove']
-    send_message 'done', tag
-  end
-
-  def request_add tag, a
-    add a['raw'], a['labels']
-    send_message 'done', tag
-  end
-
-  def request_thread tag, a
-    thread a['message_id'], a['raw'] do |r|
-      send_message 'message', tag, r
-    end
-    send_message 'done', tag
-  end
-
-private
-
-  def result_from_message m, raw
-    mkperson = lambda { |p| { :email => p.email, :name => p.name } }
-    {
-      'summary' => {
-        'message_id' => m.id,
-        'date' => m.date,
-        'from' => mkperson[m.from],
-        'to' => m.to.map(&mkperson),
-        'cc' => m.cc.map(&mkperson),
-        'bcc' => m.bcc.map(&mkperson),
-        'subject' => m.subj,
-        'refs' => m.refs,
-        'replytos' => m.replytos,
-        'labels' => m.labels.map(&:to_s),
-      },
-      'raw' => raw ? m.raw_message : nil,
-    }
-  end
-
-  def query query, offset, limit, raw
-    c = 0
-    @index.each_message query do |m|
-      next if c < offset
-      break if c >= offset + limit if limit
-      yield result_from_message(m, raw)
-      c += 1
-    end
-    nil
-  end
-
-  def count query
-    @index.num_results_for query
-  end
-
-  def label query, remove_labels, add_labels
-    @index.each_message query do |m|
-      remove_labels.each { |l| m.remove_label l }
-      add_labels.each { |l| m.add_label l }
-      @index.update_message_state m
-    end
-    nil
-  end
-
-  def add raw, labels
-    SentManager.source.store_message Time.now, "test@example.com" do |io|
-      io.write raw
-    end
-    PollManager.poll_from SentManager.source do |sym,m,old_m,progress|
-      next unless sym == :add
-      m.labels = labels
-    end
-    nil
-  end
-
-  def thread msg_id, raw
-    msg = @index.build_message msg_id
-    @index.each_message_in_thread_for msg do |id, builder|
-      m = builder.call
-      yield result_from_message(m, raw)
-    end
-  end
-end
-
-end
diff --git a/lib/sup/source.rb b/lib/sup/source.rb
@@ -160,7 +160,7 @@ module SerializeLabelsNicely
   end
 
   def after_unmarshal!
-    @labels = Set.new(@labels.map { |s| s.to_sym })
+    @labels = Set.new(@labels.to_a.map { |s| s.to_sym })
   end
 end
 
diff --git a/lib/sup/util.rb b/lib/sup/util.rb
@@ -5,6 +5,7 @@ require 'pathname'
 require 'set'
 require 'enumerator'
 require 'benchmark'
+require 'iconv'
 
 ## time for some monkeypatching!
 class Symbol
diff --git a/lib/sup/version.rb b/lib/sup/version.rb
@@ -0,0 +1,3 @@
+module Redwood
+  VERSION = "git"
+end
diff --git a/protocol.md b/protocol.md
@@ -1,168 +0,0 @@
-Redwood Protocol
-================
-
-The server begins by sending a line of the form `Redwood <ver> <encodings>
-<extensions>`, where `ver` is the major protocol version (1), encodings is a
-comma-separated list of supported message encodings (e.g. `json,bert,marshal`),
-and `extensions` is a comma-separated list of protocol extensions. The server
-must advertise at least one encoding. A zero-length list of extensions is
-represented by `none`. The client replies in the same format, with the
-restrictions that the protocol version must match, `encodings` and `extensions`
-must be subsets of what the server advertised, and there must be exactly 1
-encoding specified.
-
-Requests and responses are represented as `[type, params]`, where `type`
-is a lowercase string corresponding to one of the message types specified
-below and `params` is a dictionary with string keys.
-
-Requests
---------
-
-There may be zero or more replies to a request. Multiple requests may be
-issued concurrently. There is an implicit, optional, opaque `tag` parameter to
-every request which will be returned in all replies to the request to
-aid clients in keeping multiple requests in flight. `tag` may be an
-arbitrary datastructure and for the purposes of Cancel defaults to nil.
-
-### Query
-Send a Message response for each hit on `query` starting at `offset`
-and sending a maximum of `limit` Messages responses. `raw` controls
-whether the raw message text is included in the response.
-
-#### Parameters
-*   `query`: Query
-*   `offset`: int
-*   `limit`: int
-*   `raw`: boolean
-
-#### Responses
-*   multiple Message
-*   one Done after all Messages
-
-
-### Count
-Send a count reply with the number of hits for `query`.
-
-#### Parameters
-*   `query`: Query
-
-#### Responses
-*   one Count
-
-
-### Label
-Modify the labels on all messages matching `query`. First removes the
-labels in `remove` then adds those in `add`.
-
-#### Parameters
-*   `query`: Query
-*   `add`: string list
-*   `remove`: string list
-
-#### Responses
-*   one Done
-
-
-### Add
-Add a message to the database. `raw` is the normal RFC 2822 message text.
-
-#### Parameters
-*   `raw`: string
-*   `labels`: string list
-
-#### Responses
-*   one Done
-
-
-### Stream
-Sends a Message response whenever a new message that matches `query` is
-added with the Add request. This request will not terminate until a
-corresponding Cancel request is sent.
-
-#### Parameters
-*   `query`: Query
-
-#### Responses
-multiple Message
-
-
-### Cancel
-Cancels all active requests with tag `target`. This is only required to
-be implemented for the Stream request.
-
-#### Parameters
-*   `target`: string
-
-#### Responses
-one Done
-
-
-
-Responses
----------
-
-### Done
-Signifies that a request has completed successfully.
-
-
-### Message
-Represents a query result. If `raw` is present it is the raw message
-text that was previously a parameter to the Add request.
-
-#### Parameters
-*   `summary`: Summary
-*   `raw`: optional string
-
-
-### Count
-`count` is the number of messages matched.
-
-#### Parameters
-*   `count`: int
-
-
-### Error
-
-#### Parameters
-*   `type`: string
-*   `message`: string
-
-
-
-Datatypes
----------
-
-### Query
-Recursive prefix-notation datastructure describing a boolean condition.
-Where `a` and `b` are Queries and `field` and `value` are strings, a
-Query can be any of the following:
-
-*   `[:and, a, b, ...]`
-*   `[:or, a, b, ...]`
-*   `[:not, a, b]`
-*   `[:term, field, value]`
-
-
-### Summary
-*   `message_id`: string
-*   `date`: time
-*   `from`: Person
-*   `to`, `cc`, `bcc`: Person list
-*   `subject`: string
-*   `refs`: string list
-*   `replytos`: string list
-*   `labels`: string list
-
-
-### Person
-*   `name`: string
-*   `email`: string
-
-
-TODO
-----
-
-*   Protocol negotiation
-   -   Version
-   -   Compression (none, gzip, ...)
-*   Specify string encodings
diff --git a/sup-files.rb b/sup-files.rb
@@ -1,11 +0,0 @@
-SUP_LIB_DIRS = %w(lib lib/sup lib/sup/modes)
-SUP_EXECUTABLES = %w(sup sup-add sup-cmd sup-config sup-dump sup-import-dump sup-recover-sources sup-server sup-sync sup-sync-back sup-tweak-labels)
-SUP_EXTRA_FILES = %w(CONTRIBUTORS README.txt LICENSE History.txt ReleaseNotes)
-SUP_FILES =
-  SUP_EXTRA_FILES +
-  SUP_EXECUTABLES.map { |f| "bin/#{f}" } +
-  SUP_LIB_DIRS.map { |d| Dir["#{d}/*.rb"] }.flatten
-
-if $0 == __FILE__ # if executed from commandline
-  puts SUP_FILES
-end
diff --git a/sup-version.rb b/sup-version.rb
@@ -1,15 +0,0 @@
-## allow people who use development versions by running "rake gem"
-## and installing the resulting gem it to be able to do this. (gem
-## versions must be in dotted-digit notation only and can be passed
-## with the REL environment variable to "rake gem").
-SUP_VERSION = if ENV['REL']
-  ENV['REL']
-else
-  $:.unshift 'lib' # force loading from ./lib/ if it exists
-  require 'sup'
-  if Redwood::VERSION == "git"
-    "999"
-  else
-    Redwood::VERSION
-  end
-end
diff --git a/sup.gemspec b/sup.gemspec
@@ -0,0 +1,51 @@
+lib = File.expand_path("../lib", __FILE__)
+$:.unshift(lib) unless $:.include?(lib)
+
+require 'sup/version'
+
+# Files
+SUP_EXECUTABLES = %w(sup sup-add sup-config sup-dump sup-import-dump
+  sup-recover-sources sup-sync sup-sync-back sup-tweak-labels)
+SUP_EXTRA_FILES = %w(CONTRIBUTORS README.md LICENSE History.txt ReleaseNotes)
+SUP_FILES =
+  SUP_EXTRA_FILES +
+  SUP_EXECUTABLES.map { |f| "bin/#{f}" } +
+  Dir["lib/**/*.rb"]
+
+
+module Redwood
+  Gemspec = Gem::Specification.new do |s|
+    s.name = "sup"
+    s.version = ENV["REL"] || (::Redwood::VERSION == "git" ? "999" : ::Redwood::VERSION)
+    s.date = Time.now.strftime "%Y-%m-%d"
+    s.authors = ["William Morgan", "Gaute Hope", "Hamish Downer", "Matthieu Rakotojaona"]
+    s.email   = "sup-talk@rubyforge.org"
+    s.summary = "A console-based email client with the best features of GMail, mutt and Emacs"
+    s.homepage = "https://github.com/sup-heliotrope/sup/wiki"
+    s.description = <<-DESC
+      Sup is a console-based email client for people with a lot of email.
+
+      * GMail-like thread-centered archiving, tagging and muting
+      * Handling mail from multiple mbox and Maildir sources
+      * Blazing fast full-text search with a rich query language
+      * Multiple accounts - pick the right one when sending mail
+      * Ruby-programmable hooks
+      * Automatically tracking recent contacts
+DESC
+    s.license = 'GPL-2'
+    s.files = SUP_FILES
+    s.executables = SUP_EXECUTABLES
+
+    s.add_dependency "xapian-full-alaveteli", "~> 1.2"
+    s.add_dependency "ncursesw-sup", "~> 1.3", ">= 1.3.1"
+    s.add_dependency "rmail", ">= 0.17"
+    s.add_dependency "highline"
+    s.add_dependency "trollop", ">= 1.12"
+    s.add_dependency "lockfile"
+    s.add_dependency "mime-types", "~> 1"
+    s.add_dependency "gettext"
+
+    s.add_development_dependency "bundler", "~> 1.3"
+    s.add_development_dependency "rake"
+  end
+end
diff --git a/test/dummy_source.rb b/test/dummy_source.rb
@@ -12,7 +12,7 @@ class DummySource < Source
   attr_accessor :messages
 
   def initialize uri, last_date=nil, usual=true, archived=false, id=nil, labels=[]
-    super uri, last_date, usual, archived, id
+    super uri, usual, archived, id
     @messages = nil
   end
 
diff --git a/test/test_header_parsing.rb b/test/test_header_parsing.rb
@@ -7,10 +7,14 @@ require 'stringio'
 include Redwood
 
 class TestMBoxParsing < Test::Unit::TestCase
+
   def setup
+    @path = Dir.mktmpdir
+    @mbox = File.join(@path, 'test_mbox')
   end
 
   def teardown
+    FileUtils.rm_r @path
   end
 
   def test_normal_headers
@@ -106,7 +110,7 @@ EOS
   end
 
   def test_from_line_splitting
-    l = MBox.new StringIO.new(<<EOS)
+    l = MBox.new mbox_for_string(<<EOS)
 From sup-talk-bounces@rubyforge.org Mon Apr 27 12:56:18 2009
 From: Bob <bob@bob.com>
 To: a dear friend
@@ -125,14 +129,14 @@ From bob@bob.com
 
 This is the end of the email.
 EOS
-    offset, labels = l.next
-    assert_equal 0, offset
-    offset, labels = l.next
+    offset = l.next_offset 0
+    assert_equal 61, offset
+    offset = l.next_offset 61
     assert_nil offset
   end
 
   def test_more_from_line_splitting
-    l = MBox.new StringIO.new(<<EOS)
+    l = MBox.new mbox_for_string(<<EOS)
 From sup-talk-bounces@rubyforge.org Mon Apr 27 12:56:18 2009
 From: Bob <bob@bob.com>
 To: a dear friend
@@ -145,13 +149,20 @@ To: a dear friend
 
 Hello again! Would you like to buy my products?
 EOS
-    offset, labels = l.next
+    offset = l.next_offset 0
     assert_not_nil offset
 
-    offset, labels = l.next
+    offset = l.next_offset offset
     assert_not_nil offset
 
-    offset, labels = l.next
+    offset = l.next_offset offset
     assert_nil offset
   end
+
+  def mbox_for_string content
+    File.open(@mbox, 'w') do |f|
+      f.write content
+    end
+    "mbox://#{@mbox}"
+  end
 end
diff --git a/test/test_message.rb b/test/test_message.rb
@@ -29,9 +29,13 @@ module Redwood
 class TestMessage < Test::Unit::TestCase
 
   def setup
+    @path = Dir.mktmpdir
+    Redwood::HookManager.init File.join(@path, 'hooks')
   end
 
   def teardown
+    Redwood::HookManager.deinstantiate!
+    FileUtils.rm_r @path
   end
 
   def test_simple_message
@@ -72,7 +76,7 @@ EOS
     source.messages = [ message ]
     source_info = 0
 
-    sup_message = Message.new( {:source => source, :source_info => source_info } )
+    sup_message = Message.build_from_source(source, source_info)
     sup_message.load_from_source!
 
     # see how well parsing the header went
@@ -222,7 +226,7 @@ EOS
     source.messages = [ message ]
     source_info = 0
 
-    sup_message = Message.new( {:source => source, :source_info => source_info } )
+    sup_message = Message.build_from_source(source, source_info)
     sup_message.load_from_source!
 
     # read the message body chunks
@@ -272,7 +276,7 @@ EOS
     source.messages = [ message ]
     source_info = 0
 
-    sup_message = Message.new( {:source => source, :source_info => source_info } )
+    sup_message = Message.build_from_source(source, source_info)
     sup_message.load_from_source!
 
     to = sup_message.to
@@ -318,7 +322,7 @@ EOS
     source.messages = [ message ]
     source_info = 0
 
-    sup_message = Message.new( {:source => source, :source_info => source_info } )
+    sup_message = Message.build_from_source(source, source_info)
     sup_message.load_from_source!
 
     # read the message body chunks: no errors should reach this level
@@ -417,7 +421,7 @@ EOS
     source.messages = [ message ]
     source_info = 0
 
-    sup_message = Message.new( {:source => source, :source_info => source_info } )
+    sup_message = Message.build_from_source(source, source_info)
     sup_message.load_from_source!
 
     # read the message body chunks
@@ -508,7 +512,7 @@ EOS
     source.messages = [ message ]
     source_info = 0
 
-    sup_message = Message.new( {:source => source, :source_info => source_info } )
+    sup_message = Message.build_from_source(source, source_info)
     sup_message.load_from_source!
 
     # See how well parsing the message ID went.
@@ -517,7 +521,7 @@ EOS
 
     # Look at another header field whose first line was blank.
     list_unsubscribe = sup_message.list_unsubscribe
-    assert_equal("<http://mailman2.widget.com/mailman/listinfo/monitor-list>, " +
+    assert_equal("<http://mailman2.widget.com/mailman/listinfo/monitor-list>,\n \t" +
                  "<mailto:monitor-list-request@widget.com?subject=unsubscribe>",
                  list_unsubscribe)
 
diff --git a/test/test_server.rb b/test/test_server.rb
@@ -1,106 +0,0 @@
-#!/usr/bin/ruby
-# encoding: utf-8
-
-require 'test/unit'
-require 'iconv'
-require 'stringio'
-require 'tmpdir'
-require 'fileutils'
-require 'thread'
-require 'eventmachine'
-require 'sup'
-require 'sup/server'
-
-Thread.abort_on_exception = true
-
-module EM
-  # Run the reactor in a new thread. This is useful for using EventMachine
-  # alongside synchronous code. It is recommended to use EM.error_handler to
-  # detect when an exception terminates the reactor thread.
-  def self.spawn_reactor_thread
-    fail "reactor already started" if EM.reactor_running?
-    q = ::Queue.new
-    Thread.new { EM.run { q << nil } }
-    q.pop
-  end
-
-  # Stop the reactor and wait for it to finish. This is the counterpart to #spawn_reactor_thread.
-  def self.kill_reactor_thread
-    fail "reactor is not running" unless EM.reactor_running?
-    fail "current thread is running the reactor" if EM.reactor_thread?
-    EM.stop
-    EM.reactor_thread.join
-  end
-end
-
-class QueueingClient < EM::P::RedwoodClient
-  def initialize
-    super
-    @q = Queue.new
-    @readyq = Queue.new
-  end
-
-  def receive_message type, tag, params
-    @q << [type, tag, params]
-  end
-
-  def connection_established
-    @readyq << nil
-  end
-
-  def wait_until_ready
-    @readyq.pop
-  end
-
-  def read
-    @q.pop
-  end
-
-  alias write send_message
-end
-
-class TestServer < Test::Unit::TestCase
-  def setup
-    port = rand(1000) + 30000
-    EM.spawn_reactor_thread
-    @path = Dir.mktmpdir
-    socket_path = File.join(@path, 'socket')
-    Redwood::HookManager.init File.join(@path, 'hooks')
-    Redwood::SourceManager.init
-    Redwood::SourceManager.load_sources File.join(@path, 'sources.yaml')
-    Redwood::Index.init @path
-    Redwood::SearchManager.init File.join(@path, 'searches')
-    Redwood::Index.load
-    @server = EM.start_server socket_path,
-              Redwood::Server, Redwood::Index.instance
-    @client = EM.connect socket_path, QueueingClient
-    @client.wait_until_ready
-  end
-
-  def teardown
-    FileUtils.rm_r @path if passed?
-    puts "not cleaning up #{@path}" unless passed?
-    %w(Index SearchManager SourceManager HookManager).each do |x|
-      Redwood.const_get(x.to_sym).deinstantiate!
-    end
-    EM.kill_reactor_thread
-  end
-
-  def test_invalid_request
-    @client.write 'foo', '1'
-    check @client.read, 'error', '1'
-  end
-
-  def test_query
-    @client.write 'query', '1', 'query' => 'type:mail'
-    check @client.read, 'done', '1'
-  end
-
-  def check resp, type, tag, args={}
-    assert_equal type.to_s, resp[0]
-    assert_equal tag.to_s, resp[1]
-    args.each do |k,v|
-      assert_equal v, resp[2][k.to_s]
-    end
-  end
-end
diff --git a/test/test_yaml_regressions.rb b/test/test_yaml_regressions.rb
@@ -0,0 +1,17 @@
+require 'test/unit'
+
+# Requiring 'yaml' before 'sup' in 1.9.x would get Psych loaded first
+# and becoming the default yamler.
+require 'yaml'
+require 'sup'
+
+module Redwood
+  class TestYamlRegressions < Test::Unit::TestCase
+    def test_yamling_hash
+      hsh = {:foo => 42}
+      reloaded = YAML.load(hsh.to_yaml)
+
+      assert_equal reloaded, hsh
+    end
+  end
+end
diff --git a/www/index.html b/www/index.html
@@ -1,224 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-	<head>
-		<title>Sup</title>
-		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-		<link rel="stylesheet" href="main.css" type="text/css" />
-	</head>
-
-	<body>
-		<h1>Sup</h1>
-
-		<blockquote>
-		&ldquo;Finally a mail client that does what we want, how we want it.&rdquo;
-		</blockquote>
-
-		<blockquote>
-		&ldquo;Every other client we've tried is intolerable.&rdquo;
-		</blockquote>
-
-		<blockquote>
-		&ldquo;It's just what I wanted, but I hadn't realized what I wanted until I saw it.&rdquo;
-		</blockquote>
-
-		<blockquote>
-		&ldquo;Sup is almost to the point where I could jump ship from mutt.&rdquo;
-		</blockquote>
-
-		<blockquote>
-		&ldquo;I was previously intrigued by a gmail-styled
-		mutt-killer written in Ruby, but having actually spent a few
-		hours reading the docs, and trying out all the keys, and
-		reading the docs again, and trying the keys out again, and then
-		actually engaging in a bunch of practice usage runs, I now
-		officially can't fucking wait for the future of this thing; it
-		has my full attention.&rdquo;
-		</blockquote>
-
-			<p>
-   Sup is a console-based email client for people with a lot of email.
-   It supports tagging, very fast full-text search, automatic contact-
-   list management, custom code insertion via a hook system, and more.
-   If you're the type of person who treats email as an extension of your
-   long-term memory, Sup is for you.
-		</p>
-
-		<p>
-		Sup makes it easy to:
-		</p>
-
-		<ul>
-			<li>
-			Handle massive amounts of email.
-			</li>
-
-			<li>
-			Mix email from different sources: mbox files and maildirs.
-			For remote sources (IMAP, IMAPS, ssh+file), use another
-			tool (offlineimap, fetchmail, rsync) to grab local copies.
-			</li>
-
-			<li>
-			Instantaneously search over your entire email collection.
-			Search over body text, or use a query language to combine
-			search predicates in any way.
-			</li>
-
-			<li>
-			Handle multiple accounts. Replying to email sent to a
-			particular account will use the correct SMTP server, signature,
-			and from address.
-			</li>
-
-			<li>
-			Add custom code to handle certain types of messages or to
-			handle certain types of text within messages.
-			</li>
-
-			<li>
-			Organize email with user-defined labels, automatically track
-			recent contacts, and much more!
-			</li>
-		</ul>
-
-		<p>
-		The goal of Sup is to become the email client of choice for nerds
-		everywhere.
-		</p>
-
-		<h2>Screenshots</h2>
-
-		<ul id="screenshots">
-			<li><a href="ss1.png"><img src="ss1-small.png" alt="Sup screenshot 1" /></a></li>
-			<li><a href="ss2.png"><img src="ss2-small.png" alt="Sup screenshot 2" /></a></li>
-			<li><a href="ss3.png"><img src="ss3-small.png" alt="Sup screenshot 3" /></a></li>
-			<li><a href="ss4.png"><img src="ss4-small.png" alt="Sup screenshot 4" /></a></li>
-			<li><a href="ss5.png"><img src="ss5-small.png" alt="Sup screenshot 5" /></a></li>
-			<li><a href="ss6.png"><img src="ss6-small.png" alt="Sup screenshot 6" /></a></li>
-		</ul>
-
-		<h2>Documentation</h2>
-
-		<p>
-		Please read the <a href="README.txt">README</a>, the <a
-			href="FAQ.txt">FAQ</a>, the <a href="NewUserGuide.txt">new user guide</a>
-		and the <a href="Philosophy.txt">philosophical statement</a>.
-		</p>
-
-                <p> Please also read and contribute to the <a href="http://sup.rubyforge.org/wiki/wiki.pl">Sup wiki</a>. </p>
-
-		<h2>Status</h2>
-
-		<p>
-		The current version of Sup is 0.12.1, released 2011-01-23. This is a
-		beta release. It supports mbox and Maildir mailstores.
-		</p>
-
-        <p>To be notified by email of Sup releases, subscribe to the
-           <a href="http://rubyforge.org/mailman/listinfo/sup-announce">sup-announce mailing list</a>. One email per release.
-        </p>
-
-        <!-- <p>Issue and release status is available on the <a href="ditz/">Sup ditz page</a>.</p> -->
-        <p>Sup news can often be see on <a href="http://all-thing.net/label/sup/">William's blog</a>.</p>
-
-        <h2>Bug reports</h2>
-        <p>Find a problem with Sup? Or have a feature you'd like to see? <a href="http://masanjin.net/sup-bugs/issue?@template=item">Submit
-        it</a> to the <a href="http://masanjin.net/sup-bugs/">official Sup issue
-        tracker</a>.
-
-		<h2>Getting it</h2>
-
-		<p>
-		You can download Sup releases from the <a
-			href="http://rubyforge.org/projects/sup/">Sup RubyForge page</a>.
-		If you have RubyGems installed, simply command your computer to "gem
-		install sup".
-		</p>
-
-		<p>
-		If you're interested in development, you can clone the git repository like so: <code>git clone git://gitorious.org/sup/mainline.git</code>. You can also browse the <a
-			href="http://gitorious.org/projects/sup">Sup Gitorious
-			repository</a>. You may consider subscribing to the sup-devel list (below).
-		</p>
-
-		<h2>Make some new friends</h2>
-
-		<p> If you'd like to meet hot single Sup users in your area, try the <a
-			href="http://rubyforge.org/mailman/listinfo/sup-talk">sup-talk mailing list</a> (<a href="http://rubyforge.org/pipermail/sup-talk/">archives</a>).
-		</p>
-
-        <p> If you'd like to meet some grumpy old programmers to talk about Sup internals with, try the <a
-			href="http://rubyforge.org/mailman/listinfo/sup-devel">sup-devel mailing list</a> (<a href="http://rubyforge.org/pipermail/sup-devel/">archives</a>).
-
-
-		<h2>Credit</h2>
-
-		<p>
-		Sup is brought to you by <a href="http://masanjin.net/">William Morgan</a> and the following honorable contributors:
-        <ul>
-          <li> William Morgan </li>
-          <li> Rich Lane </li>
-          <li> Ismo Puustinen </li>
-          <li> Nicolas Pouillard </li>
-          <li> Eric Sherman </li>
-          <li> Michael Stapelberg </li>
-          <li> Ben Walton </li>
-          <li> Mike Stipicevic </li>
-          <li> Marcus Williams </li>
-          <li> Lionel Ott </li>
-          <li> Tero Tilus </li>
-          <li> Ingmar Vanhassel </li>
-          <li> Mark Alexander </li>
-          <li> Gaute Hope </li>
-          <li> Christopher Warrington </li>
-          <li> W. Trevor King </li>
-          <li> Gaudenz Steinlin </li>
-          <li> Richard Brown </li>
-          <li> Marc Hartstein </li>
-          <li> Sascha Silbe </li>
-          <li> Israel Herraiz </li>
-          <li> Anthony Martinez </li>
-          <li> Hamish Downer </li>
-          <li> Bo Borgerson </li>
-          <li> William Erik Baxter </li>
-          <li> Michael Hamann </li>
-          <li> Grant Hollingworth </li>
-          <li> Adeodato Simó </li>
-          <li> Daniel Schoepe </li>
-          <li> Jason Petsod </li>
-          <li> Steve Goldman </li>
-          <li> Edward Z. Yang </li>
-          <li> Decklin Foster </li>
-          <li> Cameron Matheson </li>
-          <li> Carl Worth </li>
-          <li> Jeff Balogh </li>
-          <li> Andrew Pimlott </li>
-          <li> Alex Vandiver </li>
-          <li> Peter Harkins </li>
-          <li> Kornilios Kourtis </li>
-          <li> Giorgio Lando </li>
-          <li> Damien Leone </li>
-          <li> Benoît PIERRE </li>
-          <li> Alvaro Herrera </li>
-          <li> Jonah </li>
-          <li> Adam Lloyd </li>
-          <li> Todd Eisenberger </li>
-          <li> ian </li>
-          <li> Steven Walter </li>
-          <li> ian </li>
-          <li> Jon M. Dugan </li>
-          <li> Gregor Hoffleit </li>
-          <li> Stefan Lundström </li>
-          <li> Kirill Smelkov </li>
-        </ul>
-        </p>
-
-		<p>
-		Sup is made possible by the <a href="http://xapian.org">Xapian</a> search engine,
-		and by <a href="http://www.lickey.com/">Matt Armstrong</a> and his
-		tragically abandoned <a href="http://www.rfc20.org/rubymail/">RubyMail</a>
-		package.
-		</p>
-	</body>
-</html>
diff --git a/www/main.css b/www/main.css
@@ -1,36 +0,0 @@
-body
-{
-	background: white;
-	color: #404040;
-	margin-bottom: 2em;
-	margin-left: auto;
-	margin-right: auto;
-	width: 90%;
-}
-
-a, a:visited
-{
-	border-bottom: 1px dotted #03c;
-	background: inherit;
-	color: #03c;
-	text-decoration: none;
-}
-
-#screenshots
-{
-	margin: 0;
-	padding: 0;
-}
-#screenshots li
-{
-	display: inline;
-	list-style: none;
-}
-#screenshots a
-{
-	border-bottom: none;
-}
-#screenshots img
-{
-	border: 0;
-}
diff --git a/www/ss1.png b/www/ss1.png
Binary files differ.
diff --git a/www/ss2.png b/www/ss2.png
Binary files differ.
diff --git a/www/ss3.png b/www/ss3.png
Binary files differ.
diff --git a/www/ss4.png b/www/ss4.png
Binary files differ.
diff --git a/www/ss5.png b/www/ss5.png
Binary files differ.
diff --git a/www/ss6.png b/www/ss6.png
Binary files differ.