From 0216cc1276593ea0bf8883d7024b65cc5cbd50c5 Mon Sep 17 00:00:00 2001 From: Kevin Schoon Date: Tue, 9 Jan 2024 10:58:03 +0000 Subject: [PATCH] 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. --- Cargo.lock | 59 +++++++++++++++++++++++++++++------- cli/src/commands.rs | 4 +-- cli/src/lints.rs | 8 +++-- cli/tests/out_queue_flush.rs | 38 ++++++++++++++++++----- core/Cargo.toml | 2 +- core/src/message_filters.rs | 37 +++++++++++----------- core/src/models.rs | 2 +- core/src/posts.rs | 13 ++++---- core/src/templates.rs | 2 +- web/src/utils.rs | 2 +- 10 files changed, 113 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56ed01d..256ce4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.7.6" @@ -509,6 +515,9 @@ name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +dependencies = [ + "serde", +] [[package]] name = "blake3" @@ -927,6 +936,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "crossbeam-utils" version = "0.8.15" @@ -1367,6 +1385,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "float-cmp" version = "0.9.0" @@ -2304,31 +2332,37 @@ checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" [[package]] name = "melib" -version = "0.7.2" -source = "git+https://github.com/meli/meli?rev=2447a2c#2447a2cbfeaa8d6f7ec11a2a8a6f3be1ff2fea58" +version = "0.8.5-rc.3" +source = "git+https://git.meli-email.org/meli/meli.git?rev=64e60cb#64e60cb0ee79841ab40e3dba94ac27150a264c5c" dependencies = [ "async-stream", "base64 0.13.1", - "bincode", - "bitflags 1.3.2", + "bitflags 2.4.1", "data-encoding", "encoding", + "encoding_rs", + "flate2", "futures", "indexmap", "libc", "libloading", + "log", "native-tls", "nix", "nom", "notify", + "polling", + "regex", "serde", "serde_derive", + "serde_json", + "serde_path_to_error", "smallvec", "smol", + "socket2", "unicode-segmentation", "uuid", "xdg", - "xdg-utils", ] [[package]] @@ -2375,6 +2409,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.6.23" @@ -4404,12 +4447,6 @@ dependencies = [ "home", ] -[[package]] -name = "xdg-utils" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db9fefe62d5969721e2cfc529e6a760901cc0da422b6d67e7bfd18e69490dba6" - [[package]] name = "xz2" version = "0.1.7" diff --git a/cli/src/commands.rs b/cli/src/commands.rs index c4bbacb..d3f8be5 100644 --- a/cli/src/commands.rs +++ b/cli/src/commands.rs @@ -27,7 +27,7 @@ use std::{ use mailpot::{ melib, - melib::{backends::maildir::MaildirPathTrait, smol, Envelope, EnvelopeHash}, + melib::{maildir::MaildirPathTrait, smol, Envelope, EnvelopeHash}, models::{changesets::*, *}, queue::{Queue, QueueEntry}, transaction::TransactionBehavior, @@ -802,7 +802,7 @@ pub fn import_maildir( EnvelopeHash(hasher.finish()) } let mut buf = Vec::with_capacity(4096); - let files = melib::backends::maildir::MaildirType::list_mail_in_maildir_fs(maildir_path, true) + let files = melib::maildir::MaildirType::list_mail_in_maildir_fs(maildir_path, true) .context("Could not parse files in maildir path")?; let mut ctr = 0; for file in files { diff --git a/cli/src/lints.rs b/cli/src/lints.rs index 821f842..5d7fa01 100644 --- a/cli/src/lints.rs +++ b/cli/src/lints.rs @@ -31,7 +31,7 @@ pub fn datetime_header_value_lint(db: &mut Connection, dry_run: bool) -> Result< let iter = stmt.query_map([], |row| { let pk: i64 = row.get("pk")?; let date_s: String = row.get("datetime")?; - match melib::datetime::rfc822_to_timestamp(date_s.trim()) { + match melib::utils::datetime::rfc822_to_timestamp(date_s.trim()) { Err(_) | Ok(0) => { let mut timestamp: i64 = row.get("timestamp")?; let created: i64 = row.get("created")?; @@ -75,7 +75,11 @@ pub fn datetime_header_value_lint(db: &mut Connection, dry_run: bool) -> Result< { v.to_rfc2822() } else if let Some(v) = timestamp.map(|t| { - melib::datetime::timestamp_to_string(t, Some(melib::datetime::RFC822_DATE), true) + melib::utils::datetime::timestamp_to_string( + t, + Some(melib::utils::datetime::formats::RFC822_DATE), + true, + ) }) { v } else if let Ok(v) = diff --git a/cli/tests/out_queue_flush.rs b/cli/tests/out_queue_flush.rs index 87a381b..5eb62b4 100644 --- a/cli/tests/out_queue_flush.rs +++ b/cli/tests/out_queue_flush.rs @@ -109,11 +109,23 @@ fn test_out_queue_flush() { assert!(env.subject().starts_with(&format!("[{}] ", foo_chat.id))); let headers = env.other_headers(); - assert_eq!(headers.get("List-Id"), Some(&foo_chat.id_header())); - assert_eq!(headers.get("List-Help"), foo_chat.help_header().as_ref()); assert_eq!( - headers.get("List-Post"), - foo_chat.post_header(Some(&post_policy)).as_ref() + headers + .get(melib::HeaderName::LIST_ID) + .map(|header| header.to_string()), + Some(foo_chat.id_header()) + ); + assert_eq!( + headers + .get(melib::HeaderName::LIST_HELP) + .map(|header| header.to_string()), + foo_chat.help_header() + ); + assert_eq!( + headers + .get(melib::HeaderName::LIST_POST) + .map(|header| header.to_string()), + foo_chat.post_header(Some(&post_policy)) ); }; @@ -306,11 +318,21 @@ fn test_list_requests_submission() { let headers_fn = |env: &melib::Envelope| { let headers = env.other_headers(); - assert_eq!(headers.get("List-Id"), Some(&foo_chat.id_header())); - assert_eq!(headers.get("List-Help"), foo_chat.help_header().as_ref()); assert_eq!( - headers.get("List-Post"), - foo_chat.post_header(Some(&post_policy)).as_ref() + headers.get(melib::HeaderName::LIST_ID), + Some(foo_chat.id_header().as_str()) + ); + assert_eq!( + headers + .get(melib::HeaderName::LIST_HELP) + .map(|header| header.to_string()), + foo_chat.help_header() + ); + assert_eq!( + headers + .get(melib::HeaderName::LIST_POST) + .map(|header| header.to_string()), + foo_chat.post_header(Some(&post_policy)) ); }; diff --git a/core/Cargo.toml b/core/Cargo.toml index 2c16113..f7a436c 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -18,7 +18,7 @@ anyhow = "1.0.58" chrono = { version = "^0.4", features = ["serde", ] } jsonschema = { version = "0.17", default-features = false } log = "0.4" -melib = { version = "*", default-features = false, features = ["smtp", "unicode_algorithms", "maildir_backend"], git = "https://github.com/meli/meli", rev = "2447a2c" } +melib = { default-features = false, features = ["smtp", "unicode-algorithms", "maildir"], git = "https://git.meli-email.org/meli/meli.git", rev = "64e60cb" } minijinja = { version = "0.31.0", features = ["source", ] } percent-encoding = { version = "^2.1" } rusqlite = { version = "^0.30", features = ["bundled", "functions", "trace", "hooks", "serde_json", "array", "chrono", "unlock_notify"] } diff --git a/core/src/message_filters.rs b/core/src/message_filters.rs index 7136f8e..ff68d23 100644 --- a/core/src/message_filters.rs +++ b/core/src/message_filters.rs @@ -40,7 +40,7 @@ mod settings; use log::trace; -use melib::Address; +use melib::{Address, HeaderName}; use percent_encoding::utf8_percent_encode; pub use settings::*; @@ -168,7 +168,7 @@ impl PostFilter for AddListHeaders { trace!("Running AddListHeaders filter"); let (mut headers, body) = melib::email::parser::mail(&post.bytes).unwrap(); let sender = format!("<{}>", ctx.list.address); - headers.push((&b"Sender"[..], sender.as_bytes())); + headers.push((HeaderName::SENDER, sender.as_bytes())); let list_id = Some(ctx.list.id_header()); let list_help = ctx.list.help_header(); @@ -182,12 +182,12 @@ impl PostFilter for AddListHeaders { let list_archive = ctx.list.archive_header(); for (hdr, val) in [ - (b"List-Id".as_slice(), &list_id), - (b"List-Help".as_slice(), &list_help), - (b"List-Post".as_slice(), &list_post), - (b"List-Unsubscribe".as_slice(), &list_unsubscribe), - (b"List-Subscribe".as_slice(), &list_subscribe), - (b"List-Archive".as_slice(), &list_archive), + (HeaderName::LIST_ID, &list_id), + (HeaderName::LIST_HELP, &list_help), + (HeaderName::LIST_POST, &list_post), + (HeaderName::LIST_UNSUBSCRIBE, &list_unsubscribe), + (HeaderName::LIST_SUBSCRIBE, &list_subscribe), + (HeaderName::LIST_ARCHIVE, &list_archive), ] { if let Some(val) = val { headers.push((hdr, val.as_bytes())); @@ -197,13 +197,13 @@ impl PostFilter for AddListHeaders { let mut new_vec = Vec::with_capacity( headers .iter() - .map(|(h, v)| h.len() + v.len() + ": \r\n".len()) + .map(|(h, v)| h.as_str().as_bytes().len() + v.len() + ": \r\n".len()) .sum::() + "\r\n\r\n".len() + body.len(), ); for (h, v) in headers { - new_vec.extend_from_slice(h); + new_vec.extend_from_slice(h.as_str().as_bytes()); new_vec.extend_from_slice(b": "); new_vec.extend_from_slice(v); new_vec.extend_from_slice(b"\r\n"); @@ -239,28 +239,25 @@ impl PostFilter for AddSubjectTagPrefix { trace!("Running AddSubjectTagPrefix filter"); let (mut headers, body) = melib::email::parser::mail(&post.bytes).unwrap(); let mut subject; - if let Some((_, subj_val)) = headers - .iter_mut() - .find(|(k, _)| k.eq_ignore_ascii_case(b"Subject")) - { + if let Some((_, subj_val)) = headers.iter_mut().find(|(k, _)| k == HeaderName::SUBJECT) { subject = format!("[{}] ", ctx.list.id).into_bytes(); subject.extend(subj_val.iter().cloned()); *subj_val = subject.as_slice(); } else { subject = format!("[{}] (no subject)", ctx.list.id).into_bytes(); - headers.push((&b"Subject"[..], subject.as_slice())); + headers.push((HeaderName::SUBJECT, subject.as_slice())); } let mut new_vec = Vec::with_capacity( headers .iter() - .map(|(h, v)| h.len() + v.len() + ": \r\n".len()) + .map(|(h, v)| h.as_str().as_bytes().len() + v.len() + ": \r\n".len()) .sum::() + "\r\n\r\n".len() + body.len(), ); for (h, v) in headers { - new_vec.extend_from_slice(h); + new_vec.extend_from_slice(h.as_str().as_bytes()); new_vec.extend_from_slice(b": "); new_vec.extend_from_slice(v); new_vec.extend_from_slice(b"\r\n"); @@ -315,18 +312,18 @@ impl PostFilter for ArchivedAtLink { log::error!("ArchivedAtLink: {}", err); })?; let (mut headers, body) = melib::email::parser::mail(&post.bytes).unwrap(); - headers.push((&b"Archived-At"[..], header_val.as_bytes())); + headers.push((HeaderName::ARCHIVED_AT, header_val.as_bytes())); let mut new_vec = Vec::with_capacity( headers .iter() - .map(|(h, v)| h.len() + v.len() + ": \r\n".len()) + .map(|(h, v)| h.as_str().as_bytes().len() + v.len() + ": \r\n".len()) .sum::() + "\r\n\r\n".len() + body.len(), ); for (h, v) in headers { - new_vec.extend_from_slice(h); + new_vec.extend_from_slice(h.as_str().as_bytes()); new_vec.extend_from_slice(b": "); new_vec.extend_from_slice(v); new_vec.extend_from_slice(b"\r\n"); diff --git a/core/src/models.rs b/core/src/models.rs index cbc76da..fe1aaa6 100644 --- a/core/src/models.rs +++ b/core/src/models.rs @@ -371,7 +371,7 @@ impl MailingList { if let Some(val) = val { draft .headers - .insert(melib::HeaderName::new_unchecked(hdr), val); + .insert(melib::HeaderName::try_from(hdr).unwrap(), val); } } } diff --git a/core/src/posts.rs b/core/src/posts.rs index 532f5e8..259afb8 100644 --- a/core/src/posts.rs +++ b/core/src/posts.rs @@ -46,9 +46,9 @@ impl Connection { let datetime: std::borrow::Cow<'_, str> = if !env.date.is_empty() { env.date.as_str().into() } else { - melib::datetime::timestamp_to_string( + melib::utils::datetime::timestamp_to_string( env.timestamp, - Some(melib::datetime::RFC822_DATE), + Some(melib::utils::datetime::formats::RFC822_DATE), true, ) .into() @@ -710,15 +710,14 @@ impl Connection { })?; let mut draft = templ.render(context)?; - draft.headers.insert( - melib::HeaderName::new_unchecked("From"), - list.request_subaddr(), - ); + draft + .headers + .insert(melib::HeaderName::FROM, list.request_subaddr()); for addr in recipients { let mut draft = draft.clone(); draft .headers - .insert(melib::HeaderName::new_unchecked("To"), addr.to_string()); + .insert(melib::HeaderName::TO, addr.to_string()); list.insert_headers( &mut draft, post_policy.as_deref(), diff --git a/core/src/templates.rs b/core/src/templates.rs index 8774c62..3f1fb66 100644 --- a/core/src/templates.rs +++ b/core/src/templates.rs @@ -83,7 +83,7 @@ impl Template { }; if let Some(ref subject) = self.subject { draft.headers.insert( - HeaderName::new_unchecked("Subject"), + HeaderName::SUBJECT, env.render_named_str("subject", subject, &context)?, ); } diff --git a/web/src/utils.rs b/web/src/utils.rs index 3d2c35e..18a43b5 100644 --- a/web/src/utils.rs +++ b/web/src/utils.rs @@ -309,7 +309,7 @@ pub fn thread( let env_lock = envelopes.read().unwrap(); let thread = threads.envelope_to_thread[&root_env_hash]; let mut ret = vec![]; - for (depth, t) in threads.thread_group_iter(thread) { + for (depth, t) in threads.thread_iter(thread) { let hash = threads.thread_nodes[&t].message.unwrap(); ret.push(ThreadEntry { hash,