Author: Kevin Schoon [me@kevinschoon.com]
Committer: Manos Pitsidianakis [manos@pitsidianak.is] Tue, 09 Jan 2024 10:58:03 +0000
Hash: 0216cc1276593ea0bf8883d7024b65cc5cbd50c5
Timestamp: Tue, 09 Jan 2024 10:58:03 +0000 (8 months ago)

+113 -54 +/-10 browse
bump melib dependency to a modern version
bump melib dependency to a modern version

This updates the melib dependency from an old version it was pinned to and
updates the associated code and tests.
1diff --git a/Cargo.lock b/Cargo.lock
2index 56ed01d..256ce4c 100644
3--- a/Cargo.lock
4+++ b/Cargo.lock
5 @@ -3,6 +3,12 @@
6 version = 3
7
8 [[package]]
9+ name = "adler"
10+ version = "1.0.2"
11+ source = "registry+https://github.com/rust-lang/crates.io-index"
12+ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
13+
14+ [[package]]
15 name = "ahash"
16 version = "0.7.6"
17 source = "registry+https://github.com/rust-lang/crates.io-index"
18 @@ -509,6 +515,9 @@ name = "bitflags"
19 version = "2.4.1"
20 source = "registry+https://github.com/rust-lang/crates.io-index"
21 checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
22+ dependencies = [
23+ "serde",
24+ ]
25
26 [[package]]
27 name = "blake3"
28 @@ -928,6 +937,15 @@ dependencies = [
29 ]
30
31 [[package]]
32+ name = "crc32fast"
33+ version = "1.3.2"
34+ source = "registry+https://github.com/rust-lang/crates.io-index"
35+ checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
36+ dependencies = [
37+ "cfg-if 1.0.0",
38+ ]
39+
40+ [[package]]
41 name = "crossbeam-utils"
42 version = "0.8.15"
43 source = "registry+https://github.com/rust-lang/crates.io-index"
44 @@ -1368,6 +1386,16 @@ dependencies = [
45 ]
46
47 [[package]]
48+ name = "flate2"
49+ version = "1.0.28"
50+ source = "registry+https://github.com/rust-lang/crates.io-index"
51+ checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
52+ dependencies = [
53+ "crc32fast",
54+ "miniz_oxide",
55+ ]
56+
57+ [[package]]
58 name = "float-cmp"
59 version = "0.9.0"
60 source = "registry+https://github.com/rust-lang/crates.io-index"
61 @@ -2304,31 +2332,37 @@ checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40"
62
63 [[package]]
64 name = "melib"
65- version = "0.7.2"
66- source = "git+https://github.com/meli/meli?rev=2447a2c#2447a2cbfeaa8d6f7ec11a2a8a6f3be1ff2fea58"
67+ version = "0.8.5-rc.3"
68+ source = "git+https://git.meli-email.org/meli/meli.git?rev=64e60cb#64e60cb0ee79841ab40e3dba94ac27150a264c5c"
69 dependencies = [
70 "async-stream",
71 "base64 0.13.1",
72- "bincode",
73- "bitflags 1.3.2",
74+ "bitflags 2.4.1",
75 "data-encoding",
76 "encoding",
77+ "encoding_rs",
78+ "flate2",
79 "futures",
80 "indexmap",
81 "libc",
82 "libloading",
83+ "log",
84 "native-tls",
85 "nix",
86 "nom",
87 "notify",
88+ "polling",
89+ "regex",
90 "serde",
91 "serde_derive",
92+ "serde_json",
93+ "serde_path_to_error",
94 "smallvec",
95 "smol",
96+ "socket2",
97 "unicode-segmentation",
98 "uuid",
99 "xdg",
100- "xdg-utils",
101 ]
102
103 [[package]]
104 @@ -2376,6 +2410,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
105 checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
106
107 [[package]]
108+ name = "miniz_oxide"
109+ version = "0.7.1"
110+ source = "registry+https://github.com/rust-lang/crates.io-index"
111+ checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
112+ dependencies = [
113+ "adler",
114+ ]
115+
116+ [[package]]
117 name = "mio"
118 version = "0.6.23"
119 source = "registry+https://github.com/rust-lang/crates.io-index"
120 @@ -4405,12 +4448,6 @@ dependencies = [
121 ]
122
123 [[package]]
124- name = "xdg-utils"
125- version = "0.4.0"
126- source = "registry+https://github.com/rust-lang/crates.io-index"
127- checksum = "db9fefe62d5969721e2cfc529e6a760901cc0da422b6d67e7bfd18e69490dba6"
128-
129- [[package]]
130 name = "xz2"
131 version = "0.1.7"
132 source = "registry+https://github.com/rust-lang/crates.io-index"
133 diff --git a/cli/src/commands.rs b/cli/src/commands.rs
134index c4bbacb..d3f8be5 100644
135--- a/cli/src/commands.rs
136+++ b/cli/src/commands.rs
137 @@ -27,7 +27,7 @@ use std::{
138
139 use mailpot::{
140 melib,
141- melib::{backends::maildir::MaildirPathTrait, smol, Envelope, EnvelopeHash},
142+ melib::{maildir::MaildirPathTrait, smol, Envelope, EnvelopeHash},
143 models::{changesets::*, *},
144 queue::{Queue, QueueEntry},
145 transaction::TransactionBehavior,
146 @@ -802,7 +802,7 @@ pub fn import_maildir(
147 EnvelopeHash(hasher.finish())
148 }
149 let mut buf = Vec::with_capacity(4096);
150- let files = melib::backends::maildir::MaildirType::list_mail_in_maildir_fs(maildir_path, true)
151+ let files = melib::maildir::MaildirType::list_mail_in_maildir_fs(maildir_path, true)
152 .context("Could not parse files in maildir path")?;
153 let mut ctr = 0;
154 for file in files {
155 diff --git a/cli/src/lints.rs b/cli/src/lints.rs
156index 821f842..5d7fa01 100644
157--- a/cli/src/lints.rs
158+++ b/cli/src/lints.rs
159 @@ -31,7 +31,7 @@ pub fn datetime_header_value_lint(db: &mut Connection, dry_run: bool) -> Result<
160 let iter = stmt.query_map([], |row| {
161 let pk: i64 = row.get("pk")?;
162 let date_s: String = row.get("datetime")?;
163- match melib::datetime::rfc822_to_timestamp(date_s.trim()) {
164+ match melib::utils::datetime::rfc822_to_timestamp(date_s.trim()) {
165 Err(_) | Ok(0) => {
166 let mut timestamp: i64 = row.get("timestamp")?;
167 let created: i64 = row.get("created")?;
168 @@ -75,7 +75,11 @@ pub fn datetime_header_value_lint(db: &mut Connection, dry_run: bool) -> Result<
169 {
170 v.to_rfc2822()
171 } else if let Some(v) = timestamp.map(|t| {
172- melib::datetime::timestamp_to_string(t, Some(melib::datetime::RFC822_DATE), true)
173+ melib::utils::datetime::timestamp_to_string(
174+ t,
175+ Some(melib::utils::datetime::formats::RFC822_DATE),
176+ true,
177+ )
178 }) {
179 v
180 } else if let Ok(v) =
181 diff --git a/cli/tests/out_queue_flush.rs b/cli/tests/out_queue_flush.rs
182index 87a381b..5eb62b4 100644
183--- a/cli/tests/out_queue_flush.rs
184+++ b/cli/tests/out_queue_flush.rs
185 @@ -109,11 +109,23 @@ fn test_out_queue_flush() {
186 assert!(env.subject().starts_with(&format!("[{}] ", foo_chat.id)));
187 let headers = env.other_headers();
188
189- assert_eq!(headers.get("List-Id"), Some(&foo_chat.id_header()));
190- assert_eq!(headers.get("List-Help"), foo_chat.help_header().as_ref());
191 assert_eq!(
192- headers.get("List-Post"),
193- foo_chat.post_header(Some(&post_policy)).as_ref()
194+ headers
195+ .get(melib::HeaderName::LIST_ID)
196+ .map(|header| header.to_string()),
197+ Some(foo_chat.id_header())
198+ );
199+ assert_eq!(
200+ headers
201+ .get(melib::HeaderName::LIST_HELP)
202+ .map(|header| header.to_string()),
203+ foo_chat.help_header()
204+ );
205+ assert_eq!(
206+ headers
207+ .get(melib::HeaderName::LIST_POST)
208+ .map(|header| header.to_string()),
209+ foo_chat.post_header(Some(&post_policy))
210 );
211 };
212
213 @@ -306,11 +318,21 @@ fn test_list_requests_submission() {
214 let headers_fn = |env: &melib::Envelope| {
215 let headers = env.other_headers();
216
217- assert_eq!(headers.get("List-Id"), Some(&foo_chat.id_header()));
218- assert_eq!(headers.get("List-Help"), foo_chat.help_header().as_ref());
219 assert_eq!(
220- headers.get("List-Post"),
221- foo_chat.post_header(Some(&post_policy)).as_ref()
222+ headers.get(melib::HeaderName::LIST_ID),
223+ Some(foo_chat.id_header().as_str())
224+ );
225+ assert_eq!(
226+ headers
227+ .get(melib::HeaderName::LIST_HELP)
228+ .map(|header| header.to_string()),
229+ foo_chat.help_header()
230+ );
231+ assert_eq!(
232+ headers
233+ .get(melib::HeaderName::LIST_POST)
234+ .map(|header| header.to_string()),
235+ foo_chat.post_header(Some(&post_policy))
236 );
237 };
238
239 diff --git a/core/Cargo.toml b/core/Cargo.toml
240index 2c16113..f7a436c 100644
241--- a/core/Cargo.toml
242+++ b/core/Cargo.toml
243 @@ -18,7 +18,7 @@ anyhow = "1.0.58"
244 chrono = { version = "^0.4", features = ["serde", ] }
245 jsonschema = { version = "0.17", default-features = false }
246 log = "0.4"
247- melib = { version = "*", default-features = false, features = ["smtp", "unicode_algorithms", "maildir_backend"], git = "https://github.com/meli/meli", rev = "2447a2c" }
248+ melib = { default-features = false, features = ["smtp", "unicode-algorithms", "maildir"], git = "https://git.meli-email.org/meli/meli.git", rev = "64e60cb" }
249 minijinja = { version = "0.31.0", features = ["source", ] }
250 percent-encoding = { version = "^2.1" }
251 rusqlite = { version = "^0.30", features = ["bundled", "functions", "trace", "hooks", "serde_json", "array", "chrono", "unlock_notify"] }
252 diff --git a/core/src/message_filters.rs b/core/src/message_filters.rs
253index 7136f8e..ff68d23 100644
254--- a/core/src/message_filters.rs
255+++ b/core/src/message_filters.rs
256 @@ -40,7 +40,7 @@
257
258 mod settings;
259 use log::trace;
260- use melib::Address;
261+ use melib::{Address, HeaderName};
262 use percent_encoding::utf8_percent_encode;
263 pub use settings::*;
264
265 @@ -168,7 +168,7 @@ impl PostFilter for AddListHeaders {
266 trace!("Running AddListHeaders filter");
267 let (mut headers, body) = melib::email::parser::mail(&post.bytes).unwrap();
268 let sender = format!("<{}>", ctx.list.address);
269- headers.push((&b"Sender"[..], sender.as_bytes()));
270+ headers.push((HeaderName::SENDER, sender.as_bytes()));
271
272 let list_id = Some(ctx.list.id_header());
273 let list_help = ctx.list.help_header();
274 @@ -182,12 +182,12 @@ impl PostFilter for AddListHeaders {
275 let list_archive = ctx.list.archive_header();
276
277 for (hdr, val) in [
278- (b"List-Id".as_slice(), &list_id),
279- (b"List-Help".as_slice(), &list_help),
280- (b"List-Post".as_slice(), &list_post),
281- (b"List-Unsubscribe".as_slice(), &list_unsubscribe),
282- (b"List-Subscribe".as_slice(), &list_subscribe),
283- (b"List-Archive".as_slice(), &list_archive),
284+ (HeaderName::LIST_ID, &list_id),
285+ (HeaderName::LIST_HELP, &list_help),
286+ (HeaderName::LIST_POST, &list_post),
287+ (HeaderName::LIST_UNSUBSCRIBE, &list_unsubscribe),
288+ (HeaderName::LIST_SUBSCRIBE, &list_subscribe),
289+ (HeaderName::LIST_ARCHIVE, &list_archive),
290 ] {
291 if let Some(val) = val {
292 headers.push((hdr, val.as_bytes()));
293 @@ -197,13 +197,13 @@ impl PostFilter for AddListHeaders {
294 let mut new_vec = Vec::with_capacity(
295 headers
296 .iter()
297- .map(|(h, v)| h.len() + v.len() + ": \r\n".len())
298+ .map(|(h, v)| h.as_str().as_bytes().len() + v.len() + ": \r\n".len())
299 .sum::<usize>()
300 + "\r\n\r\n".len()
301 + body.len(),
302 );
303 for (h, v) in headers {
304- new_vec.extend_from_slice(h);
305+ new_vec.extend_from_slice(h.as_str().as_bytes());
306 new_vec.extend_from_slice(b": ");
307 new_vec.extend_from_slice(v);
308 new_vec.extend_from_slice(b"\r\n");
309 @@ -239,28 +239,25 @@ impl PostFilter for AddSubjectTagPrefix {
310 trace!("Running AddSubjectTagPrefix filter");
311 let (mut headers, body) = melib::email::parser::mail(&post.bytes).unwrap();
312 let mut subject;
313- if let Some((_, subj_val)) = headers
314- .iter_mut()
315- .find(|(k, _)| k.eq_ignore_ascii_case(b"Subject"))
316- {
317+ if let Some((_, subj_val)) = headers.iter_mut().find(|(k, _)| k == HeaderName::SUBJECT) {
318 subject = format!("[{}] ", ctx.list.id).into_bytes();
319 subject.extend(subj_val.iter().cloned());
320 *subj_val = subject.as_slice();
321 } else {
322 subject = format!("[{}] (no subject)", ctx.list.id).into_bytes();
323- headers.push((&b"Subject"[..], subject.as_slice()));
324+ headers.push((HeaderName::SUBJECT, subject.as_slice()));
325 }
326
327 let mut new_vec = Vec::with_capacity(
328 headers
329 .iter()
330- .map(|(h, v)| h.len() + v.len() + ": \r\n".len())
331+ .map(|(h, v)| h.as_str().as_bytes().len() + v.len() + ": \r\n".len())
332 .sum::<usize>()
333 + "\r\n\r\n".len()
334 + body.len(),
335 );
336 for (h, v) in headers {
337- new_vec.extend_from_slice(h);
338+ new_vec.extend_from_slice(h.as_str().as_bytes());
339 new_vec.extend_from_slice(b": ");
340 new_vec.extend_from_slice(v);
341 new_vec.extend_from_slice(b"\r\n");
342 @@ -315,18 +312,18 @@ impl PostFilter for ArchivedAtLink {
343 log::error!("ArchivedAtLink: {}", err);
344 })?;
345 let (mut headers, body) = melib::email::parser::mail(&post.bytes).unwrap();
346- headers.push((&b"Archived-At"[..], header_val.as_bytes()));
347+ headers.push((HeaderName::ARCHIVED_AT, header_val.as_bytes()));
348
349 let mut new_vec = Vec::with_capacity(
350 headers
351 .iter()
352- .map(|(h, v)| h.len() + v.len() + ": \r\n".len())
353+ .map(|(h, v)| h.as_str().as_bytes().len() + v.len() + ": \r\n".len())
354 .sum::<usize>()
355 + "\r\n\r\n".len()
356 + body.len(),
357 );
358 for (h, v) in headers {
359- new_vec.extend_from_slice(h);
360+ new_vec.extend_from_slice(h.as_str().as_bytes());
361 new_vec.extend_from_slice(b": ");
362 new_vec.extend_from_slice(v);
363 new_vec.extend_from_slice(b"\r\n");
364 diff --git a/core/src/models.rs b/core/src/models.rs
365index cbc76da..fe1aaa6 100644
366--- a/core/src/models.rs
367+++ b/core/src/models.rs
368 @@ -371,7 +371,7 @@ impl MailingList {
369 if let Some(val) = val {
370 draft
371 .headers
372- .insert(melib::HeaderName::new_unchecked(hdr), val);
373+ .insert(melib::HeaderName::try_from(hdr).unwrap(), val);
374 }
375 }
376 }
377 diff --git a/core/src/posts.rs b/core/src/posts.rs
378index 532f5e8..259afb8 100644
379--- a/core/src/posts.rs
380+++ b/core/src/posts.rs
381 @@ -46,9 +46,9 @@ impl Connection {
382 let datetime: std::borrow::Cow<'_, str> = if !env.date.is_empty() {
383 env.date.as_str().into()
384 } else {
385- melib::datetime::timestamp_to_string(
386+ melib::utils::datetime::timestamp_to_string(
387 env.timestamp,
388- Some(melib::datetime::RFC822_DATE),
389+ Some(melib::utils::datetime::formats::RFC822_DATE),
390 true,
391 )
392 .into()
393 @@ -710,15 +710,14 @@ impl Connection {
394 })?;
395
396 let mut draft = templ.render(context)?;
397- draft.headers.insert(
398- melib::HeaderName::new_unchecked("From"),
399- list.request_subaddr(),
400- );
401+ draft
402+ .headers
403+ .insert(melib::HeaderName::FROM, list.request_subaddr());
404 for addr in recipients {
405 let mut draft = draft.clone();
406 draft
407 .headers
408- .insert(melib::HeaderName::new_unchecked("To"), addr.to_string());
409+ .insert(melib::HeaderName::TO, addr.to_string());
410 list.insert_headers(
411 &mut draft,
412 post_policy.as_deref(),
413 diff --git a/core/src/templates.rs b/core/src/templates.rs
414index 8774c62..3f1fb66 100644
415--- a/core/src/templates.rs
416+++ b/core/src/templates.rs
417 @@ -83,7 +83,7 @@ impl Template {
418 };
419 if let Some(ref subject) = self.subject {
420 draft.headers.insert(
421- HeaderName::new_unchecked("Subject"),
422+ HeaderName::SUBJECT,
423 env.render_named_str("subject", subject, &context)?,
424 );
425 }
426 diff --git a/web/src/utils.rs b/web/src/utils.rs
427index 3d2c35e..18a43b5 100644
428--- a/web/src/utils.rs
429+++ b/web/src/utils.rs
430 @@ -309,7 +309,7 @@ pub fn thread(
431 let env_lock = envelopes.read().unwrap();
432 let thread = threads.envelope_to_thread[&root_env_hash];
433 let mut ret = vec![];
434- for (depth, t) in threads.thread_group_iter(thread) {
435+ for (depth, t) in threads.thread_iter(thread) {
436 let hash = threads.thread_nodes[&t].message.unwrap();
437 ret.push(ThreadEntry {
438 hash,