sup 0.17.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +17 -0
- data/.travis.yml +12 -0
- data/Gemfile +3 -0
- data/HACKING +42 -0
- data/History.txt +8 -0
- data/Rakefile +12 -0
- data/ReleaseNotes +4 -0
- data/bin/sup-sync +1 -1
- data/bin/sup-tweak-labels +6 -1
- data/contrib/colorpicker.rb +100 -0
- data/contrib/completion/_sup.zsh +114 -0
- data/devel/console.sh +3 -0
- data/devel/count-loc.sh +3 -0
- data/devel/load-index.rb +9 -0
- data/devel/profile.rb +12 -0
- data/devel/start-console.rb +5 -0
- data/doc/FAQ.txt +119 -0
- data/doc/Hooks.txt +79 -0
- data/doc/Philosophy.txt +69 -0
- data/lib/sup/colormap.rb +6 -0
- data/lib/sup/modes/thread_index_mode.rb +12 -1
- data/lib/sup/modes/thread_view_mode.rb +20 -0
- data/lib/sup/version.rb +1 -1
- data/sup.gemspec +55 -0
- data/test/dummy_source.rb +61 -0
- data/test/gnupg_test_home/gpg.conf +1 -0
- data/test/gnupg_test_home/pubring.gpg +0 -0
- data/test/gnupg_test_home/receiver_pubring.gpg +0 -0
- data/test/gnupg_test_home/receiver_secring.gpg +0 -0
- data/test/gnupg_test_home/receiver_trustdb.gpg +0 -0
- data/test/gnupg_test_home/secring.gpg +0 -0
- data/test/gnupg_test_home/sup-test-2@foo.bar.asc +20 -0
- data/test/gnupg_test_home/trustdb.gpg +0 -0
- data/test/integration/test_label_service.rb +18 -0
- data/test/messages/bad-content-transfer-encoding-1.eml +8 -0
- data/test/messages/binary-content-transfer-encoding-2.eml +21 -0
- data/test/messages/missing-line.eml +9 -0
- data/test/test_crypto.rb +109 -0
- data/test/test_header_parsing.rb +168 -0
- data/test/test_helper.rb +7 -0
- data/test/test_message.rb +532 -0
- data/test/test_messages_dir.rb +147 -0
- data/test/test_yaml_migration.rb +85 -0
- data/test/test_yaml_regressions.rb +17 -0
- data/test/unit/service/test_label_service.rb +19 -0
- data/test/unit/test_horizontal_selector.rb +40 -0
- data/test/unit/util/test_query.rb +46 -0
- data/test/unit/util/test_string.rb +57 -0
- data/test/unit/util/test_uri.rb +19 -0
- metadata +81 -36
- checksums.yaml.gz.sig +0 -1
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0193b6fb21e5af566be86fe3e69f8ffc3c91f3cb
|
4
|
+
data.tar.gz: 83d09212502c49ed5eaf6a05a68f7be5d5f66b18
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dbf5ff6caa5e68e6488cc035faee89062392b75cf8ca2ed35e00fd48154e491d4db1a465334c412759d27a54be6ec9b651ff5d8409fdcf945abae54b7123732
|
7
|
+
data.tar.gz: 961d4cf7a8798a757dd2edac9789179e6ca636d3e2ba49855af58f4f00b976faa4d6b05c19b87ef86c056d2039f3b5ee37aba2b04aa5d80e7dc603cc7ebc3bbb
|
data/.gitignore
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# i use vi
|
2
|
+
*.swp
|
3
|
+
# i use emacs
|
4
|
+
*~
|
5
|
+
# artifact
|
6
|
+
pkg/
|
7
|
+
*.gem
|
8
|
+
# i have accidently added this one one too many times
|
9
|
+
sup-exception-log.txt
|
10
|
+
|
11
|
+
# bundler stuff
|
12
|
+
Gemfile.lock
|
13
|
+
.bundle
|
14
|
+
|
15
|
+
# generated file for gnupg test
|
16
|
+
test/gnupg_test_home/random_seed
|
17
|
+
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/HACKING
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
Running Sup from your git checkout
|
2
|
+
----------------------------------
|
3
|
+
|
4
|
+
Invoke it like this:
|
5
|
+
|
6
|
+
ruby -I lib -w bin/sup
|
7
|
+
|
8
|
+
You'll have to install all gems mentioned in the Rakefile (look for the line
|
9
|
+
setting p.extra_deps). If you're on a Debian or Debian-based system (e.g.
|
10
|
+
Ubuntu), you'll have to make sure you have a complete Ruby installation,
|
11
|
+
especially libssl-ruby. You will need libruby-devel, gcc, and rake installed
|
12
|
+
to build certain gems like Xapian. Gem install does not do a good job of
|
13
|
+
detecting when these things are missing and the build fails.
|
14
|
+
|
15
|
+
Rubygems also is particularly aggressive about picking up libraries from
|
16
|
+
installed gems. If you do have Sup installed as a gem, please examine
|
17
|
+
backtraces to make sure you're loading files from the repository and NOT from
|
18
|
+
the installed gem before submitting any bug reports.
|
19
|
+
|
20
|
+
Coding standards
|
21
|
+
----------------
|
22
|
+
|
23
|
+
- Don't wrap code unless it really benefits from it.
|
24
|
+
- Do wrap comments at 72 characters.
|
25
|
+
- Old lisp-style comment differentiations:
|
26
|
+
# one for comments on the same line as a line of code
|
27
|
+
## two for comments on their own line, except:
|
28
|
+
### three for comments that demarcate large sections of code (rare)
|
29
|
+
- Use {} for one-liner blocks and do/end for multi-line blocks.
|
30
|
+
- I like poetry mode. Don't use parentheses unless you must.
|
31
|
+
- The one exception to poetry mode is if-statements that have an assignment in
|
32
|
+
the condition. To make it clear this is not a comparison, surround the
|
33
|
+
condition by parentheses. E.g.:
|
34
|
+
if a == b if(a = some.computation)
|
35
|
+
... BUT ... something with a
|
36
|
+
end end
|
37
|
+
- and/or versus ||/&&. In Ruby, "and" and "or" bind very loosely---even
|
38
|
+
more loosely than function application. This makes them ideal for
|
39
|
+
end-of-line short-circuit control in poetry mode. So, use || and &&
|
40
|
+
for ordinary logical comparisons, and "and" and "or" for end-of-line
|
41
|
+
flow control. E.g.:
|
42
|
+
x = a || b or raise "neither is true"
|
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.18.0 / 2014-05-19
|
2
|
+
|
3
|
+
* new color option, :with_attachment for defining colors for the
|
4
|
+
attachment character.
|
5
|
+
* sup-tweak-labels works again (out of service since sync_back).
|
6
|
+
* gem building is done through bundler
|
7
|
+
* you can now kill a thread using & from thread_view
|
8
|
+
|
1
9
|
== 0.17.0 / 2014-04-11
|
2
10
|
|
3
11
|
* add continuous scrolling to thread view
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
|
5
|
+
Rake::TestTask.new(:test) do |test|
|
6
|
+
test.libs << 'test'
|
7
|
+
test.test_files = FileList.new('test/**/test_*.rb')
|
8
|
+
test.verbose = true
|
9
|
+
end
|
10
|
+
task :default => :test
|
11
|
+
|
12
|
+
task :travis => [:test, :build]
|
data/ReleaseNotes
CHANGED
data/bin/sup-sync
CHANGED
@@ -175,7 +175,7 @@ begin
|
|
175
175
|
puts "Changing flags for #{source}##{m.source_info} from #{old_m.labels} to #{m.labels}" if opts[:verbose]
|
176
176
|
num_updated += 1
|
177
177
|
end
|
178
|
-
else fail
|
178
|
+
else fail "sup-sync cannot handle :update's"
|
179
179
|
end
|
180
180
|
|
181
181
|
if Time.now - last_info_time > PROGRESS_UPDATE_INTERVAL
|
data/bin/sup-tweak-labels
CHANGED
@@ -51,6 +51,7 @@ EOS
|
|
51
51
|
opt :very_verbose, "Print message names and subjects as they're processed."
|
52
52
|
opt :all_sources, "Scan over all sources.", :short => :none
|
53
53
|
opt :dry_run, "Don't actually modify the index. Probably only useful with --verbose.", :short => "-n"
|
54
|
+
opt :no_sync_back, "Do not sync back to the original Maildir."
|
54
55
|
opt :version, "Show version information", :short => :none
|
55
56
|
end
|
56
57
|
opts[:verbose] = true if opts[:very_verbose]
|
@@ -63,6 +64,7 @@ Trollop::die "nothing to do: no labels to add or remove" if add_labels.empty? &&
|
|
63
64
|
Redwood::start
|
64
65
|
index = Redwood::Index.init
|
65
66
|
index.lock_interactively or exit
|
67
|
+
|
66
68
|
begin
|
67
69
|
index.load
|
68
70
|
|
@@ -106,7 +108,10 @@ begin
|
|
106
108
|
puts "From #{m.from}, subject: #{m.subj}" if opts[:very_verbose]
|
107
109
|
puts "#{m.id}: {#{old_labels.to_a.join ','}} => {#{m.labels.to_a.join ','}}" if opts[:verbose]
|
108
110
|
puts if opts[:very_verbose]
|
109
|
-
|
111
|
+
unless opts[:dry_run]
|
112
|
+
index.update_message_state [m, false]
|
113
|
+
m.sync_back unless opts[:no_sync_back]
|
114
|
+
end
|
110
115
|
end
|
111
116
|
|
112
117
|
if Time.now - last_info_time > 60
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
require 'ncursesw'
|
4
|
+
|
5
|
+
Ncurses.initscr
|
6
|
+
Ncurses.noecho
|
7
|
+
Ncurses.cbreak
|
8
|
+
Ncurses.start_color
|
9
|
+
|
10
|
+
Ncurses.curs_set 0
|
11
|
+
Ncurses.move 0, 0
|
12
|
+
Ncurses.clear
|
13
|
+
Ncurses.refresh
|
14
|
+
cc = Ncurses.COLORS
|
15
|
+
|
16
|
+
Ncurses::keypad(Ncurses::stdscr, 1)
|
17
|
+
Ncurses::mousemask(Ncurses::ALL_MOUSE_EVENTS | Ncurses::REPORT_MOUSE_POSITION, [])
|
18
|
+
|
19
|
+
fail "color count is #{cc}, expected 256" unless cc == 256
|
20
|
+
|
21
|
+
1.upto(255) do |c|
|
22
|
+
Ncurses.init_pair(c, 0, c)
|
23
|
+
end
|
24
|
+
|
25
|
+
def cell y, x, c
|
26
|
+
@map[[y,x]] = c
|
27
|
+
Ncurses.attron(Ncurses.COLOR_PAIR(c))
|
28
|
+
Ncurses.mvaddstr(y, x, " ")
|
29
|
+
Ncurses.attroff(Ncurses.COLOR_PAIR(c))
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_click y, x
|
33
|
+
c = @map[[y,x]] or return
|
34
|
+
name = case c
|
35
|
+
when 0...16
|
36
|
+
c.to_s
|
37
|
+
when 16...232
|
38
|
+
'c' + (c-16).to_s(6).rjust(3,'0')
|
39
|
+
when 232...256
|
40
|
+
'g' + (c-232).to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
Ncurses.mvaddstr 11, 0, "#{name} "
|
44
|
+
|
45
|
+
Ncurses.attron(Ncurses.COLOR_PAIR(c))
|
46
|
+
10.times do |i|
|
47
|
+
20.times do |j|
|
48
|
+
y = 13 + i
|
49
|
+
x = j
|
50
|
+
Ncurses.mvaddstr(y, x, " ")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
Ncurses.attroff(Ncurses.COLOR_PAIR(c))
|
54
|
+
end
|
55
|
+
|
56
|
+
@map = {}
|
57
|
+
@fg = @bg = 0
|
58
|
+
|
59
|
+
begin
|
60
|
+
16.times do |i|
|
61
|
+
cell 0, i, i
|
62
|
+
end
|
63
|
+
|
64
|
+
6.times do |i|
|
65
|
+
6.times do |j|
|
66
|
+
6.times do |k|
|
67
|
+
c = 16 + 6*6*i + 6*j + k
|
68
|
+
y = 2 + j
|
69
|
+
x = 7*i + k
|
70
|
+
cell y, x, c
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
16.times do |i|
|
76
|
+
c = 16 + 6*6*6 + i
|
77
|
+
cell 9, i, c
|
78
|
+
end
|
79
|
+
|
80
|
+
handle_click 0, 0
|
81
|
+
Ncurses.refresh
|
82
|
+
|
83
|
+
while (c = Ncurses.getch)
|
84
|
+
case c
|
85
|
+
when 113 #q
|
86
|
+
break
|
87
|
+
when Ncurses::KEY_MOUSE
|
88
|
+
mev = Ncurses::MEVENT.new
|
89
|
+
Ncurses.getmouse(mev)
|
90
|
+
case(mev.bstate)
|
91
|
+
when Ncurses::BUTTON1_CLICKED
|
92
|
+
handle_click mev.y, mev.x
|
93
|
+
end
|
94
|
+
end
|
95
|
+
Ncurses.refresh
|
96
|
+
end
|
97
|
+
|
98
|
+
ensure
|
99
|
+
Ncurses.endwin
|
100
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#compdef sup sup-add sup-config sup-dump sup-sync sup-tweak-labels sup-recover-sources
|
2
|
+
# vim: set et sw=2 sts=2 ts=2 ft=zsh :
|
3
|
+
|
4
|
+
# TODO: sources completion: maildir://some/dir, mbox://some/file, ...
|
5
|
+
# for sup-add, sup-sync, sup-tweak-labels
|
6
|
+
|
7
|
+
(( ${+functions[_sup_cmd]} )) ||
|
8
|
+
_sup_cmd()
|
9
|
+
{
|
10
|
+
_arguments -s : \
|
11
|
+
"(--list-hooks -l)"{--list-hooks,-l}"[list all hooks and descriptions, and quit]" \
|
12
|
+
"(--no-threads -n)"{--no-threads,-n}"[turn off threading]" \
|
13
|
+
"(--no-initial-poll -o)"{--no-initial-poll,-o}"[Don't poll for new messages when starting]" \
|
14
|
+
"(--search -s)"{--search,-s}"[search for this query upon startup]:Query: " \
|
15
|
+
"(--compose -c)"{--compose,-c}"[compose message to this recipient upon startup]:Email: " \
|
16
|
+
"--version[show version information]" \
|
17
|
+
"(--help -h)"{--help,-h}"[show help]"
|
18
|
+
}
|
19
|
+
|
20
|
+
(( ${+functions[_sup_add_cmd]} )) ||
|
21
|
+
_sup_add_cmd()
|
22
|
+
{
|
23
|
+
_arguments -s : \
|
24
|
+
"(--archive -a)"{--archive,-a}"[automatically archive all new messages from this source]" \
|
25
|
+
"(--unusual -u)"{--unusual,-u}"[do not automatically poll for new messages from this source]" \
|
26
|
+
"(--labels -l)"{--labels,-l}"[set of labels to apply to all messages from this source]:Labels: " \
|
27
|
+
"(--force-new -f)"{--force-new,-f}"[create a new account for this source, even if one already exists]" \
|
28
|
+
"--version[show version information]" \
|
29
|
+
"(--help -h)"{--help,-h}"[show help]"
|
30
|
+
}
|
31
|
+
|
32
|
+
(( ${+functions[_sup_config_cmd]} )) ||
|
33
|
+
_sup_config_cmd()
|
34
|
+
{
|
35
|
+
_arguments -s : \
|
36
|
+
"--version[show version information]" \
|
37
|
+
"(--help -h)"{--help,-h}"[show help]"
|
38
|
+
}
|
39
|
+
|
40
|
+
(( ${+functions[_sup_dump_cmd]} )) ||
|
41
|
+
_sup_dump_cmd()
|
42
|
+
{
|
43
|
+
_arguments -s : \
|
44
|
+
"--version[show version information]" \
|
45
|
+
"(--help -h)"{--help,-h}"[show help]"
|
46
|
+
}
|
47
|
+
|
48
|
+
(( ${+functions[_sup_recover_sources_cmd]} )) ||
|
49
|
+
_sup_recover_sources_cmd()
|
50
|
+
{
|
51
|
+
_arguments -s : \
|
52
|
+
"--archive[automatically archive all new messages from this source]" \
|
53
|
+
"--scan-num[number of messages to scan per source]:" \
|
54
|
+
"--unusual[do not automatically poll for new messages from this source]" \
|
55
|
+
"(--help -h)"{--help,-h}"[show help]"
|
56
|
+
}
|
57
|
+
|
58
|
+
(( ${+functions[_sup_sync_cmd]} )) ||
|
59
|
+
_sup_sync_cmd()
|
60
|
+
{
|
61
|
+
# XXX Add only when --restore is given: (--restored -r)
|
62
|
+
# Add only when --changed or--all are given: (--start-at -s)
|
63
|
+
_arguments -s : \
|
64
|
+
"--new[operate on new messages only]" \
|
65
|
+
"(--changed -c)"{--changed,-c}"[scan over the entire source for messages that have been deleted, altered, or moved from another source]" \
|
66
|
+
"(--restored -r)"{--restored,-r}"[operate only on those messages included in a dump file as specified by --restore which have changed state]" \
|
67
|
+
"(--all -a)"{--all,-a}"[operate on all messages in the source, regardless of newness or changedness]" \
|
68
|
+
"(--start-at -s)"{--start-at,-s}"[start at a particular offset]:Offset: " \
|
69
|
+
"--asis[if the message is already in the index, preserve its state, otherwise, use default source state]" \
|
70
|
+
"--restore[restore message state from a dump file created with sup-dump]:File:_file" \
|
71
|
+
"--discard[discard any message state in the index and use the default source state]" \
|
72
|
+
"(--archive -x)"{--archive,-x}"[mark messages as archived when using the default source state]" \
|
73
|
+
"(--read -e)"{--read,-e}"[mark messages as read when using the default source state]" \
|
74
|
+
"--extra-labels[apply these labels when using the default source state]:Labels: " \
|
75
|
+
"(--verbose -v)"{--verbose,-v}"[print message ids as they're processed]" \
|
76
|
+
"(--optimize -o)"{--optimize,-o}"[as the final operation, optimize the index]" \
|
77
|
+
"--all-sources[scan over all sources]" \
|
78
|
+
"(--dry-run -n)"{--dry-run,-n}"[don't actually modify the index]" \
|
79
|
+
"--version[show version information]" \
|
80
|
+
"(--help -h)"{--help,-h}"[show help]"
|
81
|
+
}
|
82
|
+
|
83
|
+
(( ${+functions[_sup_sync_back_cmd]} )) ||
|
84
|
+
_sup_sync_back_cmd()
|
85
|
+
{
|
86
|
+
_arguments -s : \
|
87
|
+
"(--drop-deleted -d)"{--drop-deleted,-d}"[drop deleted messages]" \
|
88
|
+
"--move-deleted[move deleted messages to a local mbox file]:File:_file" \
|
89
|
+
"(--drop-spam -s)"{--drop-spam,-s}"[drop spam messages]" \
|
90
|
+
"--move-spam[move spam messages to a local mbox file]:File:_file" \
|
91
|
+
"--with-dotlockfile[specific dotlockfile location (mbox files only)]:File:_file" \
|
92
|
+
"--dont-use-dotlockfile[don't use dotlockfile to lock mbox files]" \
|
93
|
+
"(--verbose -v)"{--verbose,-v}"[print message ids as they're processed]" \
|
94
|
+
"(--dry-run -n)"{--dry-run,-n}"[don't actually modify the index]" \
|
95
|
+
"--version[show version information]" \
|
96
|
+
"(--help -h)"{--help,-h}"[show help]"
|
97
|
+
}
|
98
|
+
|
99
|
+
(( ${+functions[_sup_tweak_labels_cmd]} )) ||
|
100
|
+
_sup_tweak_labels_cmd()
|
101
|
+
{
|
102
|
+
_arguments -s : \
|
103
|
+
"(--add -a)"{--add,-a}"[which labels to add to every message from the specified sources]:Labels: " \
|
104
|
+
"(--remove -r)"{--remove,-r}"[which labels to remove from every message from the specified sources]:Labels: " \
|
105
|
+
"--all-sources[scan over all sources]" \
|
106
|
+
"(--verbose -v)"{--verbose,-v}"[print message ids as they're processed]" \
|
107
|
+
"(--dry-run -n)"{--dry-run,-n}"[don't actually modify the index]" \
|
108
|
+
"--version[show version information]" \
|
109
|
+
"(--help -h)"{--help,-h}"[show help]"
|
110
|
+
}
|
111
|
+
|
112
|
+
_call_function ret _${words[1]//-/_}_cmd
|
113
|
+
return ret
|
114
|
+
|
data/devel/console.sh
ADDED
data/devel/count-loc.sh
ADDED
data/devel/load-index.rb
ADDED
data/devel/profile.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ruby-prof'
|
3
|
+
require "redwood"
|
4
|
+
|
5
|
+
result = RubyProf.profile do
|
6
|
+
Redwood::ThreadSet.new(ARGV.map { |fn| Redwood::MBox::Scanner.new fn }).load_n_threads 100
|
7
|
+
end
|
8
|
+
|
9
|
+
printer = RubyProf::GraphHtmlPrinter.new(result)
|
10
|
+
File.open("profile.html", "w") { |f| printer.print(f, 1) }
|
11
|
+
puts "report in profile.html"
|
12
|
+
|
data/doc/FAQ.txt
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
Sup FAQ
|
2
|
+
-------
|
3
|
+
|
4
|
+
Q: What is Sup?
|
5
|
+
A: A console-based email client for people with a lot of email.
|
6
|
+
|
7
|
+
Q: What does Sup stand for?
|
8
|
+
A: "What's up?"
|
9
|
+
|
10
|
+
Q: Sup looks like a text-based Gmail.
|
11
|
+
A: First I stole their ideas. Then I improved them.
|
12
|
+
|
13
|
+
Q: Why not just use Gmail?
|
14
|
+
A: I hate ads, I hate using a mouse, and I hate non-programmability and
|
15
|
+
non-extensibility.
|
16
|
+
|
17
|
+
Also, Gmail doesn't let you use a monospace font, which is just
|
18
|
+
lame.
|
19
|
+
|
20
|
+
Also, Gmail encourages top-posting. THIS CANNOT BE TOLERATED!
|
21
|
+
|
22
|
+
Q: Why the console?
|
23
|
+
A: Because a keystroke is worth a hundred mouse clicks, as any Unix
|
24
|
+
user knows. Because you don't need a web browser. Because you get
|
25
|
+
an instantaneous response and a simple interface.
|
26
|
+
|
27
|
+
Q: How does Sup deal with spam?
|
28
|
+
A: You can manually mark messages as spam, which prevents them from
|
29
|
+
showing up in future searches. Later, you can run a batch process to
|
30
|
+
remove such messages from your sources. That's as far as Sup goes.
|
31
|
+
Spam filtering should be done by a dedicated tool like SpamAssassin.
|
32
|
+
|
33
|
+
Q: How do I delete a message?
|
34
|
+
A: Why delete? Unless it's spam, you might as well just archive it.
|
35
|
+
|
36
|
+
Q: C'mon, really now!
|
37
|
+
A: Ok, press the 'd' key.
|
38
|
+
|
39
|
+
Q: But I want to delete it for real, not just add a 'deleted' flag in
|
40
|
+
the index. I want it gone from disk!
|
41
|
+
A: Currently, for mbox sources, there is a batch deletion tool that
|
42
|
+
will strip out all messages marked as spam or deleted.
|
43
|
+
|
44
|
+
Q: How well does Sup play with other mail clients?
|
45
|
+
A: Not well at all. If messages have been moved, deleted, or altered
|
46
|
+
due to some other client, Sup will have to rebuild its index for
|
47
|
+
that message source. For example, for mbox files, reading a single
|
48
|
+
unread message changes the offsets of every file on disk. Rather
|
49
|
+
than rescanning every time, Sup assumes sources don't change except
|
50
|
+
by having new messages added. If that assumption is violated,
|
51
|
+
you'll have to sync the index.
|
52
|
+
|
53
|
+
Q: How do I back up my index?
|
54
|
+
A: Since the contents of the messages are recoverable from their
|
55
|
+
sources using sup-sync, all you need to back up is the message
|
56
|
+
state. To do this, simply run:
|
57
|
+
sup-dump > <dumpfile>
|
58
|
+
This will save all message state in a big text file, which you
|
59
|
+
should probably compress.
|
60
|
+
|
61
|
+
Q: How do I restore the message state I saved in my state dump?
|
62
|
+
A: Run:
|
63
|
+
sup-sync [<source>+] --restored --restore <dumpfile>
|
64
|
+
where <dumpfile> was created as above.
|
65
|
+
|
66
|
+
Q: Xapian crashed and I can't read my index. Luckily I made a state
|
67
|
+
dump. What should I do?
|
68
|
+
Q: How do I rebuild the index completely?
|
69
|
+
A: Run:
|
70
|
+
rm -rf ~/.sup/xapian # omg wtf
|
71
|
+
sup-sync --all-sources --all --restore <dumpfile>
|
72
|
+
Voila! A brand new index.
|
73
|
+
|
74
|
+
Q: I want to move messages from one source to another. (E.g., my
|
75
|
+
primary inbox is an mbox file, and I want to move some of those
|
76
|
+
messages to a Maildir.) How do I do that while preserving message
|
77
|
+
state?
|
78
|
+
A: Move the messages from the source to the target using whatever tool
|
79
|
+
you'd like. Mutt's a good one. :) Then run:
|
80
|
+
sup-sync --changed <source1> <source2>
|
81
|
+
|
82
|
+
Note that if you sup-sync only one source at a time, depending on
|
83
|
+
the order in which you do it, the messages may be treated as
|
84
|
+
missing and then deleted from the index, which means that their
|
85
|
+
states will be lost when you sync the other source. So do them both
|
86
|
+
in one go.
|
87
|
+
|
88
|
+
Q: What are all these "Redwood" references I see in the code?
|
89
|
+
A: That was Sup's original name. (Think pine, elm. Although I was a
|
90
|
+
Mutt user, I couldn't think of a good progression there.) But it was
|
91
|
+
taken by another project on RubyForge, and wasn't that original, and
|
92
|
+
was too long to type anyways.
|
93
|
+
|
94
|
+
Common Problems
|
95
|
+
---------------
|
96
|
+
|
97
|
+
P: I get some error message from Rubymail about frozen strings when
|
98
|
+
importing messages with attachments.
|
99
|
+
S: The current solution is to directly modify RubyMail. Change line 159 of
|
100
|
+
multipart.rb to:
|
101
|
+
chunk = chunk[0..start]
|
102
|
+
This is because RubyMail hasn't been updated since like Ruby 1.8.2.
|
103
|
+
Please bug Matt Armstrong.
|
104
|
+
|
105
|
+
P: I see this error:
|
106
|
+
/usr/local/lib/ruby/1.8/yaml.rb:133:in `transfer': allocator undefined for Bignum (TypeError)
|
107
|
+
S: You need to upgrade to Ruby 1.8.5. YAML in earlier versions can't
|
108
|
+
parse BigNums, but Sup relies on that for Maildir.
|
109
|
+
|
110
|
+
P: When I run Sup remotely and view an HTML attachment, an existing
|
111
|
+
Firefox on the *local* machine is redirected to the attachment
|
112
|
+
file, which it can't find (since it's on the remote machine). How do
|
113
|
+
I view HTML attachments in this environment?
|
114
|
+
S: Put this in your ~/.mailcap on the machine you run Sup on:
|
115
|
+
text/html; /usr/bin/firefox -a sup %s; description=HTML Text; test=test -n "$DISPLAY"; nametemplate=%s.html
|
116
|
+
|
117
|
+
Please read
|
118
|
+
https://github.com/sup-heliotrope/sup/wiki/Viewing-Attachments for
|
119
|
+
some security concerns on opening attachments.
|