sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit a927293263d4c7c48bfa925d23a648ebca0d12db
parent beeae7c6e260d3ea5b262fac2d1096c2c8858514
Author: Dan Callaghan <djc@djc.id.au>
Date:   Sun, 11 May 2025 16:10:16 +1000

assume draft charset is $encoding instead of ASCII when indexing

Sup writes drafts without any Content-Type header. It assumes when
sending the mail that it is text/plain with charset=$encoding.
Assume the same when indexing the draft.

Fixes #343.

Diffstat:
M lib/sup/draft.rb | 6 +++++-
M test/integration/test_draft.rb | 24 ++++++++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb
@@ -76,7 +76,11 @@ class DraftLoader < Source
 
   def load_message offset
     raise SourceError, "Draft not found" unless File.exist? fn_for_offset(offset)
-    File.open(fn_for_offset(offset)) { |f| RMail::Parser.read f }
+    File.open(fn_for_offset(offset)) do |f|
+      message = RMail::Parser.read f
+      message.header.set "Content-Type", "text/plain; charset=#{$encoding}"
+      message
+    end
   end
 
   def fallback_date_for_message offset
diff --git a/test/integration/test_draft.rb b/test/integration/test_draft.rb
@@ -99,4 +99,28 @@ EOS
     messages_in_index = Index.instance.enum_for(:each_message).to_a
     assert_equal "", messages_in_index[0].subj
   end
+
+  def test_draft_with_non_ascii_chars
+    message = <<EOS
+From: Some Person <someone@example.invalid>
+To:
+Cc:
+Bcc:
+Subject: UTF-8 draft 🤐
+Date: Fri, 11 Apr 2025 22:34:05 +1000
+Message-ID: <123@example.invalid>
+
+¡Buen día! Доброго ранку! おはよう!
+EOS
+    DraftManager.write_draft { |f| f.write message }
+    draft_filename = File.join @draft_dir, "0"
+    assert_equal message, (File.read draft_filename)
+
+    PollManager.poll_from @draft_source
+    messages_in_index = Index.instance.enum_for(:each_message).to_a
+    assert_equal "UTF-8 draft 🤐", messages_in_index[0].subj
+    assert_equal message, messages_in_index.first.raw_message
+    assert_equal "¡Buen día! Доброго ранку! おはよう!", \
+                 messages_in_index[0].chunks[0].lines[0]
+  end
 end