Archive of RubyForge sup-talk mailing list
 help / color / mirror / Atom feed
* [sup-talk] (no subject)
@ 2011-12-10  3:08 Jason O'Conal
  0 siblings, 0 replies; 40+ messages in thread
From: Jason O'Conal @ 2011-12-10  3:08 UTC (permalink / raw)
  To: sup-talk

Hi,

I've been having trouble getting sup to work with my gmail account
downloaded by offlineimap. I have set up everything according to the
tutorial available at
http://sup.rubyforge.org/wiki/wiki.pl?GmailOfflineImapSmtp

I can't get sup-sync to run. I get the following error message:

/usr/lib/ruby/1.8/yaml.rb:133:in `transfer': invalid subclass (TypeError)
        from /usr/lib/ruby/1.8/yaml.rb:133:in `node_import'
        from /usr/lib/ruby/1.8/yaml.rb:133:in `load'
        from /usr/lib/ruby/1.8/yaml.rb:133:in `load'
        from /usr/lib/ruby/1.8/yaml.rb:144:in `load_file'
        from /usr/lib/ruby/1.8/yaml.rb:143:in `open'
        from /usr/lib/ruby/1.8/yaml.rb:143:in `load_file'
        from /usr/lib64/ruby/gems/1.8/gems/sup-0.12.1/lib/sup.rb:136:in
`load_yaml_obj'
        from /usr/lib64/ruby/gems/1.8/gems/sup-0.12.1/lib/sup.rb:266:in
`load_config'
        from /usr/lib64/ruby/gems/1.8/gems/sup-0.12.1/lib/sup.rb:157:in `start'
        from /usr/lib64/ruby/gems/1.8/gems/sup-0.12.1/bin/sup-sync:80
        from /usr/bin/sup-sync:19:in `load'
        from /usr/bin/sup-sync:19

I have tried to search for others with this error, but can't find
anything relevant (tried only using folders without spaces to no
avail). Any ideas?


Kind regards,

Jason O'Conal
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-21  1:10         ` Tero Tilus
@ 2010-11-21  1:51           ` Matthias Vallentin
  0 siblings, 0 replies; 40+ messages in thread
From: Matthias Vallentin @ 2010-11-21  1:51 UTC (permalink / raw)
  To: Tero Tilus; +Cc: sup-talk

> Sup has quite a few hooks waiting for your Ruby code.  See `sup
> --list-hooks`.  In this case you might want to take a closer look at
> after-poll and before-add-message.

Excellent, I am looking forward to delving deeper into Sup.

Thanks for the detailed information,

   Matthias
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-20 19:04       ` Matthias Vallentin
@ 2010-11-21  1:10         ` Tero Tilus
  2010-11-21  1:51           ` Matthias Vallentin
  0 siblings, 1 reply; 40+ messages in thread
From: Tero Tilus @ 2010-11-21  1:10 UTC (permalink / raw)
  To: sup-talk

Matthias Vallentin, 2010-11-20 21:04:
> Ideally, each time the view (i.e., unread count of all labels)
> changes, some trigger fires and reports the new data.

Sup has quite a few hooks waiting for your Ruby code.  See `sup
--list-hooks`.  In this case you might want to take a closer look at
after-poll and before-add-message.

--
Tero Tilus ## 050 3635 235 ## http://tero.tilus.net/
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-15  8:06     ` Helge Titlestad
@ 2010-11-20 19:04       ` Matthias Vallentin
  2010-11-21  1:10         ` Tero Tilus
  0 siblings, 1 reply; 40+ messages in thread
From: Matthias Vallentin @ 2010-11-20 19:04 UTC (permalink / raw)
  To: Helge Titlestad; +Cc: sup-talk

> "L" and then enter (don't search for anything) gives you a list of lables,
> including the unread count (although it does not order it by # unread). Is that
> what you're after?

Yes, that is what I am looking for. How easy is it to script/export this
view? Say I have an external application that simply displays unread
counts per label. Ideally, each time the view (i.e., unread count of
all labels) changes, some trigger fires and reports the new data.

   Matthias
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-15  6:57   ` Matthias Vallentin
@ 2010-11-15  8:06     ` Helge Titlestad
  2010-11-20 19:04       ` Matthias Vallentin
  0 siblings, 1 reply; 40+ messages in thread
From: Helge Titlestad @ 2010-11-15  8:06 UTC (permalink / raw)
  To: sup-talk

Excerpts from Matthias Vallentin's message of Mon Nov 15 07:57:37 +0100 2010:
> Without having tested it, the is:unread search seems to return a stream
> of unread messages, each of which can have arbitrary labels and is not
> necessarily ordered. Is there functionality that also displays unread
> counts per label? My chief interest is to find out how easy it is to
> obtain a one-shot, big-picture summary of unread mail.

"L" and then enter (don't search for anything) gives you a list of lables,
including the unread count (although it does not order it by # unread). Is that
what you're after?

-- 
77660
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-15  1:42 ` Edward Z. Yang
@ 2010-11-15  6:57   ` Matthias Vallentin
  2010-11-15  8:06     ` Helge Titlestad
  0 siblings, 1 reply; 40+ messages in thread
From: Matthias Vallentin @ 2010-11-15  6:57 UTC (permalink / raw)
  To: Edward Z. Yang; +Cc: sup-talk

> I use the keybinding 'U', which performs the is:unread search.

Without having tested it, the is:unread search seems to return a stream
of unread messages, each of which can have arbitrary labels and is not
necessarily ordered. Is there functionality that also displays unread
counts per label? My chief interest is to find out how easy it is to
obtain a one-shot, big-picture summary of unread mail.

   Matthias
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-15  0:49 Matthias Vallentin
  2010-11-15  1:42 ` Edward Z. Yang
  2010-11-15  1:46 ` Ben Walton
@ 2010-11-15  1:50 ` Matias Aguirre
  2 siblings, 0 replies; 40+ messages in thread
From: Matias Aguirre @ 2010-11-15  1:50 UTC (permalink / raw)
  To: sup-talk

There's a unread folder you can check, just type shift+l to get the
folder listing and it will be there.

Matías

Excerpts from Matthias Vallentin's message of Sun Nov 14 22:49:31 -0200 2010:
> I am a Mutt user interested in switching to Sup. One thing that is not
> clear to me is how to find new unread messages that skipped the inbox.
> Coming from the world of mail folders, I can monitor each folder for
> unread messages and switch to it when I see that a new one has arrived.
> Often, a buffy tool (or the Mutt sidebar) can be used to display the
> various folders with their new message counts. How would that mindset
> translate to Sup? Would I have to regularly query all (or a just a
> subset of) labels to get an idea whether label X "received" a new
> message?
> 
>   Matthias
--
Matías Aguirre <matiasaguirre@gmail.com>
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-15  0:49 Matthias Vallentin
  2010-11-15  1:42 ` Edward Z. Yang
@ 2010-11-15  1:46 ` Ben Walton
  2010-11-15  1:50 ` Matias Aguirre
  2 siblings, 0 replies; 40+ messages in thread
From: Ben Walton @ 2010-11-15  1:46 UTC (permalink / raw)
  To: sup-talk

Excerpts from Matthias Vallentin's message of Sun Nov 14 19:49:31 -0500 2010:

Hi Matthias,

The query: is:unread
should work for you.  This is such a common action that the key U is
bound to run this query.

Thanks
-Ben
--
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302

_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [sup-talk] (no subject)
  2010-11-15  0:49 Matthias Vallentin
@ 2010-11-15  1:42 ` Edward Z. Yang
  2010-11-15  6:57   ` Matthias Vallentin
  2010-11-15  1:46 ` Ben Walton
  2010-11-15  1:50 ` Matias Aguirre
  2 siblings, 1 reply; 40+ messages in thread
From: Edward Z. Yang @ 2010-11-15  1:42 UTC (permalink / raw)
  To: Matthias Vallentin; +Cc: sup-talk

Excerpts from Matthias Vallentin's message of Sun Nov 14 19:49:31 -0500 2010:
> I am a Mutt user interested in switching to Sup. One thing that is not
> clear to me is how to find new unread messages that skipped the inbox.
> Coming from the world of mail folders, I can monitor each folder for
> unread messages and switch to it when I see that a new one has arrived.
> Often, a buffy tool (or the Mutt sidebar) can be used to display the
> various folders with their new message counts. How would that mindset
> translate to Sup? Would I have to regularly query all (or a just a
> subset of) labels to get an idea whether label X "received" a new
> message?

I use the keybinding 'U', which performs the is:unread search.

Cheers,
Edward
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2010-11-15  0:49 Matthias Vallentin
  2010-11-15  1:42 ` Edward Z. Yang
                   ` (2 more replies)
  0 siblings, 3 replies; 40+ messages in thread
From: Matthias Vallentin @ 2010-11-15  0:49 UTC (permalink / raw)
  To: sup-talk

I am a Mutt user interested in switching to Sup. One thing that is not
clear to me is how to find new unread messages that skipped the inbox.
Coming from the world of mail folders, I can monitor each folder for
unread messages and switch to it when I see that a new one has arrived.
Often, a buffy tool (or the Mutt sidebar) can be used to display the
various folders with their new message counts. How would that mindset
translate to Sup? Would I have to regularly query all (or a just a
subset of) labels to get an idea whether label X "received" a new
message?

  Matthias
_______________________________________________
sup-talk mailing list
sup-talk@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-talk


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-08  0:02 Ben Walton
  2009-06-11 23:50 ` Ben Walton
@ 2009-06-12 18:23 ` William Morgan
  1 sibling, 0 replies; 40+ messages in thread
From: William Morgan @ 2009-06-12 18:23 UTC (permalink / raw)


Reformatted excerpts from Ben Walton's message of 2009-06-07:
> Here's a stab at implementing a message bouncing functionality worthy
> of being included on mainline.

Looks good. I've merged this into next. Thanks!
-- 
William <wmorgan-sup at masanjin.net>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-12  3:44   ` William Morgan
@ 2009-06-12 13:15     ` Ben Walton
  0 siblings, 0 replies; 40+ messages in thread
From: Ben Walton @ 2009-06-12 13:15 UTC (permalink / raw)


Excerpts from William Morgan's message of Thu Jun 11 23:44:41 -0400 2009:
> Reformatted excerpts from Ben Walton's message of 2009-06-11:
> > Is there something you don't like about these patches or have you just
> > been too busy to look at them?
> 
> Just been busy. Sorry! My Sup time tends to be very bursty. I realize
> that's not great for contributors. Please have patience with your poor
> maintainer and feel free to keep bugging me.

No problem.  You're just very quick to respond typically, so I wanted
to make sure that it hadn't fallen through the cracks...

Thanks
-Ben

-- 
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302

GPG Key Id: 8E89F6D2; Key Server: pgp.mit.edu
Contact me to arrange for a CAcert assurance meeting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/sup-talk/attachments/20090612/0803c72a/attachment.bin>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-11 23:50 ` Ben Walton
@ 2009-06-12  3:44   ` William Morgan
  2009-06-12 13:15     ` Ben Walton
  0 siblings, 1 reply; 40+ messages in thread
From: William Morgan @ 2009-06-12  3:44 UTC (permalink / raw)


Reformatted excerpts from Ben Walton's message of 2009-06-11:
> Is there something you don't like about these patches or have you just
> been too busy to look at them?

Just been busy. Sorry! My Sup time tends to be very bursty. I realize
that's not great for contributors. Please have patience with your poor
maintainer and feel free to keep bugging me.
-- 
William <wmorgan-sup at masanjin.net>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-08  0:02 Ben Walton
@ 2009-06-11 23:50 ` Ben Walton
  2009-06-12  3:44   ` William Morgan
  2009-06-12 18:23 ` William Morgan
  1 sibling, 1 reply; 40+ messages in thread
From: Ben Walton @ 2009-06-11 23:50 UTC (permalink / raw)


Excerpts from Ben Walton's message of Sun Jun 07 20:02:25 -0400 2009:

Hi William,

> Here's a stab at implementing a message bouncing functionality worthy
> of being included on mainline.

Is there something you don't like about these patches or have you just
been too busy to look at them?  I could collapse them into a single
patch, thus removing any trace of using $config instead of a Hook, to
keep the history cleaner if you'd prefer.

If there is something else you'd like to see changed before picking it
up, let me know.

Thanks
-Ben
-- 
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302

GPG Key Id: 8E89F6D2; Key Server: pgp.mit.edu
Contact me to arrange for a CAcert assurance meeting.


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-06-08  0:02 Ben Walton
  2009-06-11 23:50 ` Ben Walton
  2009-06-12 18:23 ` William Morgan
  0 siblings, 2 replies; 40+ messages in thread
From: Ben Walton @ 2009-06-08  0:02 UTC (permalink / raw)


Hi All,

Here's a stab at implementing a message bouncing functionality worthy
of being included on mainline.

The first patch adds the basic functionality with the ability to
supply a command in the :bounce_sendmail option that overrides the
default command used.  The default is to use the sendmail command of
the default account with -t removed.

The second patch takes this a step further and strips the
configuration option in favour of a hook named bounce-command.  This
hooks gets the From header of the message being bounced and an array
of recipient addresses supplied by the user.

I think these are in good shape, with the caveat that the mail sending
(IO.popen) part could still be refactored with the code in
edit-message-mode.

Anyone interested can grab this code from the bw/bounce_message branch
of git://code.chass.utoronto.ca/bwalton-sup.git.  It merges cleanly
into next as of now.

Feedback welcome.

Thanks
-Ben



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-01  1:01 Ben Walton
  2009-06-01  1:04 ` Ben Walton
  2009-06-01  2:13 ` Ben Walton
@ 2009-06-04  2:04 ` Ross Macduff
  2 siblings, 0 replies; 40+ messages in thread
From: Ross Macduff @ 2009-06-04  2:04 UTC (permalink / raw)


I merged this patch into the mainline from gitorius.  Works as
expected.  Definitely a nice addition.

Ross

On Sun, May 31, 2009 at 9:01 PM, Ben Walton <bwalton at cquest.utoronto.ca> wrote:
> >From 702b2cc1e652c1f20f4280b11355cb337291df87 Mon Sep 17 00:00:00 2001
> From: Ben Walton <bwalton at artsci.utoronto.ca>
> Date: Sun, 31 May 2009 20:37:11 -0400
> Subject: [PATCH] Add bounce message feature
>
> By pressing ! in thread view mode, a message can be re-injected to the
> mail system without any modification. ?The interesting/useful property
> of this feature is that, because only the envelope sender changes, the
> mail will show up at the new destination with the original From:
> header. ?A use case for this is redirecting mail sent to an individual
> into a ticket system such that the original sender gets the
> auto-response.
>
> Signed-off-by: Ben Walton <bwalton at artsci.utoronto.ca>
> ---
> ?lib/sup/modes/thread-view-mode.rb | ? 19 +++++++++++++++++++
> ?1 files changed, 19 insertions(+), 0 deletions(-)
>
> diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
> index 42c6280..4737dde 100644
> --- a/lib/sup/modes/thread-view-mode.rb
> +++ b/lib/sup/modes/thread-view-mode.rb
> @@ -41,6 +41,7 @@ EOS
> ?# ? ?k.add :collapse_non_new_messages, "Collapse all but unread messages", 'N'
> ? ? k.add :reply, "Reply to a message", 'r'
> ? ? k.add :forward, "Forward a message or attachment", 'f'
> + ? ?k.add :bounce, "Bounce message to other recipient(s)", '!'
> ? ? k.add :alias, "Edit alias/nickname for a person", 'i'
> ? ? k.add :edit_as_new, "Edit message as new", 'D'
> ? ? k.add :save_to_disk, "Save message/attachment to disk", 's'
> @@ -172,6 +173,24 @@ EOS
> ? ? end
> ? end
>
> + ?def bounce
> + ? ?m = @message_lines[curpos] or return
> + ? ?to = BufferManager.ask_for_contacts(:people, "Bounce To: ") or return
> +
> + ? ?if BufferManager.ask_yes_or_no "Really bounce to #{to.join(', ')}?"
> + ? ? ?cmd = "sendmail -oem -i #{to.map { |t| t.email}.join(' ')}"
> + ? ? ?begin
> + ? ? ? ?IO.popen(cmd, 'w') do |sm|
> + ? ? ? ? ?sm.puts m.raw_message
> + ? ? ? ?end
> + ? ? ? ?raise SendmailCommandFailed, "Couldn't execute #{cmd}" unless $? == 0
> + ? ? ?rescue SystemCallError, SendmailCommandFailed => e
> + ? ? ? ?Redwood::log "Problem sending mail: #{e.message}"
> + ? ? ? ?BufferManager.flash "Problem sending mail: #{e.message}"
> + ? ? ?end
> + ? ?end
> + ?end
> +
> ? include CanAliasContacts
> ? def alias
> ? ? p = @person_lines[curpos] or return
> --
> 1.6.3
>
> _______________________________________________
> sup-talk mailing list
> sup-talk at rubyforge.org
> http://rubyforge.org/mailman/listinfo/sup-talk
>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-01  1:01 Ben Walton
  2009-06-01  1:04 ` Ben Walton
@ 2009-06-01  2:13 ` Ben Walton
  2009-06-04  2:04 ` Ross Macduff
  2 siblings, 0 replies; 40+ messages in thread
From: Ben Walton @ 2009-06-01  2:13 UTC (permalink / raw)


Excerpts from Ben Walton's message of Sun May 31 21:01:10 -0400 2009:
> >From 702b2cc1e652c1f20f4280b11355cb337291df87 Mon Sep 17 00:00:00 2001
> From: Ben Walton <bwalton at artsci.utoronto.ca>
> Date: Sun, 31 May 2009 20:37:11 -0400
> Subject: [PATCH] Add bounce message feature

I thought I'd also clarify that in its final form, there should be a
refactor of EditMessageMode::send_message to pull out the wrapped
IO.popen into a method usable for sending a normal message and
bouncing a message.

Thanks
-Ben
-- 
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302

GPG Key Id: 8E89F6D2; Key Server: pgp.mit.edu
Contact me to arrange for a CAcert assurance meeting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/sup-talk/attachments/20090531/a19dd890/attachment.bin>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-06-01  1:01 Ben Walton
@ 2009-06-01  1:04 ` Ben Walton
  2009-06-01  2:13 ` Ben Walton
  2009-06-04  2:04 ` Ross Macduff
  2 siblings, 0 replies; 40+ messages in thread
From: Ben Walton @ 2009-06-01  1:04 UTC (permalink / raw)


Excerpts from Ben Walton's message of Sun May 31 21:01:10 -0400 2009:

> >From 702b2cc1e652c1f20f4280b11355cb337291df87 Mon Sep 17 00:00:00 2001
> From: Ben Walton <bwalton at artsci.utoronto.ca>
> Date: Sun, 31 May 2009 20:37:11 -0400
> Subject: [PATCH] Add bounce message feature

...sorry for the odd way in which this arrived.  The changed behaviour
in the recent git send-email threw me for a bit and I fired the cover
letter without the patch following.

Thanks.
-Ben
-- 
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302

GPG Key Id: 8E89F6D2; Key Server: pgp.mit.edu
Contact me to arrange for a CAcert assurance meeting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/sup-talk/attachments/20090531/e287f32c/attachment.bin>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-06-01  1:01 Ben Walton
  2009-06-01  1:04 ` Ben Walton
                   ` (2 more replies)
  0 siblings, 3 replies; 40+ messages in thread
From: Ben Walton @ 2009-06-01  1:01 UTC (permalink / raw)


From 702b2cc1e652c1f20f4280b11355cb337291df87 Mon Sep 17 00:00:00 2001
From: Ben Walton <bwalton at artsci.utoronto.ca>
Date: Sun, 31 May 2009 20:37:11 -0400
Subject: [PATCH] Add bounce message feature

By pressing ! in thread view mode, a message can be re-injected to the
mail system without any modification.  The interesting/useful property
of this feature is that, because only the envelope sender changes, the
mail will show up at the new destination with the original From:
header.  A use case for this is redirecting mail sent to an individual
into a ticket system such that the original sender gets the
auto-response.

Signed-off-by: Ben Walton <bwalton at artsci.utoronto.ca>
---
 lib/sup/modes/thread-view-mode.rb |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
index 42c6280..4737dde 100644
--- a/lib/sup/modes/thread-view-mode.rb
+++ b/lib/sup/modes/thread-view-mode.rb
@@ -41,6 +41,7 @@ EOS
 #    k.add :collapse_non_new_messages, "Collapse all but unread messages", 'N'
     k.add :reply, "Reply to a message", 'r'
     k.add :forward, "Forward a message or attachment", 'f'
+    k.add :bounce, "Bounce message to other recipient(s)", '!'
     k.add :alias, "Edit alias/nickname for a person", 'i'
     k.add :edit_as_new, "Edit message as new", 'D'
     k.add :save_to_disk, "Save message/attachment to disk", 's'
@@ -172,6 +173,24 @@ EOS
     end
   end
 
+  def bounce
+    m = @message_lines[curpos] or return
+    to = BufferManager.ask_for_contacts(:people, "Bounce To: ") or return
+
+    if BufferManager.ask_yes_or_no "Really bounce to #{to.join(', ')}?"
+      cmd = "sendmail -oem -i #{to.map { |t| t.email}.join(' ')}"
+      begin
+        IO.popen(cmd, 'w') do |sm|
+          sm.puts m.raw_message
+        end
+        raise SendmailCommandFailed, "Couldn't execute #{cmd}" unless $? == 0
+      rescue SystemCallError, SendmailCommandFailed => e
+        Redwood::log "Problem sending mail: #{e.message}"
+        BufferManager.flash "Problem sending mail: #{e.message}"
+      end
+    end
+  end
+
   include CanAliasContacts
   def alias
     p = @person_lines[curpos] or return
-- 
1.6.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-02-16 14:08   ` William Morgan
@ 2009-02-16 14:42     ` Mike Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Mike Stipicevic @ 2009-02-16 14:42 UTC (permalink / raw)


Excerpts from William Morgan's message of Mon Feb 16 09:08:42 -0500 2009:
> Reformatted excerpts from Ian Smith's message of 2009-02-16:
> > I've gotten a whole bunch of these empty messages from you/sup-talk
> > over the past few hours.  Any idea what they are, or how you can
> > suppress them?
> 
> Some of them seem to have included patches. Don't suppress those!
> 
> Looks kinda like a session with git-send-email gone tragically awry.

This is indeed the case. There should be 8 patches in total, they all implement basic undo functionality for sup. Sorry for the mess!

- Mike
-- 
Mike Stipicevic
RPI EE/CSYS Class of '09

stipim at rpi.edu
mstipicevic at ieee.org


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-02-16  8:53 ` Ian Smith
@ 2009-02-16 14:08   ` William Morgan
  2009-02-16 14:42     ` Mike Stipicevic
  0 siblings, 1 reply; 40+ messages in thread
From: William Morgan @ 2009-02-16 14:08 UTC (permalink / raw)


Reformatted excerpts from Ian Smith's message of 2009-02-16:
> I've gotten a whole bunch of these empty messages from you/sup-talk
> over the past few hours.  Any idea what they are, or how you can
> suppress them?

Some of them seem to have included patches. Don't suppress those!

Looks kinda like a session with git-send-email gone tragically awry.
-- 
William <wmorgan-sup at masanjin.net>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
  2009-02-16  6:25 Michael John Stipicevic
@ 2009-02-16  8:53 ` Ian Smith
  2009-02-16 14:08   ` William Morgan
  0 siblings, 1 reply; 40+ messages in thread
From: Ian Smith @ 2009-02-16  8:53 UTC (permalink / raw)


Hey,

I've gotten a whole bunch of these empty messages from you/sup-talk
over the past few hours.  Any idea what they are, or how you can
suppress them?

Ian

Excerpts from Michael John Stipicevic's message of Mon Feb 16 01:25:59 -0500 2009:
> 


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From e7abf80a590aa2f2de35343fceecea9deae41193 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:11:46 -0500
Subject: [PATCH] Changed README to reflect addition of undo

---
 README.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/README.txt b/README.txt
index 1b2b516..05349d7 100644
--- a/README.txt
+++ b/README.txt
@@ -80,7 +80,7 @@ Current limitations which will be fixed:
 - Unix-centrism in MIME attachment handling and in sendmail
   invocation.
 
-- Several obvious missing features, like undo, filters / saved
+- Several obvious missing features, like filters / saved
   searches, message annotations, etc.
 
 == SYNOPSYS:
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From 1fd41c30189db832abb54f1cda416d0aa624e028 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:11:28 -0500
Subject: [PATCH] Added undo for label edit

---
 lib/sup/modes/thread-index-mode.rb |   27 +++++++++++++++++++++++++--
 1 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 159839d..f28302b 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -509,6 +509,10 @@ EOS
   def edit_labels
     thread = cursor_thread or return
     speciall = (@hidden_labels + LabelManager::RESERVED_LABELS).uniq
+
+    old_labels = thread.labels
+    pos = curpos
+
     keepl, modifyl = thread.labels.partition { |t| speciall.member? t }
 
     user_labels = BufferManager.ask_for_labels :label, "Labels for thread: ", modifyl, @hidden_labels
@@ -517,6 +521,15 @@ EOS
     thread.labels = keepl + user_labels
     user_labels.each { |l| LabelManager << l }
     update_text_for_line curpos
+
+    undo = lambda{
+      thread.labels = old_labels
+      update_text_for_line pos
+      UpdateManager.relay self, :labeled, thread.first
+    }
+
+    UndoManager.register("labeling thread #{thread.first.id}", undo)
+
     UpdateManager.relay self, :labeled, thread.first
   end
 
@@ -526,8 +539,18 @@ EOS
     
     hl = user_labels.select { |l| @hidden_labels.member? l }
     if hl.empty?
-      threads.each { |t| user_labels.each { |l| t.apply_label l } }
-      user_labels.each { |l| LabelManager << l }
+      undo = threads.map { |t| old_labels = t.labels
+        user_labels.each { |l| t.apply_label l }
+        ## UpdateManager or some other regresh mechanism?
+        UpdateManager.relay self, :labeled, t.first
+        lambda {
+          t.labels = old_labels
+          UpdateManager.relay self, :labeled, t.first
+        }
+      }
+    user_labels.each { |l| LabelManager << l }
+    UndoManager.register("labeling #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda { regen_text})
     else
       BufferManager.flash "'#{hl}' is a reserved label!"
     end
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From 9a5ac47e979de8030756b88d4e52b6d8a289a25a Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:10:32 -0500
Subject: [PATCH] Added undo for delete thread

---
 lib/sup/modes/thread-index-mode.rb |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index ae7c299..159839d 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -443,11 +443,18 @@ EOS
     multi_kill [t]
   end
 
+  ## m-m-m-m-MULTI-KILL
   def multi_kill threads
-    threads.each do |t|
+    undo = threads.map do |t|
       t.apply_label :killed
       hide_thread t
+      thread = t
+      lambda { thread.remove_label :killed
+        add_or_unhide thread.first
+      }
     end
+    UndoManager.register("killing #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text})
     regen_text
     BufferManager.flash "#{threads.size.pluralize 'Thread'} killed."
   end
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From d1b5ff3d022e0e6aeabf410b0778fd11a5449ed0 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:08:03 -0500
Subject: [PATCH] Added undo for thread deletion

---
 lib/sup/modes/thread-index-mode.rb |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 1e02b5b..ae7c299 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -326,12 +326,26 @@ EOS
 
   def actually_toggle_deleted t
     if t.has_label? :deleted
+      undo = lambda {
+        t.apply_label :deleted
+        hide_thread t
+        UpdateManager.relay self, :deleted, t.first
+      }
       t.remove_label :deleted
+      add_or_unhide t.first
       UpdateManager.relay self, :undeleted, t.first
     else
+      undo = lambda {
+        t.remove_label :deleted
+        add_or_unhide t.first
+        UpdateManager.relay self, :undeleted, t.first
+      }
       t.apply_label :deleted
+  hide_thread t
       UpdateManager.relay self, :deleted, t.first
     end
+
+    return undo
   end
 
   def toggle_archived 
@@ -418,10 +432,9 @@ EOS
 
   ## see comment for multi_toggle_spam
   def multi_toggle_deleted threads
-    threads.each do |t|
-      actually_toggle_deleted t
-      hide_thread t 
-    end
+    undo = threads.map{ |t| actually_toggle_deleted t}
+    UndoManager.register("deleting/undeleting #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text})
     regen_text
   end
 
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From 31bb0fd8f6e701107ce79ad2dbd9d42da4635742 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:06:36 -0500
Subject: [PATCH] Added undo for spam

---
 lib/sup/modes/thread-index-mode.rb |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 62fdb85..1e02b5b 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -300,13 +300,28 @@ EOS
   end
 
   def actually_toggle_spammed t
+    thread = t
     if t.has_label? :spam
+      undo = lambda {
+        thread.apply_label :spam
+        self.hide_thread thread
+        UpdateManager.relay self,:spammed, thread.first
+      }
       t.remove_label :spam
+      add_or_unhide t.first
       UpdateManager.relay self, :unspammed, t.first
     else
+      undo = lambda {
+        thread.remove_label :spam
+        add_or_unhide thread.first
+        UpdateManager.relay self,:unspammed, thread.first
+      }
       t.apply_label :spam
+      hide_thread t
       UpdateManager.relay self, :spammed, t.first
     end
+
+    return undo
   end
 
   def actually_toggle_deleted t
@@ -390,10 +405,9 @@ EOS
   ## see deleted or spam emails, and when you undelete or unspam them
   ## you also want them to disappear immediately.
   def multi_toggle_spam threads
-    threads.each do |t|
-      actually_toggle_spammed t
-      hide_thread t 
-    end
+    undo = threads.map{ |t| actually_toggle_spammed t}
+    UndoManager.register("marking/unmarking #{threads.size} #{threads.size.pluralize 'thread'} as spam",
+                         undo <<  lambda {self.regen_text})
     regen_text
   end
 
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From e42299ce17ed7c12989d0c8a6dea2ed100921e4a Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:03:57 -0500
Subject: [PATCH] Added undo for starring

---
 lib/sup/modes/thread-index-mode.rb |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 120acad..62fdb85 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -237,24 +237,41 @@ EOS
   end
 
   def actually_toggle_starred t
+    thread = t # cargo cult programming
+    pos = curpos
     if t.has_label? :starred # if ANY message has a star
+      undo = lambda {
+        thread.first.add_label :starred
+        update_text_for_line pos
+        UpdateManager.relay self, :starred, thread.first
+      }
       t.remove_label :starred # remove from all
       UpdateManager.relay self, :unstarred, t.first
     else
+      undo = lambda {
+        thread.remove_label :starred
+        update_text_for_line pos
+        UpdateManager.relay self, :unstarred, thread.first
+      }
       t.first.add_label :starred # add only to first
       UpdateManager.relay self, :starred, t.first
     end
+
+    return undo
   end  
 
   def toggle_starred 
     t = cursor_thread or return
-    actually_toggle_starred t
+    undo = actually_toggle_starred t
+    UndoManager.register("starring/unstarring thread #{t.first.id}",undo)
     update_text_for_line curpos
     cursor_down
   end
 
   def multi_toggle_starred threads
-    threads.each { |t| actually_toggle_starred t }
+    undo = threads.map { |t| actually_toggle_starred t }
+    UndoManager.register("starring/unstarring #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo)
     regen_text
   end
 
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:45 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:45 UTC (permalink / raw)


From 61a256d09ec8091e5ab44cc4e0e5c9c24c81a4cf Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:40:39 -0500
Subject: [PATCH] Added undo for archive

---
 lib/sup/modes/inbox-mode.rb        |   35 +++++++++++++++++++++++++++++++++++
 lib/sup/modes/thread-index-mode.rb |   21 +++++++++++++++++++--
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb
index 559892d..21eb9ac 100644
--- a/lib/sup/modes/inbox-mode.rb
+++ b/lib/sup/modes/inbox-mode.rb
@@ -26,12 +26,28 @@ class InboxMode < ThreadIndexMode
 
   def archive
     return unless cursor_thread
+    thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
+
+    undo = lambda {
+      thread.apply_label :inbox
+      add_or_unhide thread.first
+    }
+    UndoManager.register("archiving thread #{thread.first.id}", undo)
+
     cursor_thread.remove_label :inbox
     hide_thread cursor_thread
     regen_text
   end
 
   def multi_archive threads
+    undo = threads.map {|t|
+             lambda{
+               t.apply_label :inbox
+               add_or_unhide t.first
+             }}
+    UndoManager.register("archiving #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text} )
+
     threads.each do |t|
       t.remove_label :inbox
       hide_thread t
@@ -41,6 +57,15 @@ class InboxMode < ThreadIndexMode
 
   def read_and_archive
     return unless cursor_thread
+    thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
+
+    undo = lambda {
+      thread.apply_label :inbox
+      thread.apply_label :unread
+      add_or_unhide thread.first
+    }
+    UndoManager.register("reading and archiving thread ", undo)
+
     cursor_thread.remove_label :unread
     cursor_thread.remove_label :inbox
     hide_thread cursor_thread
@@ -48,6 +73,16 @@ class InboxMode < ThreadIndexMode
   end
 
   def multi_read_and_archive threads
+    undo = threads.map {|t|
+      lambda {
+        t.apply_label :inbox
+        t.apply_label :unread
+        add_or_unhide t.first
+      }
+    }
+    UndoManager.register("reading and archiving #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text})
+
     threads.each do |t|
       t.remove_label :unread
       t.remove_label :inbox
diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index ee30284..120acad 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -259,13 +259,27 @@ EOS
   end
 
   def actually_toggle_archived t
+    thread = t
+    pos = curpos
     if t.has_label? :inbox
       t.remove_label :inbox
+      undo = lambda {
+        thread.apply_label :inbox
+        update_text_for_line pos
+        UpdateManager.relay self,:unarchived, thread.first
+      }
       UpdateManager.relay self, :archived, t.first
     else
       t.apply_label :inbox
+      undo = lambda {
+        thread.remove_label :inbox
+        update_text_for_line pos
+        UpdateManager.relay self, :unarchived, thread.first
+      }
       UpdateManager.relay self, :unarchived, t.first
     end
+
+    return undo
   end
 
   def actually_toggle_spammed t
@@ -290,12 +304,15 @@ EOS
 
   def toggle_archived 
     t = cursor_thread or return
-    actually_toggle_archived t
+    undo = [actually_toggle_archived(t), lambda {self.update_text_for_line curpos}]
+    UndoManager.register("deleting/undeleting thread #{t.first.id}",undo)
     update_text_for_line curpos
   end
 
   def multi_toggle_archived threads
-    threads.each { |t| actually_toggle_archived t }
+    undo = threads.map { |t| actually_toggle_archived t}
+    UndoManager.register("deleting/undeleting #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {self.regen_text})
     regen_text
   end
 
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:44 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:44 UTC (permalink / raw)


From 9b863d8c86226b3d148e56060092556e2b13a5df Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:39:50 -0500
Subject: [PATCH] Added UndoManager class

The UndoManager keeps a list of lambdas that undo actions. It's designed to be used by keypress hooks. It is initialized in the main sup thread along with UpdateManager, etc.
---
 lib/sup.rb                         |    2 +
 lib/sup/modes/thread-index-mode.rb |    6 +++++
 lib/sup/undo.rb                    |   42 ++++++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 0 deletions(-)
 create mode 100644 lib/sup/undo.rb

diff --git a/lib/sup.rb b/lib/sup.rb
index 93369a5..eda673b 100644
--- a/lib/sup.rb
+++ b/lib/sup.rb
@@ -125,6 +125,7 @@ module Redwood
     Redwood::PollManager.new
     Redwood::SuicideManager.new Redwood::SUICIDE_FN
     Redwood::CryptoManager.new
+    Redwood::UndoManager.new
   end
 
   def finish
@@ -281,6 +282,7 @@ require "sup/tagger"
 require "sup/draft"
 require "sup/poll"
 require "sup/crypto"
+require "sup/undo"
 require "sup/horizontal-selector"
 require "sup/modes/line-cursor-mode"
 require "sup/modes/help-mode"
diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 4de4613..ee30284 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -44,6 +44,7 @@ EOS
     k.add :tag_matching, "Tag matching threads", 'g'
     k.add :apply_to_tagged, "Apply next command to all tagged threads", ';'
     k.add :join_threads, "Force tagged threads to be joined into the same thread", '#'
+    k.add :undo, "Undo the previous action", 'u'
   end
 
   def initialize hidden_labels=[], load_thread_opts={}
@@ -83,6 +84,7 @@ EOS
 
   def reload
     drop_all_threads
+    UndoManager.clear
     BufferManager.draw_screen
     load_threads :num => buffer.content_height
   end
@@ -208,6 +210,10 @@ EOS
     add_or_unhide m
   end
 
+  def undo
+    UndoManager.undo
+  end
+
   def update
     @mutex.synchronize do
       ## let's see you do THIS in python
diff --git a/lib/sup/undo.rb b/lib/sup/undo.rb
new file mode 100644
index 0000000..250433d
--- /dev/null
+++ b/lib/sup/undo.rb
@@ -0,0 +1,42 @@
+module Redwood
+
+## Implements a single undo list for the Sup instance
+##
+## The basic idea is to keep a list of lambdas to undo
+## things. When an action is called (such as 'archive'),
+## a lambda is registered with UndoManager that will
+## undo the archival action
+
+class UndoManager
+  include Singleton
+
+  def initialize
+    @@actionlist = []
+    self.class.i_am_the_instance self
+  end
+
+  def register desc, actions
+    actions = [actions] unless actions.is_a?Array
+    raise StandardError, "when would I need to undo 'nothing?'" unless actions.length > 0
+    Redwood::log "registering #{actions.length} actions: #{desc}"
+    @@actionlist.push({:desc => desc, :actions => actions})
+  end
+
+  def undo
+    unless @@actionlist.length == 0 then
+      actionset = @@actionlist.pop
+      Redwood::log "undoing #{actionset[:desc]}..."
+      actionset[:actions].each{|action|
+        action.call
+      }
+      BufferManager.flash "undid #{actionset[:desc]}"
+    else
+      BufferManager.flash "nothing more to undo"
+    end
+  end
+
+  def clear
+    @@actionlist = []
+  end
+end
+end
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:27 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:27 UTC (permalink / raw)


From 9b863d8c86226b3d148e56060092556e2b13a5df Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:39:50 -0500
Subject: [PATCH] Added UndoManager class

The UndoManager keeps a list of lambdas that undo actions. It's designed to be used by keypress hooks. It is initialized in the main sup thread along with UpdateManager, etc.
---
 lib/sup.rb                         |    2 +
 lib/sup/modes/thread-index-mode.rb |    6 +++++
 lib/sup/undo.rb                    |   42 ++++++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 0 deletions(-)
 create mode 100644 lib/sup/undo.rb

diff --git a/lib/sup.rb b/lib/sup.rb
index 93369a5..eda673b 100644
--- a/lib/sup.rb
+++ b/lib/sup.rb
@@ -125,6 +125,7 @@ module Redwood
     Redwood::PollManager.new
     Redwood::SuicideManager.new Redwood::SUICIDE_FN
     Redwood::CryptoManager.new
+    Redwood::UndoManager.new
   end
 
   def finish
@@ -281,6 +282,7 @@ require "sup/tagger"
 require "sup/draft"
 require "sup/poll"
 require "sup/crypto"
+require "sup/undo"
 require "sup/horizontal-selector"
 require "sup/modes/line-cursor-mode"
 require "sup/modes/help-mode"
diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 4de4613..ee30284 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -44,6 +44,7 @@ EOS
     k.add :tag_matching, "Tag matching threads", 'g'
     k.add :apply_to_tagged, "Apply next command to all tagged threads", ';'
     k.add :join_threads, "Force tagged threads to be joined into the same thread", '#'
+    k.add :undo, "Undo the previous action", 'u'
   end
 
   def initialize hidden_labels=[], load_thread_opts={}
@@ -83,6 +84,7 @@ EOS
 
   def reload
     drop_all_threads
+    UndoManager.clear
     BufferManager.draw_screen
     load_threads :num => buffer.content_height
   end
@@ -208,6 +210,10 @@ EOS
     add_or_unhide m
   end
 
+  def undo
+    UndoManager.undo
+  end
+
   def update
     @mutex.synchronize do
       ## let's see you do THIS in python
diff --git a/lib/sup/undo.rb b/lib/sup/undo.rb
new file mode 100644
index 0000000..250433d
--- /dev/null
+++ b/lib/sup/undo.rb
@@ -0,0 +1,42 @@
+module Redwood
+
+## Implements a single undo list for the Sup instance
+##
+## The basic idea is to keep a list of lambdas to undo
+## things. When an action is called (such as 'archive'),
+## a lambda is registered with UndoManager that will
+## undo the archival action
+
+class UndoManager
+  include Singleton
+
+  def initialize
+    @@actionlist = []
+    self.class.i_am_the_instance self
+  end
+
+  def register desc, actions
+    actions = [actions] unless actions.is_a?Array
+    raise StandardError, "when would I need to undo 'nothing?'" unless actions.length > 0
+    Redwood::log "registering #{actions.length} actions: #{desc}"
+    @@actionlist.push({:desc => desc, :actions => actions})
+  end
+
+  def undo
+    unless @@actionlist.length == 0 then
+      actionset = @@actionlist.pop
+      Redwood::log "undoing #{actionset[:desc]}..."
+      actionset[:actions].each{|action|
+        action.call
+      }
+      BufferManager.flash "undid #{actionset[:desc]}"
+    else
+      BufferManager.flash "nothing more to undo"
+    end
+  end
+
+  def clear
+    @@actionlist = []
+  end
+end
+end
-- 
1.5.3

From 61a256d09ec8091e5ab44cc4e0e5c9c24c81a4cf Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:40:39 -0500
Subject: [PATCH] Added undo for archive

---
 lib/sup/modes/inbox-mode.rb        |   35 +++++++++++++++++++++++++++++++++++
 lib/sup/modes/thread-index-mode.rb |   21 +++++++++++++++++++--
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb
index 559892d..21eb9ac 100644
--- a/lib/sup/modes/inbox-mode.rb
+++ b/lib/sup/modes/inbox-mode.rb
@@ -26,12 +26,28 @@ class InboxMode < ThreadIndexMode
 
   def archive
     return unless cursor_thread
+    thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
+
+    undo = lambda {
+      thread.apply_label :inbox
+      add_or_unhide thread.first
+    }
+    UndoManager.register("archiving thread #{thread.first.id}", undo)
+
     cursor_thread.remove_label :inbox
     hide_thread cursor_thread
     regen_text
   end
 
   def multi_archive threads
+    undo = threads.map {|t|
+             lambda{
+               t.apply_label :inbox
+               add_or_unhide t.first
+             }}
+    UndoManager.register("archiving #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text} )
+
     threads.each do |t|
       t.remove_label :inbox
       hide_thread t
@@ -41,6 +57,15 @@ class InboxMode < ThreadIndexMode
 
   def read_and_archive
     return unless cursor_thread
+    thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
+
+    undo = lambda {
+      thread.apply_label :inbox
+      thread.apply_label :unread
+      add_or_unhide thread.first
+    }
+    UndoManager.register("reading and archiving thread ", undo)
+
     cursor_thread.remove_label :unread
     cursor_thread.remove_label :inbox
     hide_thread cursor_thread
@@ -48,6 +73,16 @@ class InboxMode < ThreadIndexMode
   end
 
   def multi_read_and_archive threads
+    undo = threads.map {|t|
+      lambda {
+        t.apply_label :inbox
+        t.apply_label :unread
+        add_or_unhide t.first
+      }
+    }
+    UndoManager.register("reading and archiving #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text})
+
     threads.each do |t|
       t.remove_label :unread
       t.remove_label :inbox
diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index ee30284..120acad 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -259,13 +259,27 @@ EOS
   end
 
   def actually_toggle_archived t
+    thread = t
+    pos = curpos
     if t.has_label? :inbox
       t.remove_label :inbox
+      undo = lambda {
+        thread.apply_label :inbox
+        update_text_for_line pos
+        UpdateManager.relay self,:unarchived, thread.first
+      }
       UpdateManager.relay self, :archived, t.first
     else
       t.apply_label :inbox
+      undo = lambda {
+        thread.remove_label :inbox
+        update_text_for_line pos
+        UpdateManager.relay self, :unarchived, thread.first
+      }
       UpdateManager.relay self, :unarchived, t.first
     end
+
+    return undo
   end
 
   def actually_toggle_spammed t
@@ -290,12 +304,15 @@ EOS
 
   def toggle_archived 
     t = cursor_thread or return
-    actually_toggle_archived t
+    undo = [actually_toggle_archived(t), lambda {self.update_text_for_line curpos}]
+    UndoManager.register("deleting/undeleting thread #{t.first.id}",undo)
     update_text_for_line curpos
   end
 
   def multi_toggle_archived threads
-    threads.each { |t| actually_toggle_archived t }
+    undo = threads.map { |t| actually_toggle_archived t}
+    UndoManager.register("deleting/undeleting #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {self.regen_text})
     regen_text
   end
 
-- 
1.5.3

From e42299ce17ed7c12989d0c8a6dea2ed100921e4a Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:03:57 -0500
Subject: [PATCH] Added undo for starring

---
 lib/sup/modes/thread-index-mode.rb |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 120acad..62fdb85 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -237,24 +237,41 @@ EOS
   end
 
   def actually_toggle_starred t
+    thread = t # cargo cult programming
+    pos = curpos
     if t.has_label? :starred # if ANY message has a star
+      undo = lambda {
+        thread.first.add_label :starred
+        update_text_for_line pos
+        UpdateManager.relay self, :starred, thread.first
+      }
       t.remove_label :starred # remove from all
       UpdateManager.relay self, :unstarred, t.first
     else
+      undo = lambda {
+        thread.remove_label :starred
+        update_text_for_line pos
+        UpdateManager.relay self, :unstarred, thread.first
+      }
       t.first.add_label :starred # add only to first
       UpdateManager.relay self, :starred, t.first
     end
+
+    return undo
   end  
 
   def toggle_starred 
     t = cursor_thread or return
-    actually_toggle_starred t
+    undo = actually_toggle_starred t
+    UndoManager.register("starring/unstarring thread #{t.first.id}",undo)
     update_text_for_line curpos
     cursor_down
   end
 
   def multi_toggle_starred threads
-    threads.each { |t| actually_toggle_starred t }
+    undo = threads.map { |t| actually_toggle_starred t }
+    UndoManager.register("starring/unstarring #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo)
     regen_text
   end
 
-- 
1.5.3

From 31bb0fd8f6e701107ce79ad2dbd9d42da4635742 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:06:36 -0500
Subject: [PATCH] Added undo for spam

---
 lib/sup/modes/thread-index-mode.rb |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 62fdb85..1e02b5b 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -300,13 +300,28 @@ EOS
   end
 
   def actually_toggle_spammed t
+    thread = t
     if t.has_label? :spam
+      undo = lambda {
+        thread.apply_label :spam
+        self.hide_thread thread
+        UpdateManager.relay self,:spammed, thread.first
+      }
       t.remove_label :spam
+      add_or_unhide t.first
       UpdateManager.relay self, :unspammed, t.first
     else
+      undo = lambda {
+        thread.remove_label :spam
+        add_or_unhide thread.first
+        UpdateManager.relay self,:unspammed, thread.first
+      }
       t.apply_label :spam
+      hide_thread t
       UpdateManager.relay self, :spammed, t.first
     end
+
+    return undo
   end
 
   def actually_toggle_deleted t
@@ -390,10 +405,9 @@ EOS
   ## see deleted or spam emails, and when you undelete or unspam them
   ## you also want them to disappear immediately.
   def multi_toggle_spam threads
-    threads.each do |t|
-      actually_toggle_spammed t
-      hide_thread t 
-    end
+    undo = threads.map{ |t| actually_toggle_spammed t}
+    UndoManager.register("marking/unmarking #{threads.size} #{threads.size.pluralize 'thread'} as spam",
+                         undo <<  lambda {self.regen_text})
     regen_text
   end
 
-- 
1.5.3

From d1b5ff3d022e0e6aeabf410b0778fd11a5449ed0 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:08:03 -0500
Subject: [PATCH] Added undo for thread deletion

---
 lib/sup/modes/thread-index-mode.rb |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 1e02b5b..ae7c299 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -326,12 +326,26 @@ EOS
 
   def actually_toggle_deleted t
     if t.has_label? :deleted
+      undo = lambda {
+        t.apply_label :deleted
+        hide_thread t
+        UpdateManager.relay self, :deleted, t.first
+      }
       t.remove_label :deleted
+      add_or_unhide t.first
       UpdateManager.relay self, :undeleted, t.first
     else
+      undo = lambda {
+        t.remove_label :deleted
+        add_or_unhide t.first
+        UpdateManager.relay self, :undeleted, t.first
+      }
       t.apply_label :deleted
+  hide_thread t
       UpdateManager.relay self, :deleted, t.first
     end
+
+    return undo
   end
 
   def toggle_archived 
@@ -418,10 +432,9 @@ EOS
 
   ## see comment for multi_toggle_spam
   def multi_toggle_deleted threads
-    threads.each do |t|
-      actually_toggle_deleted t
-      hide_thread t 
-    end
+    undo = threads.map{ |t| actually_toggle_deleted t}
+    UndoManager.register("deleting/undeleting #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text})
     regen_text
   end
 
-- 
1.5.3

From 9a5ac47e979de8030756b88d4e52b6d8a289a25a Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:10:32 -0500
Subject: [PATCH] Added undo for delete thread

---
 lib/sup/modes/thread-index-mode.rb |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index ae7c299..159839d 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -443,11 +443,18 @@ EOS
     multi_kill [t]
   end
 
+  ## m-m-m-m-MULTI-KILL
   def multi_kill threads
-    threads.each do |t|
+    undo = threads.map do |t|
       t.apply_label :killed
       hide_thread t
+      thread = t
+      lambda { thread.remove_label :killed
+        add_or_unhide thread.first
+      }
     end
+    UndoManager.register("killing #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda {regen_text})
     regen_text
     BufferManager.flash "#{threads.size.pluralize 'Thread'} killed."
   end
-- 
1.5.3

From 1fd41c30189db832abb54f1cda416d0aa624e028 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:11:28 -0500
Subject: [PATCH] Added undo for label edit

---
 lib/sup/modes/thread-index-mode.rb |   27 +++++++++++++++++++++++++--
 1 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index 159839d..f28302b 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -509,6 +509,10 @@ EOS
   def edit_labels
     thread = cursor_thread or return
     speciall = (@hidden_labels + LabelManager::RESERVED_LABELS).uniq
+
+    old_labels = thread.labels
+    pos = curpos
+
     keepl, modifyl = thread.labels.partition { |t| speciall.member? t }
 
     user_labels = BufferManager.ask_for_labels :label, "Labels for thread: ", modifyl, @hidden_labels
@@ -517,6 +521,15 @@ EOS
     thread.labels = keepl + user_labels
     user_labels.each { |l| LabelManager << l }
     update_text_for_line curpos
+
+    undo = lambda{
+      thread.labels = old_labels
+      update_text_for_line pos
+      UpdateManager.relay self, :labeled, thread.first
+    }
+
+    UndoManager.register("labeling thread #{thread.first.id}", undo)
+
     UpdateManager.relay self, :labeled, thread.first
   end
 
@@ -526,8 +539,18 @@ EOS
     
     hl = user_labels.select { |l| @hidden_labels.member? l }
     if hl.empty?
-      threads.each { |t| user_labels.each { |l| t.apply_label l } }
-      user_labels.each { |l| LabelManager << l }
+      undo = threads.map { |t| old_labels = t.labels
+        user_labels.each { |l| t.apply_label l }
+        ## UpdateManager or some other regresh mechanism?
+        UpdateManager.relay self, :labeled, t.first
+        lambda {
+          t.labels = old_labels
+          UpdateManager.relay self, :labeled, t.first
+        }
+      }
+    user_labels.each { |l| LabelManager << l }
+    UndoManager.register("labeling #{threads.size} #{threads.size.pluralize 'thread'}",
+                         undo << lambda { regen_text})
     else
       BufferManager.flash "'#{hl}' is a reserved label!"
     end
-- 
1.5.3

From e7abf80a590aa2f2de35343fceecea9deae41193 Mon Sep 17 00:00:00 2001
From: Mike Stipicevic <stipim at rpi.edu>
Date: Mon, 16 Feb 2009 00:11:46 -0500
Subject: [PATCH] Changed README to reflect addition of undo

---
 README.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/README.txt b/README.txt
index 1b2b516..05349d7 100644
--- a/README.txt
+++ b/README.txt
@@ -80,7 +80,7 @@ Current limitations which will be fixed:
 - Unix-centrism in MIME attachment handling and in sendmail
   invocation.
 
-- Several obvious missing features, like undo, filters / saved
+- Several obvious missing features, like filters / saved
   searches, message annotations, etc.
 
 == SYNOPSYS:
-- 
1.5.3



^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  2009-02-16  8:53 ` Ian Smith
  0 siblings, 1 reply; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2009-02-16  6:25 Michael John Stipicevic
  0 siblings, 0 replies; 40+ messages in thread
From: Michael John Stipicevic @ 2009-02-16  6:25 UTC (permalink / raw)




^ permalink raw reply	[flat|nested] 40+ messages in thread

* [sup-talk] (no subject)
@ 2008-01-05 19:29 thefed
  0 siblings, 0 replies; 40+ messages in thread
From: thefed @ 2008-01-05 19:29 UTC (permalink / raw)


Hey,

I have two GMail accounts, and they're (of course) on the same server.

However, I am unable to add it in sup-add because it says it already  
knows of it.

I am thinking of just altering the sources.yaml file and config.yaml,  
but I do not want to break my system.

Help?
Ari Brown


^ permalink raw reply	[flat|nested] 40+ messages in thread

end of thread, other threads:[~2011-12-10  3:32 UTC | newest]

Thread overview: 40+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-10  3:08 [sup-talk] (no subject) Jason O'Conal
  -- strict thread matches above, loose matches on Subject: below --
2010-11-15  0:49 Matthias Vallentin
2010-11-15  1:42 ` Edward Z. Yang
2010-11-15  6:57   ` Matthias Vallentin
2010-11-15  8:06     ` Helge Titlestad
2010-11-20 19:04       ` Matthias Vallentin
2010-11-21  1:10         ` Tero Tilus
2010-11-21  1:51           ` Matthias Vallentin
2010-11-15  1:46 ` Ben Walton
2010-11-15  1:50 ` Matias Aguirre
2009-06-08  0:02 Ben Walton
2009-06-11 23:50 ` Ben Walton
2009-06-12  3:44   ` William Morgan
2009-06-12 13:15     ` Ben Walton
2009-06-12 18:23 ` William Morgan
2009-06-01  1:01 Ben Walton
2009-06-01  1:04 ` Ben Walton
2009-06-01  2:13 ` Ben Walton
2009-06-04  2:04 ` Ross Macduff
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:45 Michael John Stipicevic
2009-02-16  6:44 Michael John Stipicevic
2009-02-16  6:27 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  8:53 ` Ian Smith
2009-02-16 14:08   ` William Morgan
2009-02-16 14:42     ` Mike Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2009-02-16  6:25 Michael John Stipicevic
2008-01-05 19:29 thefed

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox