+113 -54 +/-10 browse
1 | diff --git a/Cargo.lock b/Cargo.lock |
2 | index 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 |
134 | index 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 |
156 | index 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 |
182 | index 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 |
240 | index 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 |
253 | index 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 |
365 | index 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 |
378 | index 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 |
414 | index 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 |
427 | index 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, |