sup 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|