sup 1.0 → 1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/checks.yml +70 -0
- data/.rubocop.yml +5 -0
- data/CONTRIBUTORS +3 -2
- data/Gemfile +5 -1
- data/History.txt +20 -0
- data/Manifest.txt +149 -0
- data/README.md +9 -3
- data/Rakefile +40 -1
- data/bin/sup-add +4 -8
- data/ext/mkrf_conf_xapian.rb +10 -4
- data/lib/sup/colormap.rb +1 -1
- data/lib/sup/hook.rb +1 -1
- data/lib/sup/index.rb +2 -2
- data/lib/sup/keymap.rb +1 -1
- data/lib/sup/maildir.rb +4 -4
- data/lib/sup/mbox.rb +4 -4
- data/lib/sup/message.rb +6 -5
- data/lib/sup/message_chunks.rb +27 -19
- data/lib/sup/modes/completion_mode.rb +0 -1
- data/lib/sup/modes/file_browser_mode.rb +2 -2
- data/lib/sup/modes/label_list_mode.rb +1 -1
- data/lib/sup/modes/search_list_mode.rb +2 -2
- data/lib/sup/modes/thread_view_mode.rb +1 -2
- data/lib/sup/rfc2047.rb +21 -6
- data/lib/sup/source.rb +8 -2
- data/lib/sup/textfield.rb +0 -1
- data/lib/sup/thread.rb +0 -1
- data/lib/sup/util.rb +28 -48
- data/lib/sup/version.rb +1 -1
- data/lib/sup.rb +12 -8
- data/man/sup-add.1 +15 -15
- data/man/sup-config.1 +11 -11
- data/man/sup-dump.1 +9 -9
- data/man/sup-import-dump.1 +15 -15
- data/man/sup-psych-ify-config-files.1 +9 -9
- data/man/sup-recover-sources.1 +12 -12
- data/man/sup-sync-back-maildir.1 +14 -14
- data/man/sup-sync.1 +20 -20
- data/man/sup-tweak-labels.1 +16 -16
- data/man/sup.1 +21 -21
- data/sup.gemspec +6 -4
- data/test/dummy_source.rb +21 -15
- data/test/fixtures/embedded-message.eml +34 -0
- data/test/fixtures/non-ascii-header-in-nested-message.eml +36 -0
- data/test/fixtures/non-ascii-header.eml +8 -0
- data/test/fixtures/rfc2047-header-encoding.eml +15 -0
- data/test/fixtures/text-attachments-with-charset.eml +15 -1
- data/test/fixtures/utf8-header.eml +17 -0
- data/test/integration/test_mbox.rb +1 -1
- data/test/integration/test_sup-add.rb +83 -0
- data/test/test_crypto.rb +44 -0
- data/test/test_header_parsing.rb +9 -1
- data/test/test_helper.rb +7 -4
- data/test/test_message.rb +124 -32
- data/test/test_messages_dir.rb +13 -15
- data/test/unit/test_horizontal_selector.rb +4 -4
- data/test/unit/test_locale_fiddler.rb +1 -1
- data/test/unit/util/test_query.rb +1 -1
- data/test/unit/util/test_string.rb +3 -3
- data/test/unit/util/test_uri.rb +2 -2
- metadata +46 -18
- data/.travis.yml +0 -18
- data/bin/sup-psych-ify-config-files +0 -21
- data/test/integration/test_label_service.rb +0 -18
- data/test/test_yaml_migration.rb +0 -85
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93d027a0f383edb73d1a2900ca991d8d8d8daca922f0088c18f5281ca04daeb4
|
4
|
+
data.tar.gz: 31b25e512227252a498baa651ea9b026ba452274dd5c67c99412dc2ef54f3e7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06211d3a91b76d20396afe9323bdf62d14acf61d13688333ae8f6409b55ff2120037df11e0a5e62e869e476868307a42216ee34e28f3621a05da0f9953a6cda3
|
7
|
+
data.tar.gz: f17bac030201cdabd4c6e3313a4178fb03f65f70992dcd4364cde425d1fd658408973b1758c7d45b13140dddde0e92f34006d6085140bbbb76164081083e9006
|
@@ -0,0 +1,70 @@
|
|
1
|
+
name: checks
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- develop
|
6
|
+
pull_request:
|
7
|
+
branches:
|
8
|
+
- develop
|
9
|
+
permissions:
|
10
|
+
contents: read
|
11
|
+
jobs:
|
12
|
+
rake-ci:
|
13
|
+
strategy:
|
14
|
+
fail-fast: false
|
15
|
+
matrix:
|
16
|
+
os:
|
17
|
+
- ubuntu-latest
|
18
|
+
- macos-latest
|
19
|
+
ruby-version:
|
20
|
+
- '2.0'
|
21
|
+
- '2.1'
|
22
|
+
# Ruby 2.2 fails installing sup gem with a nonsensical error:
|
23
|
+
# Could not find 'xapian-ruby' (~> 1.2) among 21 total gem(s)
|
24
|
+
#- '2.2'
|
25
|
+
- '2.3'
|
26
|
+
- '2.4'
|
27
|
+
- '2.5'
|
28
|
+
- '2.6'
|
29
|
+
- '2.7'
|
30
|
+
- '3.0'
|
31
|
+
- '3.1'
|
32
|
+
exclude:
|
33
|
+
# xapian-bindings 1.2.2 fails to build on MacOS:
|
34
|
+
# clang: warning: include path for libstdc++ headers not found; pass
|
35
|
+
# '-stdlib=libc++' on the command line to use the libc++ standard
|
36
|
+
# library instead [-Wstdlibcxx-not-found]
|
37
|
+
# xapian_wrap.cc:1836:10: fatal error: 'string' file not found
|
38
|
+
# Probably just wrong compiler command or some mess that I can't be
|
39
|
+
# bothered to figure out.
|
40
|
+
- os: macos-latest
|
41
|
+
ruby-version: '2.0'
|
42
|
+
# xapian-bindings 1.4.18 fails to build with Ruby 3.0+ on MacOS:
|
43
|
+
# error: '__declspec' attributes are not enabled; use '-fdeclspec' or
|
44
|
+
# '-fms-extensions' to enable support for __declspec attributes
|
45
|
+
# Needs this fix:
|
46
|
+
# https://github.com/xapian/xapian/commit/63a06768a250b0bb4821b835f011e8214d560f8e
|
47
|
+
- os: macos-latest
|
48
|
+
ruby-version: '3.0'
|
49
|
+
- os: macos-latest
|
50
|
+
ruby-version: '3.1'
|
51
|
+
runs-on: ${{ matrix.os }}
|
52
|
+
steps:
|
53
|
+
- name: Install pandoc
|
54
|
+
run: sudo apt-get install -y pandoc
|
55
|
+
if: runner.os == 'Linux'
|
56
|
+
- name: Install pandoc
|
57
|
+
run: brew install pandoc
|
58
|
+
if: runner.os == 'macOS'
|
59
|
+
- uses: actions/checkout@v3
|
60
|
+
with:
|
61
|
+
submodules: recursive
|
62
|
+
- name: Set up Ruby
|
63
|
+
uses: ruby/setup-ruby@v1
|
64
|
+
with:
|
65
|
+
ruby-version: ${{ matrix.ruby-version }}
|
66
|
+
bundler-cache: true
|
67
|
+
- name: Run Rake ci task
|
68
|
+
run: bundle exec rake ci
|
69
|
+
- name: Test gem installation
|
70
|
+
run: gem install pkg/sup-*.gem
|
data/.rubocop.yml
ADDED
data/CONTRIBUTORS
CHANGED
@@ -2,22 +2,22 @@ William Morgan <william at the twitter dot coms>
|
|
2
2
|
Rich Lane <rlane at the club.cc.cmu dot edus>
|
3
3
|
Gaute Hope <eg at the gaute.vetsj dot coms>
|
4
4
|
Whyme Lyu <callme5long at the gmail dot coms>
|
5
|
+
Dan Callaghan <djc at the djc.id dot aus>
|
5
6
|
Hamish Downer <dmishd at the gmail dot coms>
|
6
7
|
Zeger-Jan van de Weg <mail at the zjvandeweg dot nls>
|
7
8
|
Damien Leone <damien.leone at the fensalir dot frs>
|
8
9
|
Sascha Silbe <sascha-pgp at the silbe dot orgs>
|
10
|
+
Iain Parris <ipv2.vcs at the parris dot orgs>
|
9
11
|
Eric Weikl <eric.weikl at the gmx dot nets>
|
10
12
|
Paweł Wilk <siefca at the gnu dot orgs>
|
11
13
|
Matthieu Rakotojaona <matthieu.rakotojaona at the gmail dot coms>
|
12
14
|
Ismo Puustinen <ismo at the iki dot fis>
|
13
|
-
Dan Callaghan <djc at the djc.id dot aus>
|
14
15
|
Nicolas Pouillard <nicolas.pouillard at the gmail dot coms>
|
15
16
|
Michael Stapelberg <michael at the stapelberg dot des>
|
16
17
|
Eric Sherman <hyperbolist at the gmail dot coms>
|
17
18
|
Tero Tilus <tero at the tilus dot nets>
|
18
19
|
Ben Walton <bwalton at the artsci.utoronto dot cas>
|
19
20
|
Scott Bonds <scott at the ggr dot coms>
|
20
|
-
Iain Parris <ipv2.vcs at the parris dot orgs>
|
21
21
|
Mike Stipicevic <stipim at the rpi dot edus>
|
22
22
|
Martin Bähr <mbaehr at the societyserver dot orgs>
|
23
23
|
Timon Vonk <timonv at the gmail dot coms>
|
@@ -87,6 +87,7 @@ Todd Eisenberger <teisenbe at the andrew.cmu dot edus>
|
|
87
87
|
Johannes Larsen <mail at the johslarsen dot nets>
|
88
88
|
Steven Schmeiser <steven at the schmeiser dot orgs>
|
89
89
|
Steven Walter <swalter at the monarch.(none)>
|
90
|
+
Utkarsh Gupta <utkarsh at the debian dot orgs>
|
90
91
|
Michael Dwyer <mdwyer at the michaelmdwyer dot coms>
|
91
92
|
Kyle Hunt <Kyle_Hunt at the ymail dot coms>
|
92
93
|
William A. Kennington III <william at the wkennington dot coms>
|
data/Gemfile
CHANGED
@@ -2,7 +2,11 @@ source 'https://rubygems.org/'
|
|
2
2
|
|
3
3
|
if !RbConfig::CONFIG['arch'].include?('openbsd')
|
4
4
|
# update version in ext/mkrf_conf_xapian.rb as well.
|
5
|
-
|
5
|
+
if /^2\.0\./ =~ RUBY_VERSION
|
6
|
+
gem 'xapian-ruby', ['~> 1.2', '< 1.3.6']
|
7
|
+
else
|
8
|
+
gem 'xapian-ruby', '~> 1.2'
|
9
|
+
end
|
6
10
|
end
|
7
11
|
|
8
12
|
gemspec
|
data/History.txt
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
== 1.1 / 2022-05-23
|
2
|
+
|
3
|
+
* #588, #577: Sup is now compatible with and tested on Ruby 3.0 and Ruby 3.1.
|
4
|
+
* When the Sup gem installs xapian-ruby, it will install to the user gem
|
5
|
+
directory if the system gem directory is not writable. (Iain Parris)
|
6
|
+
* #571: To and From addresses of enclosed messages are now displayed normally,
|
7
|
+
instead of as Redwood::Person objects. (Iain Parris)
|
8
|
+
* #570: Fixed wording when displaying enclosed messages without Date header.
|
9
|
+
(Iain Parris)
|
10
|
+
* #205, #602: UTF-8 header values are now accepted and handled correctly, as
|
11
|
+
per RFC6532.
|
12
|
+
* #585: Text/plain attachments with invalid charset are now displayed as
|
13
|
+
US-ASCII (with high bytes replaced) instead of crashing.
|
14
|
+
* #424: Spaces are now accepted in RFC2047-encoded header words, even though
|
15
|
+
the RFC forbids them. (Dan Callaghan)
|
16
|
+
* Invalid RFC2047-encoded header words are now displayed in their raw form,
|
17
|
+
rather than trying to forcibly transcode them to UTF-8, as per the RFC's
|
18
|
+
recommendation. (Dan Callaghan)
|
19
|
+
* Sup now decodes UTF-7 correctly instead of crashing.
|
20
|
+
|
1
21
|
== 1.0 / 2020-07-12
|
2
22
|
|
3
23
|
No changes. The version number is incremented to 1.0 to reflect the fact that
|
data/Manifest.txt
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
.github/workflows/checks.yml
|
2
|
+
.gitignore
|
3
|
+
.gitmodules
|
4
|
+
.rubocop.yml
|
5
|
+
CONTRIBUTORS
|
6
|
+
Gemfile
|
7
|
+
HACKING
|
8
|
+
History.txt
|
9
|
+
LICENSE
|
10
|
+
Manifest.txt
|
11
|
+
README.md
|
12
|
+
Rakefile
|
13
|
+
ReleaseNotes
|
14
|
+
bin/sup
|
15
|
+
bin/sup-add
|
16
|
+
bin/sup-config
|
17
|
+
bin/sup-dump
|
18
|
+
bin/sup-import-dump
|
19
|
+
bin/sup-recover-sources
|
20
|
+
bin/sup-sync
|
21
|
+
bin/sup-sync-back-maildir
|
22
|
+
bin/sup-tweak-labels
|
23
|
+
contrib/colorpicker.rb
|
24
|
+
contrib/completion/_sup.bash
|
25
|
+
contrib/completion/_sup.zsh
|
26
|
+
devel/console.sh
|
27
|
+
devel/count-loc.sh
|
28
|
+
devel/load-index.rb
|
29
|
+
devel/profile.rb
|
30
|
+
devel/start-console.rb
|
31
|
+
doc/FAQ.txt
|
32
|
+
doc/Hooks.txt
|
33
|
+
doc/Philosophy.txt
|
34
|
+
doc/wiki
|
35
|
+
ext/mkrf_conf_xapian.rb
|
36
|
+
lib/sup.rb
|
37
|
+
lib/sup/account.rb
|
38
|
+
lib/sup/buffer.rb
|
39
|
+
lib/sup/colormap.rb
|
40
|
+
lib/sup/contact.rb
|
41
|
+
lib/sup/crypto.rb
|
42
|
+
lib/sup/draft.rb
|
43
|
+
lib/sup/hook.rb
|
44
|
+
lib/sup/horizontal_selector.rb
|
45
|
+
lib/sup/idle.rb
|
46
|
+
lib/sup/index.rb
|
47
|
+
lib/sup/interactive_lock.rb
|
48
|
+
lib/sup/keymap.rb
|
49
|
+
lib/sup/label.rb
|
50
|
+
lib/sup/logger.rb
|
51
|
+
lib/sup/logger/singleton.rb
|
52
|
+
lib/sup/maildir.rb
|
53
|
+
lib/sup/mbox.rb
|
54
|
+
lib/sup/message.rb
|
55
|
+
lib/sup/message_chunks.rb
|
56
|
+
lib/sup/mode.rb
|
57
|
+
lib/sup/modes/buffer_list_mode.rb
|
58
|
+
lib/sup/modes/completion_mode.rb
|
59
|
+
lib/sup/modes/compose_mode.rb
|
60
|
+
lib/sup/modes/console_mode.rb
|
61
|
+
lib/sup/modes/contact_list_mode.rb
|
62
|
+
lib/sup/modes/edit_message_async_mode.rb
|
63
|
+
lib/sup/modes/edit_message_mode.rb
|
64
|
+
lib/sup/modes/file_browser_mode.rb
|
65
|
+
lib/sup/modes/forward_mode.rb
|
66
|
+
lib/sup/modes/help_mode.rb
|
67
|
+
lib/sup/modes/inbox_mode.rb
|
68
|
+
lib/sup/modes/label_list_mode.rb
|
69
|
+
lib/sup/modes/label_search_results_mode.rb
|
70
|
+
lib/sup/modes/line_cursor_mode.rb
|
71
|
+
lib/sup/modes/log_mode.rb
|
72
|
+
lib/sup/modes/person_search_results_mode.rb
|
73
|
+
lib/sup/modes/poll_mode.rb
|
74
|
+
lib/sup/modes/reply_mode.rb
|
75
|
+
lib/sup/modes/resume_mode.rb
|
76
|
+
lib/sup/modes/scroll_mode.rb
|
77
|
+
lib/sup/modes/search_list_mode.rb
|
78
|
+
lib/sup/modes/search_results_mode.rb
|
79
|
+
lib/sup/modes/text_mode.rb
|
80
|
+
lib/sup/modes/thread_index_mode.rb
|
81
|
+
lib/sup/modes/thread_view_mode.rb
|
82
|
+
lib/sup/person.rb
|
83
|
+
lib/sup/poll.rb
|
84
|
+
lib/sup/rfc2047.rb
|
85
|
+
lib/sup/search.rb
|
86
|
+
lib/sup/sent.rb
|
87
|
+
lib/sup/service/label_service.rb
|
88
|
+
lib/sup/source.rb
|
89
|
+
lib/sup/tagger.rb
|
90
|
+
lib/sup/textfield.rb
|
91
|
+
lib/sup/thread.rb
|
92
|
+
lib/sup/time.rb
|
93
|
+
lib/sup/undo.rb
|
94
|
+
lib/sup/update.rb
|
95
|
+
lib/sup/util.rb
|
96
|
+
lib/sup/util/axe.rb
|
97
|
+
lib/sup/util/locale_fiddler.rb
|
98
|
+
lib/sup/util/ncurses.rb
|
99
|
+
lib/sup/util/path.rb
|
100
|
+
lib/sup/util/query.rb
|
101
|
+
lib/sup/util/uri.rb
|
102
|
+
lib/sup/version.rb
|
103
|
+
sup.gemspec
|
104
|
+
test/dummy_source.rb
|
105
|
+
test/fixtures/bad-content-transfer-encoding-1.eml
|
106
|
+
test/fixtures/binary-content-transfer-encoding-2.eml
|
107
|
+
test/fixtures/blank-header-fields.eml
|
108
|
+
test/fixtures/contacts.txt
|
109
|
+
test/fixtures/embedded-message.eml
|
110
|
+
test/fixtures/mailing-list-header.eml
|
111
|
+
test/fixtures/malicious-attachment-names.eml
|
112
|
+
test/fixtures/missing-from-to.eml
|
113
|
+
test/fixtures/missing-line.eml
|
114
|
+
test/fixtures/multi-part-2.eml
|
115
|
+
test/fixtures/multi-part.eml
|
116
|
+
test/fixtures/no-body.eml
|
117
|
+
test/fixtures/non-ascii-header-in-nested-message.eml
|
118
|
+
test/fixtures/non-ascii-header.eml
|
119
|
+
test/fixtures/rfc2047-header-encoding.eml
|
120
|
+
test/fixtures/simple-message.eml
|
121
|
+
test/fixtures/text-attachments-with-charset.eml
|
122
|
+
test/fixtures/utf8-header.eml
|
123
|
+
test/fixtures/zimbra-quote-with-bottom-post.eml
|
124
|
+
test/gnupg_test_home/.gpg-v21-migrated
|
125
|
+
test/gnupg_test_home/gpg.conf
|
126
|
+
test/gnupg_test_home/private-keys-v1.d/306D2EE90FF0014B5B9FD07E265C751791674140.key
|
127
|
+
test/gnupg_test_home/pubring.gpg
|
128
|
+
test/gnupg_test_home/receiver_pubring.gpg
|
129
|
+
test/gnupg_test_home/receiver_secring.gpg
|
130
|
+
test/gnupg_test_home/regen_keys.sh
|
131
|
+
test/gnupg_test_home/secring.gpg
|
132
|
+
test/gnupg_test_home/sup-test-2@foo.bar.asc
|
133
|
+
test/integration/test_maildir.rb
|
134
|
+
test/integration/test_mbox.rb
|
135
|
+
test/integration/test_sup-add.rb
|
136
|
+
test/test_crypto.rb
|
137
|
+
test/test_header_parsing.rb
|
138
|
+
test/test_helper.rb
|
139
|
+
test/test_message.rb
|
140
|
+
test/test_messages_dir.rb
|
141
|
+
test/test_yaml_regressions.rb
|
142
|
+
test/unit/service/test_label_service.rb
|
143
|
+
test/unit/test_contact.rb
|
144
|
+
test/unit/test_horizontal_selector.rb
|
145
|
+
test/unit/test_locale_fiddler.rb
|
146
|
+
test/unit/test_person.rb
|
147
|
+
test/unit/util/test_query.rb
|
148
|
+
test/unit/util/test_string.rb
|
149
|
+
test/unit/util/test_uri.rb
|
data/README.md
CHANGED
@@ -57,9 +57,15 @@ some alternatives to consider:
|
|
57
57
|
* [Notmuch](https://notmuchmail.org/) was inspired by Sup. There are a wide
|
58
58
|
variety of [Notmuch clients](https://notmuchmail.org/frontends/) available.
|
59
59
|
The most similar to Sup's look-and-feel is
|
60
|
-
[Alot](https://github.com/pazz/alot) — also a curses-based
|
61
|
-
Alot even ships with a
|
62
|
-
[
|
60
|
+
[Alot](https://github.com/pazz/alot) — also a curses-based front end.
|
61
|
+
Alot even ships with a
|
62
|
+
[built-in](https://github.com/pazz/alot/blob/master/extra/themes/sup)
|
63
|
+
[Sup theme](https://github.com/pazz/alot/wiki/Gallery#user-content-theme-sup)!
|
64
|
+
|
65
|
+
* [mu](https://www.djcbsoftware.nl/code/mu/) /
|
66
|
+
[mu4e](https://www.djcbsoftware.nl/code/mu/mu4e.html). Like Sup, a search-based
|
67
|
+
email back end, and also implemented using Xapian. The emacs-based front end
|
68
|
+
[is quite different](https://www.djcbsoftware.nl/code/mu/mu4e/Other-mail-clients.html).
|
63
69
|
|
64
70
|
## License
|
65
71
|
|
data/Rakefile
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'rake/testtask'
|
2
2
|
require "bundler/gem_tasks"
|
3
3
|
|
4
|
+
# Manifest.txt file in same folder as this Rakefile
|
5
|
+
manifest_filename = "#{File.dirname(__FILE__)}/Manifest.txt"
|
6
|
+
git_ls_files_command = "git ls-files | LC_ALL=C sort"
|
7
|
+
|
4
8
|
Rake::TestTask.new(:test) do |test|
|
5
9
|
test.libs << 'test'
|
6
10
|
test.test_files = FileList.new('test/**/test_*.rb')
|
@@ -9,7 +13,7 @@ end
|
|
9
13
|
task :default => :test
|
10
14
|
|
11
15
|
task :build => [:man]
|
12
|
-
task :
|
16
|
+
task :ci => [:test, :rubocop_packaging, :check_manifest, :build]
|
13
17
|
|
14
18
|
def test_pandoc
|
15
19
|
return system("pandoc -v > /dev/null 2>&1")
|
@@ -50,3 +54,38 @@ task :clean do
|
|
50
54
|
FileUtils.rm_r d if Dir.exist? d
|
51
55
|
end
|
52
56
|
end
|
57
|
+
|
58
|
+
task :manifest do
|
59
|
+
manifest = `#{git_ls_files_command}`
|
60
|
+
if $?.success? then
|
61
|
+
puts "Writing `git ls-files` output to #{manifest_filename}"
|
62
|
+
File.write(manifest_filename, manifest, mode: 'w')
|
63
|
+
else
|
64
|
+
abort "Failed to generate Manifest.txt (with `git ls-files`)"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
task :check_manifest do
|
69
|
+
manifest = `#{git_ls_files_command}`
|
70
|
+
manifest_file_contents = File.read(manifest_filename)
|
71
|
+
if manifest == manifest_file_contents
|
72
|
+
puts "Manifest.txt OK"
|
73
|
+
else
|
74
|
+
puts "Manifest from `git ls-files`:\n#{manifest}"
|
75
|
+
STDERR.puts "Manifest.txt outdated. Please commit an updated Manifest.txt"
|
76
|
+
STDERR.puts "To generate Manifest.txt, run: rake manifest"
|
77
|
+
abort "Manifest.txt does not match `git ls-files`"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
task :rubocop_packaging do
|
82
|
+
if /^2\.[012]\./ =~ RUBY_VERSION
|
83
|
+
puts "skipping rubocop-packaging checks on unsupported Ruby #{RUBY_VERSION}"
|
84
|
+
next
|
85
|
+
end
|
86
|
+
if system("rubocop --only Packaging")
|
87
|
+
puts "rubocop-packaging checks OK"
|
88
|
+
else
|
89
|
+
abort "rubocop-packaging checks failed"
|
90
|
+
end
|
91
|
+
end
|
data/bin/sup-add
CHANGED
@@ -94,18 +94,14 @@ begin
|
|
94
94
|
next
|
95
95
|
end
|
96
96
|
|
97
|
-
parsed_uri = URI(URI.escape(uri))
|
98
|
-
|
99
97
|
source =
|
100
|
-
case
|
101
|
-
when
|
98
|
+
case uri
|
99
|
+
when /^maildir:/
|
102
100
|
Redwood::Maildir.new uri, !$opts[:unusual], $opts[:archive], $opts[:sync_back], nil, labels
|
103
|
-
when
|
101
|
+
when /^mbox:/
|
104
102
|
Redwood::MBox.new uri, !$opts[:unusual], $opts[:archive], nil, labels
|
105
103
|
when nil
|
106
|
-
Optimist::die "Sources must be specified with
|
107
|
-
else
|
108
|
-
Optimist::die "Unknown source type #{parsed_uri.scheme.inspect}"
|
104
|
+
Optimist::die "Sources must be specified with a maildir:// or mbox:// URI"
|
109
105
|
end
|
110
106
|
@cli.say "Adding #{source}..."
|
111
107
|
Redwood::SourceManager.add_source source
|
data/ext/mkrf_conf_xapian.rb
CHANGED
@@ -10,13 +10,19 @@ end
|
|
10
10
|
|
11
11
|
puts "xapian: platform specific dependencies.."
|
12
12
|
|
13
|
-
|
13
|
+
destination = File.writable?(Gem.dir) ? Gem.dir : Gem.user_dir
|
14
|
+
inst = Gem::DependencyInstaller.new(:install_dir => destination)
|
14
15
|
begin
|
15
16
|
|
16
17
|
if !RbConfig::CONFIG['arch'].include?('openbsd')
|
17
18
|
# update version in Gemfile as well
|
18
19
|
name = "xapian-ruby"
|
19
|
-
version =
|
20
|
+
version =
|
21
|
+
if /^2\.0\./ =~ RUBY_VERSION
|
22
|
+
["~> 1.2", "< 1.3.6"]
|
23
|
+
else
|
24
|
+
"~> 1.2"
|
25
|
+
end
|
20
26
|
|
21
27
|
begin
|
22
28
|
# try to load gem
|
@@ -34,8 +40,8 @@ begin
|
|
34
40
|
STDERR.puts "xapian: openbsd: you have to install xapian-core and xapian-bindings manually, have a look at: https://github.com/sup-heliotrope/sup/wiki/Installation%3A-OpenBSD"
|
35
41
|
end
|
36
42
|
|
37
|
-
rescue
|
38
|
-
|
43
|
+
rescue StandardError => e
|
44
|
+
STDERR.puts "Unable to install #{name} gem: #{e.inspect}"
|
39
45
|
exit(1)
|
40
46
|
|
41
47
|
end
|
data/lib/sup/colormap.rb
CHANGED
data/lib/sup/hook.rb
CHANGED
data/lib/sup/index.rb
CHANGED
@@ -425,7 +425,7 @@ EOS
|
|
425
425
|
|
426
426
|
## gmail style "is" operator
|
427
427
|
subs = subs.gsub(/\b(is|has):(\S+)\b/) do
|
428
|
-
|
428
|
+
_field, label = $1, $2
|
429
429
|
case label
|
430
430
|
when "read"
|
431
431
|
"-label:unread"
|
@@ -649,7 +649,7 @@ EOS
|
|
649
649
|
end
|
650
650
|
|
651
651
|
def synchronize &b
|
652
|
-
@index_mutex.synchronize
|
652
|
+
@index_mutex.synchronize(&b)
|
653
653
|
end
|
654
654
|
|
655
655
|
def run_query xapian_query, offset, limit, checkatleast=0
|
data/lib/sup/keymap.rb
CHANGED
data/lib/sup/maildir.rb
CHANGED
@@ -12,13 +12,13 @@ class Maildir < Source
|
|
12
12
|
def initialize uri, usual=true, archived=false, sync_back=true, id=nil, labels=[]
|
13
13
|
super uri, usual, archived, id
|
14
14
|
@expanded_uri = Source.expand_filesystem_uri(uri)
|
15
|
-
parts =
|
15
|
+
parts = /^([a-zA-Z0-9]*:(\/\/)?)(.*)/.match @expanded_uri
|
16
16
|
if parts
|
17
17
|
prefix = parts[1]
|
18
18
|
@path = parts[3]
|
19
|
-
uri = URI(prefix +
|
19
|
+
uri = URI(prefix + Source.encode_path_for_uri(@path))
|
20
20
|
else
|
21
|
-
uri = URI(
|
21
|
+
uri = URI(Source.encode_path_for_uri @path)
|
22
22
|
@path = uri.path
|
23
23
|
end
|
24
24
|
|
@@ -30,7 +30,7 @@ class Maildir < Source
|
|
30
30
|
# sync by default if not specified
|
31
31
|
@sync_back = true if @sync_back.nil?
|
32
32
|
|
33
|
-
@dir = URI.
|
33
|
+
@dir = URI.decode_www_form_component uri.path
|
34
34
|
@labels = Set.new(labels || [])
|
35
35
|
@mutex = Mutex.new
|
36
36
|
@ctimes = { 'cur' => Time.at(0), 'new' => Time.at(0) }
|
data/lib/sup/mbox.rb
CHANGED
@@ -19,13 +19,13 @@ class MBox < Source
|
|
19
19
|
case uri_or_fp
|
20
20
|
when String
|
21
21
|
@expanded_uri = Source.expand_filesystem_uri(uri_or_fp)
|
22
|
-
parts =
|
22
|
+
parts = /^([a-zA-Z0-9]*:(\/\/)?)(.*)/.match @expanded_uri
|
23
23
|
if parts
|
24
24
|
prefix = parts[1]
|
25
25
|
@path = parts[3]
|
26
|
-
uri = URI(prefix +
|
26
|
+
uri = URI(prefix + Source.encode_path_for_uri(@path))
|
27
27
|
else
|
28
|
-
uri = URI(
|
28
|
+
uri = URI(Source.encode_path_for_uri @expanded_uri)
|
29
29
|
@path = uri.path
|
30
30
|
end
|
31
31
|
|
@@ -36,7 +36,7 @@ class MBox < Source
|
|
36
36
|
else
|
37
37
|
@f = uri_or_fp
|
38
38
|
@path = uri_or_fp.path
|
39
|
-
@expanded_uri = "mbox://#{
|
39
|
+
@expanded_uri = "mbox://#{Source.encode_path_for_uri @path}"
|
40
40
|
end
|
41
41
|
|
42
42
|
super uri_or_fp, usual, archived, id
|
data/lib/sup/message.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'time'
|
4
|
+
require 'string-scrub' if /^2\.0\./ =~ RUBY_VERSION
|
4
5
|
|
5
6
|
module Redwood
|
6
7
|
|
@@ -71,9 +72,9 @@ class Message
|
|
71
72
|
return unless v
|
72
73
|
return v unless v.is_a? String
|
73
74
|
return unless v.size < MAX_HEADER_VALUE_SIZE # avoid regex blowup on spam
|
74
|
-
|
75
|
-
|
76
|
-
Rfc2047.decode_to $encoding,
|
75
|
+
## Header values should be either 7-bit with RFC2047-encoded words
|
76
|
+
## or UTF-8 as per RFC6532. Replace any invalid high bytes with U+FFFD.
|
77
|
+
Rfc2047.decode_to $encoding, v.dup.force_encoding(Encoding::UTF_8).scrub
|
77
78
|
end
|
78
79
|
|
79
80
|
def parse_header encoded_header
|
@@ -104,7 +105,7 @@ class Message
|
|
104
105
|
when String
|
105
106
|
begin
|
106
107
|
Time.parse date
|
107
|
-
rescue ArgumentError
|
108
|
+
rescue ArgumentError
|
108
109
|
#debug "faking mangled date header for #{@id} (orig #{header['date'].inspect} gave error: #{e.message})"
|
109
110
|
Time.now
|
110
111
|
end
|
@@ -309,7 +310,7 @@ EOS
|
|
309
310
|
end
|
310
311
|
|
311
312
|
def each_raw_message_line &b
|
312
|
-
location.each_raw_message_line
|
313
|
+
location.each_raw_message_line(&b)
|
313
314
|
end
|
314
315
|
|
315
316
|
def sync_back
|
data/lib/sup/message_chunks.rb
CHANGED
@@ -128,7 +128,16 @@ EOS
|
|
128
128
|
|
129
129
|
text = case @content_type
|
130
130
|
when /^text\/plain\b/
|
131
|
-
|
131
|
+
if /^UTF-7$/i =~ encoded_content.charset
|
132
|
+
@raw_content.decode_utf7
|
133
|
+
else
|
134
|
+
begin
|
135
|
+
charset = Encoding.find(encoded_content.charset || 'US-ASCII')
|
136
|
+
rescue ArgumentError
|
137
|
+
charset = 'US-ASCII'
|
138
|
+
end
|
139
|
+
@raw_content.force_encoding(charset)
|
140
|
+
end
|
132
141
|
else
|
133
142
|
HookManager.run "mime-decode", :content_type => @content_type,
|
134
143
|
:filename => lambda { write_to_disk },
|
@@ -274,24 +283,19 @@ EOS
|
|
274
283
|
class EnclosedMessage
|
275
284
|
attr_reader :lines
|
276
285
|
def initialize from, to, cc, date, subj
|
277
|
-
@from = from ? "unknown sender" : from.full_address
|
278
|
-
@to = to ? "" : to.map { |p| p.full_address }.join(", ")
|
279
|
-
@cc = cc ? "" : cc.map { |p| p.full_address }.join(", ")
|
280
|
-
|
281
|
-
@date = date.rfc822
|
282
|
-
else
|
283
|
-
@date = ""
|
284
|
-
end
|
285
|
-
|
286
|
+
@from = !from ? "unknown sender" : from.full_address
|
287
|
+
@to = !to ? "" : to.map { |p| p.full_address }.join(", ")
|
288
|
+
@cc = !cc ? "" : cc.map { |p| p.full_address }.join(", ")
|
289
|
+
@date = !date ? "" : date.rfc822
|
286
290
|
@subj = subj
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
@lines
|
291
|
+
@lines = [
|
292
|
+
"From: #{@from}",
|
293
|
+
"To: #{@to}",
|
294
|
+
"Cc: #{@cc}",
|
295
|
+
"Date: #{@date}",
|
296
|
+
"Subject: #{@subj}"
|
297
|
+
]
|
298
|
+
@lines.delete_if{ |line| line == 'Cc: ' }
|
295
299
|
end
|
296
300
|
|
297
301
|
def inlineable?; false end
|
@@ -302,7 +306,11 @@ EOS
|
|
302
306
|
def viewable?; false end
|
303
307
|
|
304
308
|
def patina_color; :generic_notice_patina_color end
|
305
|
-
def patina_text
|
309
|
+
def patina_text
|
310
|
+
"Begin enclosed message" + (
|
311
|
+
@date == "" ? "" : " sent on #{@date}"
|
312
|
+
)
|
313
|
+
end
|
306
314
|
|
307
315
|
def color; :quote_color end
|
308
316
|
end
|