Compare commits

..

1 Commits

Author SHA1 Message Date
fe3c67a404 chore(deps): lock file maintenance
Some checks failed
Continuous integration / Check (push) Failing after 2m6s
Continuous integration / Test Suite (push) Failing after 2m13s
Continuous integration / Rustfmt (push) Failing after 1m4s
Continuous integration / Trunk (push) Successful in 2m50s
Continuous integration / build (push) Failing after 2m17s
Continuous integration / Disallow unused dependencies (push) Failing after 4m59s
2026-01-20 18:02:44 +00:00
6 changed files with 185 additions and 286 deletions

312
Cargo.lock generated
View File

@@ -170,9 +170,9 @@ checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a"
[[package]]
name = "askama"
version = "0.15.4"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57"
checksum = "bb7125972258312e79827b60c9eb93938334100245081cf701a2dee981b17427"
dependencies = [
"askama_macros",
"itoa 1.0.17",
@@ -183,9 +183,9 @@ dependencies = [
[[package]]
name = "askama_derive"
version = "0.15.4"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37"
checksum = "8ba5e7259a1580c61571e3116ebaaa01e3c001b2132b17c4cc5c70780ca3e994"
dependencies = [
"askama_parser",
"basic-toml",
@@ -200,18 +200,18 @@ dependencies = [
[[package]]
name = "askama_macros"
version = "0.15.4"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b"
checksum = "236ce20b77cb13506eaf5024899f4af6e12e8825f390bd943c4c37fd8f322e46"
dependencies = [
"askama_derive",
]
[[package]]
name = "askama_parser"
version = "0.15.4"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c"
checksum = "f3c63392767bb2df6aa65a6e1e3b80fd89bb7af6d58359b924c0695620f1512e"
dependencies = [
"rustc-hash",
"serde",
@@ -222,9 +222,9 @@ dependencies = [
[[package]]
name = "async-graphql"
version = "7.2.1"
version = "7.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1057a9f7ccf2404d94571dec3451ade1cb524790df6f1ada0d19c2a49f6b0f40"
checksum = "57b75e6d81f69e47038fb2f08c54dc9180fabef56856b7a74e4082157f2e5536"
dependencies = [
"async-graphql-derive",
"async-graphql-parser",
@@ -257,9 +257,9 @@ dependencies = [
[[package]]
name = "async-graphql-axum"
version = "7.2.1"
version = "7.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1e37c5532e4b686acf45e7162bc93da91fc2c702fb0d465efc2c20c8f973795"
checksum = "6197f3d8bc7dae675a5d82ce45316802a0569801ff5ce9cda6d0514cb80bee57"
dependencies = [
"async-graphql",
"axum",
@@ -274,9 +274,9 @@ dependencies = [
[[package]]
name = "async-graphql-derive"
version = "7.2.1"
version = "7.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e6cbeadc8515e66450fba0985ce722192e28443697799988265d86304d7cc68"
checksum = "8587c1c72749f54250633a725203d537ebda851b68d85c2a8d18a3adc0bf72d6"
dependencies = [
"Inflector",
"async-graphql-parser",
@@ -291,9 +291,9 @@ dependencies = [
[[package]]
name = "async-graphql-parser"
version = "7.2.1"
version = "7.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64ef70f77a1c689111e52076da1cd18f91834bcb847de0a9171f83624b07fbf"
checksum = "577ec8cb624048d11465439c2b25d28362cb08c154b530421f456debc7083fdf"
dependencies = [
"async-graphql-value",
"pest",
@@ -303,9 +303,9 @@ dependencies = [
[[package]]
name = "async-graphql-value"
version = "7.2.1"
version = "7.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e3ef112905abea9dea592fc868a6873b10ebd3f983e83308f995d6284e9ba41"
checksum = "e747684314ff7454a1f3b6fe5341e15148b1f17f30c9f6ecc55832dd1f053c47"
dependencies = [
"bytes 1.11.0",
"indexmap 2.13.0",
@@ -400,9 +400,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "aws-lc-rs"
version = "1.15.4"
version = "1.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256"
checksum = "e84ce723ab67259cfeb9877c6a639ee9eb7a27b28123abd71db7f0d5d0cc9d86"
dependencies = [
"aws-lc-sys",
"zeroize",
@@ -410,9 +410,9 @@ dependencies = [
[[package]]
name = "aws-lc-sys"
version = "0.37.0"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a"
checksum = "43a442ece363113bd4bd4c8b18977a7798dd4d3c3383f34fb61936960e8f4ad8"
dependencies = [
"cc",
"cmake",
@@ -845,9 +845,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.54"
version = "1.2.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -931,9 +931,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.56"
version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75ca66430e33a14957acc24c5077b503e7d374151b2b4b3a10c83b4ceb4be0e"
checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394"
dependencies = [
"clap_builder",
"clap_derive",
@@ -941,9 +941,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.56"
version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "793207c7fa6300a0608d1080b858e5fdbe713cdc1c8db9fb17777d8a13e63df0"
checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00"
dependencies = [
"anstream",
"anstyle",
@@ -953,9 +953,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.55"
version = "4.5.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
dependencies = [
"heck",
"proc-macro2",
@@ -1135,15 +1135,30 @@ dependencies = [
"libc",
]
[[package]]
name = "crc"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
dependencies = [
"crc-catalog 1.1.1",
]
[[package]]
name = "crc"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
dependencies = [
"crc-catalog",
"crc-catalog 2.4.0",
]
[[package]]
name = "crc-catalog"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
[[package]]
name = "crc-catalog"
version = "2.4.0"
@@ -1307,18 +1322,18 @@ dependencies = [
[[package]]
name = "css-inline"
version = "0.19.1"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff246a3af11c7b3747663a5d96c991425ee75abc60ef2cbf32d61d1762196c12"
checksum = "2a6803e80ade2d53b280935cbaf6f124c38c26aeb6cae3c276123bdd13aeb3a8"
dependencies = [
"cssparser 0.36.0",
"html5ever 0.38.0",
"html5ever 0.36.1",
"lru 0.16.3",
"precomputed-hash",
"rayon",
"reqwest 0.12.28",
"rustc-hash",
"selectors 0.35.0",
"selectors",
"smallvec 1.15.1",
"url",
]
@@ -1725,7 +1740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -2096,9 +2111,9 @@ dependencies = [
[[package]]
name = "glam"
version = "0.31.0"
version = "0.30.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74a4d85559e2637d3d839438b5b3d75c31e655276f9544d72475c36b92fabbed"
checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9"
[[package]]
name = "glob"
@@ -2507,11 +2522,11 @@ dependencies = [
[[package]]
name = "html2text"
version = "0.16.7"
version = "0.16.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12d23156ea4dbe6b37ad48fab2da56ff27b0f6192fb5db210c44eb07bfe6e787"
checksum = "9ea4ba4c0f993633569337a4fadfbd4f27448c81adb1af0c2407065f52809662"
dependencies = [
"html5ever 0.38.0",
"html5ever 0.37.1",
"tendril 0.5.0",
"thiserror 2.0.18",
"unicode-width",
@@ -2540,12 +2555,12 @@ dependencies = [
[[package]]
name = "html5ever"
version = "0.38.0"
version = "0.37.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2"
checksum = "5935f02fdc02823ff15fec27c2b3d7ca19d629e996f7a0ae4d7d500e62e54c76"
dependencies = [
"log",
"markup5ever 0.38.0",
"markup5ever 0.37.1",
]
[[package]]
@@ -2807,7 +2822,7 @@ dependencies = [
"libc",
"percent-encoding",
"pin-project-lite",
"socket2 0.6.2",
"socket2 0.6.1",
"system-configuration",
"tokio 1.49.0",
"tower-service",
@@ -3165,21 +3180,7 @@ dependencies = [
[[package]]
name = "letterbox-notmuch"
version = "0.17.61"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "28f7db11bd5e63d2e4e3e870e5ca224e2a7acee4eb722aafb9b430f9b24d7dc6"
dependencies = [
"log",
"mailparse",
"serde",
"serde_json",
"thiserror 2.0.18",
"tracing",
]
[[package]]
name = "letterbox-notmuch"
version = "0.17.65"
version = "0.17.60"
dependencies = [
"itertools",
"log",
@@ -3192,14 +3193,28 @@ dependencies = [
"tracing",
]
[[package]]
name = "letterbox-notmuch"
version = "0.17.60"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "4b07ed7d6b6805d3469ed367eff84d544395f1109039460058f5e5139c1b4112"
dependencies = [
"log",
"mailparse",
"serde",
"serde_json",
"thiserror 2.0.18",
"tracing",
]
[[package]]
name = "letterbox-procmail2notmuch"
version = "0.17.65"
version = "0.17.60"
dependencies = [
"anyhow",
"clap",
"letterbox-notmuch 0.17.61",
"letterbox-shared 0.17.61",
"letterbox-notmuch 0.17.60 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"letterbox-shared 0.17.60 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"serde",
"sqlx",
"tokio 1.49.0",
@@ -3207,7 +3222,7 @@ dependencies = [
[[package]]
name = "letterbox-server"
version = "0.17.65"
version = "0.17.60"
dependencies = [
"ammonia",
"anyhow",
@@ -3230,8 +3245,8 @@ dependencies = [
"html-escape",
"html2text",
"ical",
"letterbox-notmuch 0.17.65",
"letterbox-shared 0.17.65",
"letterbox-notmuch 0.17.60",
"letterbox-shared 0.17.60",
"linkify",
"lol_html",
"mailparse",
@@ -3257,12 +3272,10 @@ dependencies = [
[[package]]
name = "letterbox-shared"
version = "0.17.61"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "ca342be12e54e0a54aa3df86b2bda6e3ff014c75a00f6fb3cd087a80fa5e46df"
version = "0.17.60"
dependencies = [
"build-info",
"letterbox-notmuch 0.17.61",
"letterbox-notmuch 0.17.60",
"regex",
"serde",
"sqlx",
@@ -3272,10 +3285,12 @@ dependencies = [
[[package]]
name = "letterbox-shared"
version = "0.17.65"
version = "0.17.60"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "3e3a5c07184063c6cbd1e09ae7174b2319dc10ce60e2ecdd5d7db1826c27b94f"
dependencies = [
"build-info",
"letterbox-notmuch 0.17.65",
"letterbox-notmuch 0.17.60 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"regex",
"serde",
"sqlx",
@@ -3285,7 +3300,7 @@ dependencies = [
[[package]]
name = "letterbox-web"
version = "0.17.65"
version = "0.17.60"
dependencies = [
"build-info",
"build-info-build",
@@ -3297,7 +3312,7 @@ dependencies = [
"graphql_client",
"human_format",
"itertools",
"letterbox-shared 0.17.65",
"letterbox-shared 0.17.60",
"log",
"seed",
"seed_hooks",
@@ -3343,9 +3358,9 @@ dependencies = [
[[package]]
name = "libm"
version = "0.2.16"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]]
name = "libredox"
@@ -3440,7 +3455,7 @@ dependencies = [
"memchr",
"mime",
"precomputed-hash",
"selectors 0.33.0",
"selectors",
"thiserror 2.0.18",
]
@@ -3474,6 +3489,16 @@ version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a"
[[package]]
name = "lzma-rust2"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fa48f5024824ecd3e8282cc948bd46fbd095aed5a98939de0594601a59b4e2b"
dependencies = [
"crc 2.1.0",
"sha2 0.10.9",
]
[[package]]
name = "mac"
version = "0.1.1"
@@ -3516,18 +3541,18 @@ checksum = "6c3294c4d74d0742910f8c7b466f44dda9eb2d5742c1e430138df290a1e8451c"
dependencies = [
"log",
"tendril 0.4.3",
"web_atoms 0.2.3",
"web_atoms 0.2.1",
]
[[package]]
name = "markup5ever"
version = "0.38.0"
version = "0.37.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862"
checksum = "7cfb33ea12d5d83b1ba9a55ae7d05faec4f2189d47b79c04d4cea6bbe9f5b083"
dependencies = [
"log",
"tendril 0.5.0",
"web_atoms 0.2.3",
"web_atoms 0.2.1",
]
[[package]]
@@ -3823,7 +3848,7 @@ version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [
"windows-sys 0.59.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -3854,9 +3879,9 @@ dependencies = [
[[package]]
name = "num-conv"
version = "0.2.0"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-integer"
@@ -3927,9 +3952,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "oneshot"
version = "0.1.12"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ce66197e99546da6c6d991285f605192e794ceae69686c17163844a7bf8fcc2"
checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea"
[[package]]
name = "opaque-debug"
@@ -3977,9 +4002,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]]
name = "openssl-probe"
version = "0.2.1"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391"
[[package]]
name = "openssl-sys"
@@ -4452,6 +4477,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppmd-rust"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4"
[[package]]
name = "ppv-lite86"
version = "0.2.21"
@@ -4544,9 +4575,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.106"
version = "1.0.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
dependencies = [
"unicode-ident",
]
@@ -4606,7 +4637,7 @@ dependencies = [
"quinn-udp",
"rustc-hash",
"rustls",
"socket2 0.6.2",
"socket2 0.6.1",
"thiserror 2.0.18",
"tokio 1.49.0",
"tracing",
@@ -4644,16 +4675,16 @@ dependencies = [
"cfg_aliases",
"libc",
"once_cell",
"socket2 0.6.2",
"socket2 0.6.1",
"tracing",
"windows-sys 0.52.0",
"windows-sys 0.60.2",
]
[[package]]
name = "quote"
version = "1.0.44"
version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
dependencies = [
"proc-macro2",
]
@@ -5206,7 +5237,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -5231,7 +5262,7 @@ version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
dependencies = [
"openssl-probe 0.2.1",
"openssl-probe 0.2.0",
"rustls-pki-types",
"schannel",
"security-framework 3.5.1",
@@ -5265,7 +5296,7 @@ dependencies = [
"security-framework 3.5.1",
"security-framework-sys",
"webpki-root-certs",
"windows-sys 0.52.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -5342,7 +5373,7 @@ dependencies = [
"getopts",
"html5ever 0.36.1",
"precomputed-hash",
"selectors 0.33.0",
"selectors",
"tendril 0.4.3",
]
@@ -5438,25 +5469,6 @@ dependencies = [
"smallvec 1.15.1",
]
[[package]]
name = "selectors"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fdfed56cd634f04fe8b9ddf947ae3dc493483e819593d2ba17df9ad05db8b2"
dependencies = [
"bitflags 2.10.0",
"cssparser 0.36.0",
"derive_more",
"log",
"new_debug_unreachable",
"phf 0.13.1",
"phf_codegen 0.13.1",
"precomputed-hash",
"rustc-hash",
"servo_arc",
"smallvec 1.15.1",
]
[[package]]
name = "semver"
version = "0.9.0"
@@ -5728,9 +5740,9 @@ dependencies = [
[[package]]
name = "socket2"
version = "0.6.2"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0"
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
dependencies = [
"libc",
"windows-sys 0.60.2",
@@ -5777,7 +5789,7 @@ dependencies = [
"base64 0.22.1",
"bytes 1.11.0",
"chrono",
"crc",
"crc 3.4.0",
"crossbeam-queue 0.3.12",
"either",
"event-listener",
@@ -5853,7 +5865,7 @@ dependencies = [
"byteorder",
"bytes 1.11.0",
"chrono",
"crc",
"crc 3.4.0",
"digest 0.10.7",
"dotenvy",
"either",
@@ -5895,7 +5907,7 @@ dependencies = [
"bitflags 2.10.0",
"byteorder",
"chrono",
"crc",
"crc 3.4.0",
"dotenvy",
"etcetera",
"futures-channel",
@@ -6183,7 +6195,7 @@ dependencies = [
"tantivy-tokenizer-api",
"tempfile",
"thiserror 2.0.18",
"time 0.3.46",
"time 0.3.45",
"uuid",
"winapi 0.3.9",
]
@@ -6223,7 +6235,7 @@ dependencies = [
"byteorder",
"ownedbytes",
"serde",
"time 0.3.46",
"time 0.3.45",
]
[[package]]
@@ -6292,7 +6304,7 @@ dependencies = [
"getrandom 0.3.4",
"once_cell",
"rustix",
"windows-sys 0.52.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -6378,9 +6390,9 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.46"
version = "0.3.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5"
checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd"
dependencies = [
"deranged",
"itoa 1.0.17",
@@ -6394,15 +6406,15 @@ dependencies = [
[[package]]
name = "time-core"
version = "0.1.8"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca"
[[package]]
name = "time-macros"
version = "0.2.26"
version = "0.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4"
checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd"
dependencies = [
"num-conv",
"time-core",
@@ -6468,7 +6480,7 @@ dependencies = [
"mio 1.1.1",
"pin-project-lite",
"signal-hook-registry",
"socket2 0.6.2",
"socket2 0.6.1",
"tokio-macros",
"tracing",
"windows-sys 0.61.2",
@@ -6797,7 +6809,7 @@ dependencies = [
"percent-encoding",
"pin-project",
"rustls-native-certs",
"socket2 0.6.2",
"socket2 0.6.1",
"sync_wrapper",
"tokio 1.49.0",
"tokio-rustls",
@@ -6912,7 +6924,7 @@ checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf"
dependencies = [
"crossbeam-channel",
"thiserror 2.0.18",
"time 0.3.46",
"time 0.3.45",
"tracing-subscriber",
]
@@ -7007,9 +7019,9 @@ dependencies = [
[[package]]
name = "typed-path"
version = "0.12.1"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e43ffa54726cdc9ea78392023ffe9fe9cf9ac779e1c6fcb0d23f9862e3879d20"
checksum = "7922f2cdc51280d47b491af9eafc41eb0cdab85eabcb390c854412fcbf26dbe8"
[[package]]
name = "typenum"
@@ -7136,9 +7148,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
version = "1.20.0"
version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f"
checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
dependencies = [
"getrandom 0.3.4",
"js-sys",
@@ -7351,9 +7363,9 @@ dependencies = [
[[package]]
name = "web_atoms"
version = "0.2.3"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576"
checksum = "30e588f10c7bc3465f5fc1ab087fc97877ec1064a7ec89fb685ac4ee998dac4a"
dependencies = [
"phf 0.13.1",
"phf_codegen 0.13.1",
@@ -7424,7 +7436,7 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
"windows-sys 0.48.0",
"windows-sys 0.61.2",
]
[[package]]
@@ -7892,18 +7904,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.34"
version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71ddd76bcebeed25db614f82bf31a9f4222d3fbba300e6fb6c00afa26cbd4d9d"
checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.34"
version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8187381b52e32220d50b255276aa16a084ec0a9017a0ca2152a1f55c539758d"
checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
dependencies = [
"proc-macro2",
"quote",
@@ -8000,10 +8012,12 @@ dependencies = [
"getrandom 0.3.4",
"hmac 0.12.1",
"indexmap 2.13.0",
"lzma-rust2",
"memchr",
"pbkdf2",
"ppmd-rust",
"sha1",
"time 0.3.46",
"time 0.3.45",
"typed-path",
"zeroize",
"zopfli",
@@ -8018,9 +8032,9 @@ checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3"
[[package]]
name = "zmij"
version = "1.0.17"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439"
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
[[package]]
name = "zopfli"

View File

@@ -8,7 +8,7 @@ authors = ["Bill Thiede <git@xinu.tv>"]
edition = "2021"
license = "UNLICENSED"
publish = ["xinu"]
version = "0.17.65"
version = "0.17.60"
repository = "https://git.z.xinu.tv/wathiede/letterbox"
[profile.dev]

View File

@@ -56,7 +56,7 @@ urlencoding = "2.1.3"
#xtracing = { git = "http://git-private.h.xinu.tv/wathiede/xtracing.git" }
#xtracing = { path = "../../xtracing" }
xtracing = { version = "0.3.2", registry = "xinu" }
zip = { version = "7.0.0", default-features = false, features = ["aes-crypto", "bzip2", "deflate64", "deflate", "time", "zstd"] }
zip = "7.0.0"
[build-dependencies]

View File

@@ -178,36 +178,11 @@ pub fn extract_calendar_metadata_from_mail(
let month = &caps[2];
let day = &caps[3];
let year = &caps[4];
let start_hour: u32 = caps[5].parse().unwrap_or(0);
let start_min: u32 = caps.get(6).map(|m| m.as_str().parse().unwrap_or(0)).unwrap_or(0);
let start_ampm = &caps[7];
let end_hour: u32 = caps[8].parse().unwrap_or(0);
let end_min: u32 = caps.get(9).map(|m| m.as_str().parse().unwrap_or(0)).unwrap_or(0);
let end_ampm = &caps[10];
// Convert 12-hour to 24-hour format
let start_hour_24 = if start_ampm == "pm" && start_hour != 12 {
start_hour + 12
} else if start_ampm == "am" && start_hour == 12 {
0
} else {
start_hour
};
let end_hour_24 = if end_ampm == "pm" && end_hour != 12 {
end_hour + 12
} else if end_ampm == "am" && end_hour == 12 {
0
} else {
end_hour
};
let date_str = format!("{} {} {}", month, day, year);
if let Ok(date) = chrono::NaiveDate::parse_from_str(&date_str, "%b %d %Y") {
// Store date with time in YYYYMMDDTHHMMSS format for start/end
let start_dt = format!("{}T{:02}{:02}00", date.format("%Y%m%d"), start_hour_24, start_min);
let end_dt = format!("{}T{:02}{:02}00", date.format("%Y%m%d"), end_hour_24, end_min);
start_date = Some(start_dt);
end_date = Some(end_dt);
let ymd = date.format("%Y%m%d").to_string();
start_date = Some(ymd.clone());
end_date = Some(ymd);
}
} else {
// Pattern: from Thu Sep 11 to Fri Jan 30, 2026
@@ -400,37 +375,13 @@ pub fn extract_calendar_metadata_from_mail(
let (local_fmt_start, local_fmt_end) = if let (Some(ref start_str), Some(ref end_str)) =
(&start_date, &end_date)
{
// Parse dates - try YYYYMMDDTHHMMSS format first (with time), then YYYYMMDD (date only)
let (start_d, start_time) = if start_str.contains('T') {
let parts: Vec<&str> = start_str.split('T').collect();
let date = NaiveDate::parse_from_str(parts[0], "%Y%m%d").ok();
let time = if parts.len() > 1 {
chrono::NaiveTime::parse_from_str(parts[1], "%H%M%S").ok()
} else {
None
};
(date, time)
} else {
(NaiveDate::parse_from_str(start_str, "%Y%m%d").ok(), None)
};
let (end_d, end_time) = if end_str.contains('T') {
let parts: Vec<&str> = end_str.split('T').collect();
let date = NaiveDate::parse_from_str(parts[0], "%Y%m%d").ok();
let time = if parts.len() > 1 {
chrono::NaiveTime::parse_from_str(parts[1], "%H%M%S").ok()
} else {
None
};
(date, time)
} else {
(NaiveDate::parse_from_str(end_str, "%Y%m%d").ok(), None)
};
// Parse YYYYMMDD format dates
let start_d = NaiveDate::parse_from_str(start_str, "%Y%m%d").ok();
let end_d = NaiveDate::parse_from_str(end_str, "%Y%m%d").ok();
if let (Some(start), Some(end)) = (start_d, end_d) {
// For all-day events (no time), end date is exclusive, so we need to subtract one day
let is_allday = start_time.is_none() && end_time.is_none();
let display_end = if is_allday && end > start {
// For all-day events, end date is exclusive, so we need to subtract one day
let display_end = if end > start {
end.pred_opt().unwrap_or(end)
} else {
end
@@ -447,17 +398,9 @@ pub fn extract_calendar_metadata_from_mail(
}
}
// Format dates for display - include time if available
let fmt_start = if let Some(t) = start_time {
format!("{} {}", start.format("%a %b %e, %Y"), t.format("%-I:%M %p"))
} else {
start.format("%a %b %e, %Y").to_string()
};
let fmt_end = if let Some(t) = end_time {
format!("{} {}", display_end.format("%a %b %e, %Y"), t.format("%-I:%M %p"))
} else {
display_end.format("%a %b %e, %Y").to_string()
};
// Format dates for display
let fmt_start = start.format("%a %b %e, %Y").to_string();
let fmt_end = display_end.format("%a %b %e, %Y").to_string();
(fmt_start, fmt_end)
} else {
(start_val.clone(), end_val.clone())
@@ -2452,9 +2395,9 @@ mod tests {
assert_eq!(meta.summary, Some("Dentist appt".to_string()));
// Organizer: from From header, extract email address
assert_eq!(meta.organizer, Some("tconvertino@gmail.com".to_string()));
// Dates: should extract Sep 23, 2025, 3pm-4pm (15:00-16:00)
assert_eq!(meta.start_date, Some("20250923T150000".to_string()));
assert_eq!(meta.end_date, Some("20250923T160000".to_string()));
// Dates: should extract Sep 23, 2025, 3pm-4pm
assert_eq!(meta.start_date, Some("20250923".to_string()));
assert_eq!(meta.end_date, Some("20250923".to_string()));
// Should not be recurring
if let Some(ref html) = meta.body_html {
assert!(
@@ -2682,17 +2625,13 @@ mod tests {
assert_eq!(meta.summary, Some("painting class".to_string()));
assert_eq!(meta.organizer, Some("tconvertino@gmail.com".to_string()));
// Dates: Thursday Feb 12, 2026 7pm - 9pm (same day event with time)
// Start: 7pm = 19:00, End: 9pm = 21:00
assert_eq!(meta.start_date, Some("20260212T190000".to_string()));
assert_eq!(meta.end_date, Some("20260212T210000".to_string()));
assert_eq!(meta.start_date, Some("20260212".to_string()));
assert_eq!(meta.end_date, Some("20260212".to_string()));
// Assert ical summary is rendered and shows Feb 12 highlighted
let html = meta.body_html.expect("body_html");
println!("Rendered HTML: {}", html);
assert!(html.contains("ical-flex"), "Calendar widget should be rendered");
assert!(html.contains(r#"data-event-day="2026-02-12""#), "Feb 12 should be highlighted");
// Verify time is displayed in the HTML
assert!(html.contains("7:00 PM") || html.contains("7pm") || html.contains("19:00"),
"HTML should contain the start time");
}
#[test]

View File

@@ -224,24 +224,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
});
}
Msg::AddTag(query, tag) => {
orders.skip().perform_cmd(async move {
let res: Result<
graphql_client::Response<graphql::add_tag_mutation::ResponseData>,
gloo_net::Error,
> = send_graphql(graphql::AddTagMutation::build_query(
graphql::add_tag_mutation::Variables {
query: query.clone(),
tag: tag.clone(),
},
))
.await;
if let Err(e) = res {
error!("Failed to add tag {tag} to {query}: {e}");
}
Msg::Refresh
});
}
Msg::AddTagAndGoToSearch(query, tag) => {
orders.skip().perform_cmd(async move {
let res: Result<
graphql_client::Response<graphql::add_tag_mutation::ResponseData>,
@@ -274,24 +256,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
if let Err(e) = res {
error!("Failed to remove tag {tag} to {query}: {e}");
}
Msg::Refresh
});
}
Msg::RemoveTagAndGoToSearch(query, tag) => {
orders.skip().perform_cmd(async move {
let res: Result<
graphql_client::Response<graphql::remove_tag_mutation::ResponseData>,
gloo_net::Error,
> = send_graphql(graphql::RemoveTagMutation::build_query(
graphql::remove_tag_mutation::Variables {
query: query.clone(),
tag: tag.clone(),
},
))
.await;
if let Err(e) = res {
error!("Failed to remove tag {tag} to {query}: {e}");
}
// TODO: reconsider this behavior
Msg::GoToSearchResults
});
}
@@ -540,7 +505,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
.join(" ");
orders
.skip()
.perform_cmd(async move { Msg::AddTagAndGoToSearch(threads, tag) });
.perform_cmd(async move { Msg::AddTag(threads, tag) });
}
}
Msg::SelectionRemoveTag(tag) => {
@@ -555,7 +520,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
.join(" ");
orders
.skip()
.perform_cmd(async move { Msg::RemoveTagAndGoToSearch(threads, tag) });
.perform_cmd(async move { Msg::RemoveTag(threads, tag) });
}
}
Msg::SelectionMarkAsRead => {
@@ -727,13 +692,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
};
orders.send_msg(Msg::CatchupNext);
}
Msg::CatchupMarkAsSpam => {
if let Some(thread_id) = current_thread_id(&model.context) {
orders.send_msg(Msg::AddTag(thread_id.clone(), "Spam".to_string()));
orders.send_msg(Msg::SetUnread(thread_id, false));
};
orders.send_msg(Msg::CatchupNext);
}
Msg::CatchupNext => {
orders.send_msg(Msg::ScrollToTop);
let Some(catchup) = &mut model.catchup else {
@@ -894,10 +852,7 @@ pub enum Msg {
SetUnread(String, bool),
AddTag(String, String),
AddTagAndGoToSearch(String, String),
#[allow(dead_code)]
RemoveTag(String, String),
RemoveTagAndGoToSearch(String, String),
Snooze(String, DateTime<Utc>),
FrontPageRequest {
@@ -947,7 +902,6 @@ pub enum Msg {
CatchupStart,
CatchupKeepUnread,
CatchupMarkAsRead,
CatchupMarkAsSpam,
CatchupNext,
CatchupExit,

View File

@@ -268,14 +268,6 @@ fn catchup_view(
Msg::GoToSearchResults
]))
],
button![
tw_classes::button(),
C!["text-red-500"],
attrs! {At::Title => "Mark as spam"},
span![i![C!["far", "fa-hand"]]],
span![C!["pl-2"], "Spam"],
ev(Ev::Click, |_| Msg::CatchupMarkAsSpam)
],
button![
tw_classes::button_with_color("bg-green-800", "hover:bg-green-700"),
span![i![C!["far", "fa-envelope-open"]]],
@@ -458,7 +450,7 @@ fn removable_tags_chiclet<'a>(thread_id: &'a str, tags: &'a [String]) -> Node<Ms
a![
C![&tw_classes::TAG_X],
span![i![C!["fa-solid", "fa-xmark"]]],
ev(Ev::Click, move |_| Msg::RemoveTagAndGoToSearch(thread_id, rm_tag))
ev(Ev::Click, move |_| Msg::RemoveTag(thread_id, rm_tag))
]
]
})