Compare commits

...

32 Commits

Author SHA1 Message Date
22fd8409f6 chore: Release
All checks were successful
Continuous integration / Check (push) Successful in 40s
Continuous integration / Test Suite (push) Successful in 42s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 52s
Continuous integration / build (push) Successful in 50s
Continuous integration / Disallow unused dependencies (push) Successful in 2m21s
2025-02-22 12:41:57 -08:00
d0a4ba417f chore: Release 2025-02-22 12:41:30 -08:00
7b09b098a4 chore: Release 2025-02-22 12:41:15 -08:00
bd4c10a8fb Specify registry for all letterbox-* deps 2025-02-22 12:41:15 -08:00
ed3c5f152e chore: Release 2025-02-22 12:41:15 -08:00
63232d1e92 Publish only to xinu 2025-02-22 12:41:15 -08:00
4a3eba80d5 chore: Release 2025-02-22 12:41:15 -08:00
71d3745342 Try relative paths for letterbox-* deps 2025-02-22 12:41:14 -08:00
5fdc98633d chore: Release 2025-02-22 12:39:39 -08:00
57877f268d Set repository in workspace 2025-02-22 12:39:20 -08:00
871a93d58f Move most package metadata to workspace 2025-02-22 12:39:20 -08:00
4b7cbd4f9b chore: Release 2025-02-22 12:39:19 -08:00
aa2a9815df Add automatic per-email address unread folders 2025-02-22 12:38:57 -08:00
2e5b18a008 Fix cargo-udeps build step 2025-02-22 12:37:27 -08:00
d0a38114cc Add cargo-udeps build step 2025-02-22 12:37:27 -08:00
ccc1d516c7 fix(deps): update rust crate letterbox-notmuch to 0.8.0
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 40s
Continuous integration / Trunk (pull_request) Successful in 38s
Continuous integration / Check (pull_request) Successful in 1m44s
Continuous integration / Rustfmt (pull_request) Successful in 33s
Continuous integration / build (pull_request) Successful in 1m57s
Continuous integration / Check (push) Successful in 38s
Continuous integration / Trunk (push) Successful in 40s
Continuous integration / Test Suite (push) Successful in 1m45s
Continuous integration / Rustfmt (push) Successful in 33s
Continuous integration / build (push) Successful in 2m18s
2025-02-22 19:15:52 +00:00
246b710fdd fix(deps): update rust crate log to v0.4.26
All checks were successful
Continuous integration / Check (pull_request) Successful in 35s
Continuous integration / Test Suite (pull_request) Successful in 39s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 31s
Continuous integration / build (pull_request) Successful in 47s
Continuous integration / Test Suite (push) Successful in 40s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Check (push) Successful in 1m49s
Continuous integration / Rustfmt (push) Successful in 32s
Continuous integration / build (push) Successful in 2m45s
2025-02-21 05:46:06 +00:00
1a21c9fa8e fix(deps): update rust crate uuid to v1.14.0
All checks were successful
Continuous integration / Check (pull_request) Successful in 53s
Continuous integration / Test Suite (pull_request) Successful in 39s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 33s
Continuous integration / build (pull_request) Successful in 1m18s
Continuous integration / Check (push) Successful in 35s
Continuous integration / Test Suite (push) Successful in 39s
Continuous integration / Trunk (push) Successful in 37s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / build (push) Successful in 45s
2025-02-21 00:30:51 +00:00
9fd912b1d4 fix(deps): update rust crate serde to v1.0.218
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 41s
Continuous integration / Trunk (pull_request) Successful in 38s
Continuous integration / Check (pull_request) Successful in 1m51s
Continuous integration / Rustfmt (pull_request) Successful in 32s
Continuous integration / build (pull_request) Successful in 3m5s
Continuous integration / Check (push) Successful in 48s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / build (push) Successful in 48s
Continuous integration / Test Suite (push) Successful in 2m52s
2025-02-20 05:31:10 +00:00
9ded32f97b fix(deps): update rust crate anyhow to v1.0.96
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 40s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Check (pull_request) Successful in 1m52s
Continuous integration / Rustfmt (pull_request) Successful in 32s
Continuous integration / build (pull_request) Successful in 2m7s
Continuous integration / Check (push) Successful in 35s
Continuous integration / Test Suite (push) Successful in 39s
Continuous integration / Rustfmt (push) Successful in 32s
Continuous integration / Trunk (push) Successful in 1m26s
Continuous integration / build (push) Successful in 46s
2025-02-20 03:16:55 +00:00
10aac046bc fix(deps): update rust crate serde_json to v1.0.139
All checks were successful
Continuous integration / Check (pull_request) Successful in 36s
Continuous integration / Test Suite (pull_request) Successful in 40s
Continuous integration / Rustfmt (pull_request) Successful in 31s
Continuous integration / Trunk (pull_request) Successful in 1m24s
Continuous integration / build (pull_request) Successful in 47s
Continuous integration / Test Suite (push) Successful in 40s
Continuous integration / Trunk (push) Successful in 37s
Continuous integration / Check (push) Successful in 1m42s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / build (push) Successful in 1m55s
2025-02-20 03:00:53 +00:00
f4527baf89 fix(deps): update rust crate seed_hooks to 0.4.0
All checks were successful
Continuous integration / Check (pull_request) Successful in 1m25s
Continuous integration / Test Suite (pull_request) Successful in 39s
Continuous integration / Rustfmt (pull_request) Successful in 33s
Continuous integration / build (pull_request) Successful in 46s
Continuous integration / Trunk (pull_request) Successful in 1m37s
Continuous integration / Check (push) Successful in 54s
Continuous integration / Trunk (push) Successful in 36s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / build (push) Successful in 46s
Continuous integration / Test Suite (push) Successful in 4m11s
2025-02-18 20:15:48 +00:00
11ec5bf747 fix(deps): update rust crate uuid to v1.13.2
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 40s
Continuous integration / Check (pull_request) Successful in 1m30s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 47s
Continuous integration / build (pull_request) Successful in 48s
Continuous integration / Check (push) Successful in 36s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / Test Suite (push) Successful in 2m8s
Continuous integration / build (push) Successful in 47s
2025-02-17 23:46:05 +00:00
6a53679755 fix(deps): update rust crate clap to v4.5.30
All checks were successful
Continuous integration / Check (pull_request) Successful in 37s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 31s
Continuous integration / Test Suite (pull_request) Successful in 2m0s
Continuous integration / build (pull_request) Successful in 46s
Continuous integration / Check (push) Successful in 35s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / Test Suite (push) Successful in 1m55s
Continuous integration / build (push) Successful in 47s
2025-02-17 19:15:50 +00:00
7bedec0692 chore(deps): lock file maintenance
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 41s
Continuous integration / Check (pull_request) Successful in 1m34s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 50s
Continuous integration / build (pull_request) Successful in 47s
Continuous integration / Check (push) Successful in 36s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / build (push) Successful in 47s
Continuous integration / Test Suite (push) Successful in 2m48s
2025-02-17 00:01:14 +00:00
78feb95811 chore: Release
All checks were successful
Continuous integration / Test Suite (push) Successful in 1m27s
Continuous integration / Check (push) Successful in 1m39s
Continuous integration / Trunk (push) Successful in 45s
Continuous integration / Rustfmt (push) Successful in 53s
Continuous integration / build (push) Successful in 1m10s
2025-02-15 14:49:11 -08:00
3aad2bb80e web: another attempt to fix progress bar 2025-02-15 14:47:32 -08:00
0df8de3661 web: use seed_hooks ability to create ev handlers 2025-02-15 14:47:32 -08:00
83ecc73fbd fix(deps): update rust crate seed_hooks to v0.1.16
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 41s
Continuous integration / Check (pull_request) Successful in 1m24s
Continuous integration / Trunk (pull_request) Successful in 39s
Continuous integration / Rustfmt (pull_request) Successful in 48s
Continuous integration / build (pull_request) Successful in 48s
Continuous integration / Check (push) Successful in 35s
Continuous integration / Trunk (push) Successful in 37s
Continuous integration / Test Suite (push) Successful in 1m41s
Continuous integration / Rustfmt (push) Successful in 31s
Continuous integration / build (push) Successful in 1m49s
2025-02-14 01:15:49 +00:00
c10313cd12 fix(deps): update rust crate letterbox-shared to 0.6.0
All checks were successful
Continuous integration / Test Suite (pull_request) Successful in 39s
Continuous integration / Check (pull_request) Successful in 1m24s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 48s
Continuous integration / build (pull_request) Successful in 46s
Continuous integration / Check (push) Successful in 35s
Continuous integration / Trunk (push) Successful in 37s
Continuous integration / Rustfmt (push) Successful in 32s
Continuous integration / Test Suite (push) Successful in 1m44s
Continuous integration / build (push) Successful in 46s
2025-02-13 23:31:34 +00:00
4c98bcd9cb Merge pull request 'fix(deps): update rust crate letterbox-notmuch to 0.6.0' (#34) from renovate/letterbox-notmuch-0.x into master
All checks were successful
Continuous integration / Check (push) Successful in 35s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 32s
Continuous integration / Test Suite (push) Successful in 1m52s
Continuous integration / build (push) Successful in 46s
Reviewed-on: #34
2025-02-13 15:17:39 -08:00
004de235a8 fix(deps): update rust crate letterbox-notmuch to 0.6.0
Some checks failed
renovate/artifacts Artifact file update failure
Continuous integration / Check (push) Successful in 36s
Continuous integration / Test Suite (push) Successful in 39s
Continuous integration / Trunk (push) Successful in 38s
Continuous integration / Rustfmt (push) Successful in 52s
Continuous integration / build (push) Successful in 47s
Continuous integration / Test Suite (pull_request) Successful in 40s
Continuous integration / Check (pull_request) Successful in 1m20s
Continuous integration / Trunk (pull_request) Successful in 37s
Continuous integration / Rustfmt (pull_request) Successful in 51s
Continuous integration / build (pull_request) Successful in 48s
2025-02-13 23:16:31 +00:00
13 changed files with 274 additions and 196 deletions

View File

@@ -49,3 +49,19 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
- run: cargo build - run: cargo build
udeps:
name: Disallow unused dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: nightly
- name: Run cargo-udeps
uses: aig787/cargo-udeps-action@v1
with:
version: 'latest'
args: '--all-targets'

243
Cargo.lock generated
View File

@@ -133,9 +133,9 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.95" version = "1.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4"
[[package]] [[package]]
name = "anymap" name = "anymap"
@@ -326,9 +326,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]] [[package]]
name = "atomic_hooks" name = "atomic_hooks"
version = "0.1.14" version = "0.1.17"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/" source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "86c32bda1a20d9da85f10e52b0d577334efcba8cf2e89e0327447233bf61440e" checksum = "ed46763977c6348f92dd0944bd9ea1204d71357185959e5960c8598728168af1"
dependencies = [ dependencies = [
"anymap", "anymap",
"atomic_hooks_macros", "atomic_hooks_macros",
@@ -464,9 +464,9 @@ dependencies = [
[[package]] [[package]]
name = "bitcode" name = "bitcode"
version = "0.6.4" version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ae9f4d868fa036ee7517b997dc2b6efd383a8b2efdcb4b07058260de060d3ef" checksum = "18c1406a27371b2f76232a2259df6ab607b91b5a0a7476a7729ff590df5a969a"
dependencies = [ dependencies = [
"arrayvec 0.7.6", "arrayvec 0.7.6",
"bitcode_derive", "bitcode_derive",
@@ -477,9 +477,9 @@ dependencies = [
[[package]] [[package]]
name = "bitcode_derive" name = "bitcode_derive"
version = "0.6.4" version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d0b1506d8de85c2198149fb9f6285e6b662a867f84579af2b3ef067a8842d35" checksum = "42b6b4cb608b8282dc3b53d0f4c9ab404655d562674c682db7e6c0458cc83c23"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -715,9 +715,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.13" version = "1.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@@ -775,9 +775,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.29" version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@@ -785,9 +785,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.29" version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@@ -1146,7 +1146,7 @@ dependencies = [
"reqwest", "reqwest",
"rustc-hash 2.1.1", "rustc-hash 2.1.1",
"selectors 0.25.0", "selectors 0.25.0",
"smallvec 1.13.2", "smallvec 1.14.0",
"url", "url",
] ]
@@ -1163,7 +1163,7 @@ dependencies = [
"phf 0.10.1", "phf 0.10.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"smallvec 1.13.2", "smallvec 1.14.0",
"syn 1.0.109", "syn 1.0.109",
] ]
@@ -1177,7 +1177,7 @@ dependencies = [
"dtoa-short", "dtoa-short",
"itoa 1.0.14", "itoa 1.0.14",
"phf 0.11.3", "phf 0.11.3",
"smallvec 1.13.2", "smallvec 1.14.0",
] ]
[[package]] [[package]]
@@ -1190,7 +1190,7 @@ dependencies = [
"dtoa-short", "dtoa-short",
"itoa 1.0.14", "itoa 1.0.14",
"phf 0.11.3", "phf 0.11.3",
"smallvec 1.13.2", "smallvec 1.14.0",
] ]
[[package]] [[package]]
@@ -1489,9 +1489,9 @@ dependencies = [
[[package]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.1" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]] [[package]]
name = "errno" name = "errno"
@@ -1888,9 +1888,9 @@ dependencies = [
[[package]] [[package]]
name = "glam" name = "glam"
version = "0.29.2" version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" checksum = "17fcdf9683c406c2fc4d124afd29c0d595e22210d633cbdb8695ba9935ab1dc6"
[[package]] [[package]]
name = "glob" name = "glob"
@@ -2077,9 +2077,9 @@ dependencies = [
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.4.7" version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2"
dependencies = [ dependencies = [
"atomic-waker", "atomic-waker",
"bytes 1.10.0", "bytes 1.10.0",
@@ -2436,14 +2436,14 @@ dependencies = [
"bytes 1.10.0", "bytes 1.10.0",
"futures-channel", "futures-channel",
"futures-util", "futures-util",
"h2 0.4.7", "h2 0.4.8",
"http 1.2.0", "http 1.2.0",
"http-body 1.0.1", "http-body 1.0.1",
"httparse", "httparse",
"httpdate", "httpdate",
"itoa 1.0.14", "itoa 1.0.14",
"pin-project-lite", "pin-project-lite",
"smallvec 1.13.2", "smallvec 1.14.0",
"tokio 1.43.0", "tokio 1.43.0",
"want 0.3.1", "want 0.3.1",
] ]
@@ -2606,7 +2606,7 @@ dependencies = [
"icu_normalizer_data", "icu_normalizer_data",
"icu_properties", "icu_properties",
"icu_provider", "icu_provider",
"smallvec 1.13.2", "smallvec 1.14.0",
"utf16_iter", "utf16_iter",
"utf8_iter", "utf8_iter",
"write16", "write16",
@@ -2681,7 +2681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
dependencies = [ dependencies = [
"idna_adapter", "idna_adapter",
"smallvec 1.13.2", "smallvec 1.14.0",
"utf8_iter", "utf8_iter",
] ]
@@ -2887,36 +2887,11 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-notmuch" name = "letterbox-notmuch"
version = "0.1.0" version = "0.8.1"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "5b7a90b339a8e107da4549c9a06ca79d3a318d1b72d64f64b6c218abeba5bdb8"
dependencies = [
"log",
"serde",
"serde_json",
"thiserror 2.0.11",
"tracing",
]
[[package]]
name = "letterbox-notmuch"
version = "0.3.0"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "c2aee51f92893db9597bb18aaaac251ca1cb2fcf5742dff7b58b36de020b2e76"
dependencies = [
"log",
"serde",
"serde_json",
"thiserror 2.0.11",
"tracing",
]
[[package]]
name = "letterbox-notmuch"
version = "0.6.0"
dependencies = [ dependencies = [
"itertools 0.14.0", "itertools 0.14.0",
"log", "log",
"mailparse",
"pretty_assertions", "pretty_assertions",
"rayon", "rayon",
"serde", "serde",
@@ -2927,14 +2902,14 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-procmail2notmuch" name = "letterbox-procmail2notmuch"
version = "0.6.0" version = "0.8.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
] ]
[[package]] [[package]]
name = "letterbox-server" name = "letterbox-server"
version = "0.6.0" version = "0.8.1"
dependencies = [ dependencies = [
"ammonia", "ammonia",
"anyhow", "anyhow",
@@ -2949,8 +2924,8 @@ dependencies = [
"css-inline", "css-inline",
"futures 0.3.31", "futures 0.3.31",
"html-escape", "html-escape",
"letterbox-notmuch 0.1.0", "letterbox-notmuch",
"letterbox-shared 0.3.0", "letterbox-shared",
"linkify", "linkify",
"log", "log",
"lol_html", "lol_html",
@@ -2977,27 +2952,16 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-shared" name = "letterbox-shared"
version = "0.3.0" version = "0.8.1"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "32d64fbee660ae3240084457ab5745f32ec4063bc8264ffff88760daafcde28b"
dependencies = [ dependencies = [
"build-info", "build-info",
"letterbox-notmuch 0.1.0", "letterbox-notmuch",
"serde",
]
[[package]]
name = "letterbox-shared"
version = "0.6.0"
dependencies = [
"build-info",
"letterbox-notmuch 0.1.0",
"serde", "serde",
] ]
[[package]] [[package]]
name = "letterbox-web" name = "letterbox-web"
version = "0.6.0" version = "0.8.1"
dependencies = [ dependencies = [
"build-info", "build-info",
"build-info-build", "build-info-build",
@@ -3008,8 +2972,8 @@ dependencies = [
"graphql_client", "graphql_client",
"human_format", "human_format",
"itertools 0.14.0", "itertools 0.14.0",
"letterbox-notmuch 0.3.0", "letterbox-notmuch",
"letterbox-shared 0.3.0", "letterbox-shared",
"log", "log",
"seed", "seed",
"seed_hooks", "seed_hooks",
@@ -3116,9 +3080,9 @@ dependencies = [
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.25" version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
[[package]] [[package]]
name = "lol_html" name = "lol_html"
@@ -3350,9 +3314,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.4" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
dependencies = [ dependencies = [
"adler2", "adler2",
] ]
@@ -3458,9 +3422,9 @@ checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b"
[[package]] [[package]]
name = "native-tls" name = "native-tls"
version = "0.2.13" version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
dependencies = [ dependencies = [
"libc", "libc",
"log", "log",
@@ -3560,7 +3524,7 @@ dependencies = [
"num-iter", "num-iter",
"num-traits", "num-traits",
"rand 0.8.5", "rand 0.8.5",
"smallvec 1.13.2", "smallvec 1.14.0",
"zeroize", "zeroize",
] ]
@@ -3627,9 +3591,9 @@ checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]] [[package]]
name = "oneshot" name = "oneshot"
version = "0.1.10" version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79d72a7c0f743d2ebb0a2ad1d219db75fdc799092ed3a884c9144c42a31225bd" checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea"
[[package]] [[package]]
name = "opaque-debug" name = "opaque-debug"
@@ -3639,9 +3603,9 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
[[package]] [[package]]
name = "openssl" name = "openssl"
version = "0.10.70" version = "0.10.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"cfg-if 1.0.0", "cfg-if 1.0.0",
@@ -3671,9 +3635,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]] [[package]]
name = "openssl-sys" name = "openssl-sys"
version = "0.9.105" version = "0.9.106"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
@@ -3882,7 +3846,7 @@ dependencies = [
"instant", "instant",
"libc", "libc",
"redox_syscall 0.2.16", "redox_syscall 0.2.16",
"smallvec 1.13.2", "smallvec 1.14.0",
"winapi 0.3.9", "winapi 0.3.9",
] ]
@@ -3894,8 +3858,8 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"libc", "libc",
"redox_syscall 0.5.8", "redox_syscall 0.5.9",
"smallvec 1.13.2", "smallvec 1.14.0",
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
@@ -4328,7 +4292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools 0.12.1", "itertools 0.14.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.98", "syn 2.0.98",
@@ -4383,9 +4347,9 @@ dependencies = [
[[package]] [[package]]
name = "quinn-udp" name = "quinn-udp"
version = "0.5.9" version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944"
dependencies = [ dependencies = [
"cfg_aliases", "cfg_aliases",
"libc", "libc",
@@ -4568,9 +4532,9 @@ dependencies = [
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.8" version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
] ]
@@ -4662,7 +4626,7 @@ dependencies = [
"futures-channel", "futures-channel",
"futures-core", "futures-core",
"futures-util", "futures-util",
"h2 0.4.7", "h2 0.4.8",
"http 1.2.0", "http 1.2.0",
"http-body 1.0.1", "http-body 1.0.1",
"http-body-util", "http-body-util",
@@ -4702,15 +4666,14 @@ dependencies = [
[[package]] [[package]]
name = "ring" name = "ring"
version = "0.17.8" version = "0.17.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73"
dependencies = [ dependencies = [
"cc", "cc",
"cfg-if 1.0.0", "cfg-if 1.0.0",
"getrandom 0.2.15", "getrandom 0.2.15",
"libc", "libc",
"spin",
"untrusted", "untrusted",
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
@@ -4806,7 +4769,7 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
"ref-cast", "ref-cast",
"serde", "serde",
"smallvec 1.13.2", "smallvec 1.14.0",
"stable-pattern", "stable-pattern",
"state", "state",
"time 0.3.37", "time 0.3.37",
@@ -5171,9 +5134,9 @@ dependencies = [
[[package]] [[package]]
name = "seed_hooks" name = "seed_hooks"
version = "0.1.13" version = "0.1.16"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/" source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "16dc43e7b705b6c684cb9472b3e76cf0596092539f9ba13cfe5c5860749fe1cd" checksum = "bd9fae7f24af67cee5936ae32b446493975845298a9f5c44224f9d6dd273bd2c"
dependencies = [ dependencies = [
"atomic_hooks", "atomic_hooks",
"gloo-timers", "gloo-timers",
@@ -5197,7 +5160,7 @@ dependencies = [
"phf_codegen 0.8.0", "phf_codegen 0.8.0",
"precomputed-hash", "precomputed-hash",
"servo_arc 0.2.0", "servo_arc 0.2.0",
"smallvec 1.13.2", "smallvec 1.14.0",
] ]
[[package]] [[package]]
@@ -5216,7 +5179,7 @@ dependencies = [
"phf_codegen 0.10.0", "phf_codegen 0.10.0",
"precomputed-hash", "precomputed-hash",
"servo_arc 0.3.0", "servo_arc 0.3.0",
"smallvec 1.13.2", "smallvec 1.14.0",
] ]
[[package]] [[package]]
@@ -5235,7 +5198,7 @@ dependencies = [
"phf_codegen 0.11.3", "phf_codegen 0.11.3",
"precomputed-hash", "precomputed-hash",
"servo_arc 0.4.0", "servo_arc 0.4.0",
"smallvec 1.13.2", "smallvec 1.14.0",
] ]
[[package]] [[package]]
@@ -5264,9 +5227,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.217" version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@@ -5284,9 +5247,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.217" version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -5295,9 +5258,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.138" version = "1.0.139"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
dependencies = [ dependencies = [
"itoa 1.0.14", "itoa 1.0.14",
"memchr", "memchr",
@@ -5484,9 +5447,9 @@ dependencies = [
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.13.2" version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@@ -5558,7 +5521,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sha2 0.10.8", "sha2 0.10.8",
"smallvec 1.13.2", "smallvec 1.14.0",
"thiserror 2.0.11", "thiserror 2.0.11",
"time 0.3.37", "time 0.3.37",
"tokio 1.43.0", "tokio 1.43.0",
@@ -5640,7 +5603,7 @@ dependencies = [
"serde", "serde",
"sha1", "sha1",
"sha2 0.10.8", "sha2 0.10.8",
"smallvec 1.13.2", "smallvec 1.14.0",
"sqlx-core", "sqlx-core",
"stringprep", "stringprep",
"thiserror 2.0.11", "thiserror 2.0.11",
@@ -5678,7 +5641,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sha2 0.10.8", "sha2 0.10.8",
"smallvec 1.13.2", "smallvec 1.14.0",
"sqlx-core", "sqlx-core",
"stringprep", "stringprep",
"thiserror 2.0.11", "thiserror 2.0.11",
@@ -5765,9 +5728,9 @@ dependencies = [
[[package]] [[package]]
name = "string_cache_codegen" name = "string_cache_codegen"
version = "0.5.3" version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "244292f3441c89febe5b5bdfbb6863aeaf4f64da810ea3050fd927b27b8d92ce" checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0"
dependencies = [ dependencies = [
"phf_generator 0.11.3", "phf_generator 0.11.3",
"phf_shared 0.11.3", "phf_shared 0.11.3",
@@ -5931,7 +5894,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sketches-ddsketch", "sketches-ddsketch",
"smallvec 1.13.2", "smallvec 1.14.0",
"tantivy-bitpacker", "tantivy-bitpacker",
"tantivy-columnar", "tantivy-columnar",
"tantivy-common", "tantivy-common",
@@ -6038,9 +6001,9 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.16.0" version = "3.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"fastrand", "fastrand",
@@ -6526,7 +6489,7 @@ dependencies = [
"axum", "axum",
"base64 0.22.1", "base64 0.22.1",
"bytes 1.10.0", "bytes 1.10.0",
"h2 0.4.7", "h2 0.4.8",
"http 1.2.0", "http 1.2.0",
"http-body 1.0.1", "http-body 1.0.1",
"http-body-util", "http-body-util",
@@ -6684,7 +6647,7 @@ dependencies = [
"once_cell", "once_cell",
"opentelemetry", "opentelemetry",
"opentelemetry_sdk", "opentelemetry_sdk",
"smallvec 1.13.2", "smallvec 1.14.0",
"tracing", "tracing",
"tracing-core", "tracing-core",
"tracing-log", "tracing-log",
@@ -6703,7 +6666,7 @@ dependencies = [
"once_cell", "once_cell",
"regex", "regex",
"sharded-slab", "sharded-slab",
"smallvec 1.13.2", "smallvec 1.14.0",
"thread_local", "thread_local",
"tracing", "tracing",
"tracing-core", "tracing-core",
@@ -6718,9 +6681,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.17.0" version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]] [[package]]
name = "ubyte" name = "ubyte"
@@ -6771,9 +6734,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.16" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]] [[package]]
name = "unicode-normalization" name = "unicode-normalization"
@@ -6863,9 +6826,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.13.1" version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1"
dependencies = [ dependencies = [
"getrandom 0.3.1", "getrandom 0.3.1",
"js-sys", "js-sys",
@@ -7084,7 +7047,7 @@ version = "1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d"
dependencies = [ dependencies = [
"redox_syscall 0.5.8", "redox_syscall 0.5.9",
"wasite", "wasite",
"web-sys", "web-sys",
] ]
@@ -7330,9 +7293,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.7.2" version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@@ -7505,27 +7468,27 @@ dependencies = [
[[package]] [[package]]
name = "zstd" name = "zstd"
version = "0.13.2" version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
dependencies = [ dependencies = [
"zstd-safe", "zstd-safe",
] ]
[[package]] [[package]]
name = "zstd-safe" name = "zstd-safe"
version = "7.2.1" version = "7.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722"
dependencies = [ dependencies = [
"zstd-sys", "zstd-sys",
] ]
[[package]] [[package]]
name = "zstd-sys" name = "zstd-sys"
version = "2.0.13+zstd.1.5.6" version = "2.0.14+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5"
dependencies = [ dependencies = [
"cc", "cc",
"pkg-config", "pkg-config",

View File

@@ -3,6 +3,14 @@ resolver = "2"
default-members = ["server"] default-members = ["server"]
members = ["web", "server", "notmuch", "procmail2notmuch", "shared"] members = ["web", "server", "notmuch", "procmail2notmuch", "shared"]
[workspace.package]
authors = ["Bill Thiede <git@xinu.tv>"]
edition = "2021"
license = "UNLICENSED"
publish = ["xinu"]
version = "0.8.1"
repository = "https://git.z.xinu.tv/wathiede/letterbox"
[profile.dev] [profile.dev]
opt-level = 1 opt-level = 1

View File

@@ -10,4 +10,4 @@ sqlx-prepare:
_release level: sqlx-prepare _release level: sqlx-prepare
cargo-release release -x {{ level }} --workspace --no-confirm cargo-release release -x {{ level }} --workspace --no-confirm --registry=xinu

View File

@@ -1,16 +1,18 @@
[package] [package]
name = "letterbox-notmuch" name = "letterbox-notmuch"
version = "0.6.0"
edition = "2021"
exclude = ["/testdata"] exclude = ["/testdata"]
description = "Wrapper for calling notmuch cli" description = "Wrapper for calling notmuch cli"
license = "UNLICENSED" authors.workspace = true
repository = "https://git.z.xinu.tv/wathiede/letterbox" edition.workspace = true
publish = ["xinu"] license.workspace = true
publish.workspace = true
repository.workspace = true
version.workspace = true
[dependencies] [dependencies]
log = "0.4.14" log = "0.4.14"
mailparse = "0.16.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0", features = ["unbounded_depth"] } serde_json = { version = "1.0", features = ["unbounded_depth"] }
thiserror = "2.0.0" thiserror = "2.0.0"

View File

@@ -207,6 +207,7 @@
//! ``` //! ```
use std::{ use std::{
collections::HashMap,
ffi::OsStr, ffi::OsStr,
io::{self}, io::{self},
path::{Path, PathBuf}, path::{Path, PathBuf},
@@ -459,6 +460,8 @@ pub enum NotmuchError {
StringUtf8Error(#[from] std::string::FromUtf8Error), StringUtf8Error(#[from] std::string::FromUtf8Error),
#[error("failed to parse str as int")] #[error("failed to parse str as int")]
ParseIntError(#[from] std::num::ParseIntError), ParseIntError(#[from] std::num::ParseIntError),
#[error("failed to parse mail: {0}")]
MailParseError(#[from] mailparse::MailParseError),
} }
#[derive(Default)] #[derive(Default)]
@@ -605,6 +608,59 @@ impl Notmuch {
Ok(serde_json::from_slice(&res)?) Ok(serde_json::from_slice(&res)?)
} }
#[instrument(skip_all)]
pub fn unread_recipients(&self) -> Result<HashMap<String, usize>, NotmuchError> {
let slice = self.run_notmuch([
"show",
"--include-html=false",
"--entire-thread=false",
"--body=false",
"--format=json",
// Arbitrary limit to prevent too much work
"--limit=1000",
"is:unread",
])?;
// Notmuch returns JSON with invalid unicode. So we lossy convert it to a string here and
// use that for parsing in rust.
let s = String::from_utf8_lossy(&slice);
let mut deserializer = serde_json::Deserializer::from_str(&s);
deserializer.disable_recursion_limit();
let ts: ThreadSet = serde::de::Deserialize::deserialize(&mut deserializer)?;
deserializer.end()?;
let mut r = HashMap::new();
for t in ts.0 {
for tn in t.0 {
let Some(msg) = tn.0 else {
continue;
};
let mut addrs = vec![];
let hdr = msg.headers.to;
if let Some(to) = hdr {
addrs.push(to);
};
let hdr = msg.headers.cc;
if let Some(cc) = hdr {
addrs.push(cc);
};
for recipient in addrs {
mailparse::addrparse(&recipient)?
.into_inner()
.iter()
.for_each(|a| {
let mailparse::MailAddr::Single(si) = a else {
return;
};
let addr = &si.addr;
if addr == "couchmoney@gmail.com" || addr.ends_with("@xinu.tv") {
*r.entry(addr.clone()).or_default() += 1;
}
});
}
}
}
Ok(r)
}
fn run_notmuch<I, S>(&self, args: I) -> Result<Vec<u8>, NotmuchError> fn run_notmuch<I, S>(&self, args: I) -> Result<Vec<u8>, NotmuchError>
where where
I: IntoIterator<Item = S>, I: IntoIterator<Item = S>,

View File

@@ -1,11 +1,12 @@
[package] [package]
name = "letterbox-procmail2notmuch" name = "letterbox-procmail2notmuch"
version = "0.6.0"
edition = "2021"
description = "Tool for generating notmuch rules from procmail" description = "Tool for generating notmuch rules from procmail"
license = "UNLICENSED" authors.workspace = true
repository = "https://git.z.xinu.tv/wathiede/letterbox" edition.workspace = true
publish = ["xinu"] license.workspace = true
publish.workspace = true
repository.workspace = true
version.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@@ -1,12 +1,13 @@
[package] [package]
name = "letterbox-server" name = "letterbox-server"
version = "0.6.0"
edition = "2021"
default-run = "letterbox-server" default-run = "letterbox-server"
description = "Backend for letterbox" description = "Backend for letterbox"
license = "UNLICENSED" authors.workspace = true
repository = "https://git.z.xinu.tv/wathiede/letterbox" edition.workspace = true
publish = ["xinu"] license.workspace = true
publish.workspace = true
repository.workspace = true
version.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -47,8 +48,8 @@ urlencoding = "2.1.3"
#xtracing = { path = "../../xtracing" } #xtracing = { path = "../../xtracing" }
#xtracing = { git = "http://git-private.h.xinu.tv/wathiede/xtracing.git" } #xtracing = { git = "http://git-private.h.xinu.tv/wathiede/xtracing.git" }
xtracing = { version = "0.2.0", registry = "xinu" } xtracing = { version = "0.2.0", registry = "xinu" }
letterbox-notmuch = { version = "0.1.0", registry = "xinu" } letterbox-notmuch = { version = "0.8.1", path = "../notmuch", registry = "xinu" }
letterbox-shared = { version = "0.3.0", registry = "xinu" } letterbox-shared = { version = "0.8.1", path = "../shared", registry = "xinu" }
[build-dependencies] [build-dependencies]
build-info-build = "0.0.39" build-info-build = "0.0.39"

View File

@@ -793,7 +793,17 @@ impl FromStr for Query {
if word == "is:unread" { if word == "is:unread" {
unread_only = true unread_only = true
} else if word.starts_with("tag:") { } else if word.starts_with("tag:") {
tags.push(word["tag:".len()..].to_string()); let t = &word["tag:".len()..];
// Per-address emails are faked as `tag:@<domain>/<username>`, rewrite to `to:` form
if t.starts_with('@') && t.contains('.') {
let t = match t.split_once('/') {
None => format!("to:{t}"),
Some((domain, user)) => format!("to:{user}{domain}"),
};
remainder.push(t);
} else {
tags.push(t.to_string());
};
/* /*
} else if word.starts_with("tag:") { } else if word.starts_with("tag:") {

View File

@@ -1,11 +1,7 @@
use std::{ use std::{collections::HashMap, fs::File};
collections::HashMap,
fs::File,
hash::{DefaultHasher, Hash, Hasher},
time::Instant,
};
use letterbox_notmuch::Notmuch; use letterbox_notmuch::Notmuch;
use letterbox_shared::compute_color;
use log::{error, info, warn}; use log::{error, info, warn};
use mailparse::{parse_content_type, parse_mail, MailHeader, MailHeaderMap, ParsedMail}; use mailparse::{parse_content_type, parse_mail, MailHeader, MailHeaderMap, ParsedMail};
use memmap::MmapOptions; use memmap::MmapOptions;
@@ -107,7 +103,6 @@ pub async fn search(
#[instrument(name="nm::tags", skip_all, fields(needs_unread=needs_unread))] #[instrument(name="nm::tags", skip_all, fields(needs_unread=needs_unread))]
pub fn tags(nm: &Notmuch, needs_unread: bool) -> Result<Vec<Tag>, ServerError> { pub fn tags(nm: &Notmuch, needs_unread: bool) -> Result<Vec<Tag>, ServerError> {
let now = Instant::now();
let unread_msg_cnt: HashMap<String, usize> = if needs_unread { let unread_msg_cnt: HashMap<String, usize> = if needs_unread {
// 10000 is an arbitrary number, if there's more than 10k unread messages, we'll // 10000 is an arbitrary number, if there's more than 10k unread messages, we'll
// get an inaccurate count. // get an inaccurate count.
@@ -123,13 +118,11 @@ pub fn tags(nm: &Notmuch, needs_unread: bool) -> Result<Vec<Tag>, ServerError> {
} else { } else {
HashMap::new() HashMap::new()
}; };
let tags = nm let tags: Vec<_> = nm
.tags()? .tags()?
.into_iter() .into_iter()
.map(|tag| { .map(|tag| {
let mut hasher = DefaultHasher::new(); let hex = compute_color(&tag);
tag.hash(&mut hasher);
let hex = format!("#{:06x}", hasher.finish() % (1 << 24));
let unread = if needs_unread { let unread = if needs_unread {
*unread_msg_cnt.get(&tag).unwrap_or(&0) *unread_msg_cnt.get(&tag).unwrap_or(&0)
} else { } else {
@@ -142,8 +135,24 @@ pub fn tags(nm: &Notmuch, needs_unread: bool) -> Result<Vec<Tag>, ServerError> {
unread, unread,
} }
}) })
.chain(
nm.unread_recipients()?
.into_iter()
.filter_map(|(name, unread)| {
let Some(idx) = name.find('@') else {
return None;
};
let name = format!("{}/{}", &name[idx..], &name[..idx]);
let bg_color = compute_color(&name);
Some(Tag {
name,
fg_color: "white".to_string(),
bg_color,
unread,
})
}),
)
.collect(); .collect();
info!("Fetching tags took {} seconds", now.elapsed().as_secs_f32());
Ok(tags) Ok(tags)
} }

View File

@@ -1,15 +1,16 @@
[package] [package]
name = "letterbox-shared" name = "letterbox-shared"
version = "0.6.0"
edition = "2021"
description = "Shared module for letterbox" description = "Shared module for letterbox"
license = "UNLICENSED" authors.workspace = true
repository = "https://git.z.xinu.tv/wathiede/letterbox" edition.workspace = true
publish = ["xinu"] license.workspace = true
publish.workspace = true
repository.workspace = true
version.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
build-info = "0.0.39" build-info = "0.0.39"
letterbox-notmuch = { version = "0.1.0", registry = "xinu" } letterbox-notmuch = { version = "0.8.1", path = "../notmuch", registry = "xinu" }
serde = { version = "1.0.147", features = ["derive"] } serde = { version = "1.0.147", features = ["derive"] }

View File

@@ -1,12 +1,12 @@
[package] [package]
version = "0.6.0"
name = "letterbox-web" name = "letterbox-web"
authors = ["Bill Thiede <git@xinu.tv>"]
edition = "2021"
description = "Web frontend for letterbox" description = "Web frontend for letterbox"
license = "UNLICENSED" authors.workspace = true
repository = "https://git.z.xinu.tv/wathiede/letterbox" edition.workspace = true
publish = ["xinu"] license.workspace = true
publish.workspace = true
repository.workspace = true
version.workspace = true
[build-dependencies] [build-dependencies]
build-info-build = "0.0.39" build-info-build = "0.0.39"
@@ -33,8 +33,8 @@ wasm-bindgen = "=0.2.100"
uuid = { version = "1.13.1", features = [ uuid = { version = "1.13.1", features = [
"js", "js",
] } # direct dep to set js feature, prevents Rng issues ] } # direct dep to set js feature, prevents Rng issues
letterbox-shared = { version = "0.3.0", registry = "xinu" } letterbox-shared = { version = "0.8.1", path = "../shared", registry = "xinu" }
letterbox-notmuch = { version = "0.3.0", registry = "xinu" } letterbox-notmuch = { version = "0.8.1", path = "../notmuch", registry = "xinu" }
seed_hooks = { version = "0.1.13", registry = "xinu" } seed_hooks = { version = "0.1.13", registry = "xinu" }
[package.metadata.wasm-pack.profile.release] [package.metadata.wasm-pack.profile.release]

View File

@@ -1,4 +1,4 @@
use std::collections::HashSet; use std::{cmp::Ordering, collections::HashSet};
use chrono::{DateTime, Datelike, Duration, Local, Utc}; use chrono::{DateTime, Datelike, Duration, Local, Utc};
use human_format::{Formatter, Scales}; use human_format::{Formatter, Scales};
@@ -6,7 +6,7 @@ use itertools::Itertools;
use letterbox_shared::compute_color; use letterbox_shared::compute_color;
use log::{debug, error, info}; use log::{debug, error, info};
use seed::{prelude::*, *}; use seed::{prelude::*, *};
use seed_hooks::{state_access::CloneState, topo, use_state}; use seed_hooks::{state_access::CloneState, topo, use_state, StateAccessEventHandlers};
use web_sys::HtmlElement; use web_sys::HtmlElement;
use crate::{ use crate::{
@@ -95,7 +95,6 @@ pub fn view(model: &Model) -> Node<Msg> {
"lg:flex-nowrap", "lg:flex-nowrap",
"w-full" "w-full"
], ],
reading_progress(model.read_completion_ratio),
div![ div![
C!["w-full", "lg:w-48", "flex-none", "flex", "flex-col"], C!["w-full", "lg:w-48", "flex-none", "flex", "flex-col"],
tags(model), tags(model),
@@ -109,7 +108,8 @@ pub fn view(model: &Model) -> Node<Msg> {
view_header(&model.query, &model.refreshing_state, true), view_header(&model.query, &model.refreshing_state, true),
content, content,
view_header(&model.query, &model.refreshing_state, false), view_header(&model.query, &model.refreshing_state, false),
] ],
reading_progress(model.read_completion_ratio),
] ]
} }
@@ -857,9 +857,7 @@ fn view_content_tree(content_tree: &str) -> Node<Msg> {
} }
]], ]],
" Debug", " Debug",
ev(Ev::Click, move |_| { debug_open.on_click(|d| *d = !*d)
debug_open.set(!debug_open.get());
})
], ],
IF!(debug_open.get() => IF!(debug_open.get() =>
pre![C!["NOTPORTED","content-tree"], content_tree]), pre![C!["NOTPORTED","content-tree"], content_tree]),
@@ -1008,11 +1006,26 @@ pub fn tags(model: &Model) -> Node<Msg> {
} }
tag_els tag_els
} }
let unread = model let mut unread = model
.tags .tags
.as_ref() .as_ref()
.map(|tags| tags.iter().filter(|t| t.unread > 0).collect()) .map(|tags| tags.iter().filter(|t| t.unread > 0).collect())
.unwrap_or(Vec::new()); .unwrap_or(Vec::new());
unread.sort_by(|a, b| {
let r = if a.name.starts_with('@') && b.name.starts_with('@') {
a.name.cmp(&b.name)
} else if a.name.starts_with('@') {
Ordering::Less
} else if b.name.starts_with('@') {
Ordering::Greater
} else {
a.name.cmp(&b.name)
};
if a.name.starts_with('@') || b.name.starts_with('@') {
info!("a {} < b {} = {r:?}", a.name, b.name,);
}
return r;
});
let tags_open = use_state(|| false); let tags_open = use_state(|| false);
let force_tags_open = unread.is_empty(); let force_tags_open = unread.is_empty();
aside![ aside![
@@ -1030,9 +1043,7 @@ pub fn tags(model: &Model) -> Node<Msg> {
"fa-angle-down" "fa-angle-down"
} }
]]), ]]),
ev(Ev::Click, move |_| { tags_open.on_click(|t| *t = !*t)
tags_open.set(!tags_open.get());
})
], ],
div![ div![
IF!(force_tags_open||tags_open.get() => model.tags.as_ref().map(|tags| view_tags(tags.iter(),false))), IF!(force_tags_open||tags_open.get() => model.tags.as_ref().map(|tags| view_tags(tags.iter(),false))),