From 44eff3747075d651314ecff1f328f4b19ba850af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DOUIN?= Date: Wed, 20 May 2026 02:13:30 +0200 Subject: [PATCH] build: improve bin size --- Cargo.lock | 30 ++---------------------------- Cargo.toml | 11 ++++++++--- README.md | 26 ++++++++++---------------- 3 files changed, 20 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2287eaf9..b9e3181a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" dependencies = [ "log", - "regex", ] [[package]] @@ -597,7 +596,6 @@ dependencies = [ "anstream", "anstyle", "env_filter", - "jiff", "log", ] @@ -827,7 +825,6 @@ dependencies = [ "comfy-table", "convert_case 0.11.0", "dirs", - "gethostname 1.1.0", "humansize", "io-discovery", "io-email", @@ -1625,7 +1622,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pimalaya-cli" version = "0.0.1" -source = "git+https://github.com/pimalaya/cli#9e520d1eb7fdda81e3e44f880130fa9fea741c04" +source = "git+https://github.com/pimalaya/cli#c3ead3ae2dd74d98e5a695bc476d74399d7a6c0b" dependencies = [ "anyhow", "clap", @@ -1855,18 +1852,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.14", - "regex-syntax 0.8.10", -] - [[package]] name = "regex-automata" version = "0.3.9" @@ -1875,7 +1860,7 @@ checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax", ] [[package]] @@ -1883,11 +1868,6 @@ name = "regex-automata" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.10", -] [[package]] name = "regex-syntax" @@ -1895,12 +1875,6 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - [[package]] name = "rfc2047-decoder" version = "1.1.0" diff --git a/Cargo.toml b/Cargo.toml index 5145656a..0c77017c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [features] -default = ["imap", "smtp", "maildir", "jmap", "rustls-ring"] +default = ["imap", "smtp", "rustls-ring"] imap = ["dep:io-imap", "dep:mail-parser", "dep:rfc2047-decoder", "io-email/imap", "io-imap/client"] jmap = ["dep:base64", "dep:io-jmap", "dep:mail-parser", "dep:serde_json", "io-email/jmap", "io-jmap/client"] smtp = ["dep:io-smtp", "dep:mail-parser", "io-email/smtp"] @@ -27,6 +27,12 @@ rustls-aws = ["pimalaya-stream/rustls-aws", "io-discovery/rustls-aws", "io-imap? rustls-ring = ["pimalaya-stream/rustls-ring", "io-discovery/rustls-ring", "io-imap?/rustls-ring", "io-jmap?/rustls-ring", "io-smtp?/rustls-ring"] vendored = ["pimalaya-stream/vendored"] +[profile.release] +lto = "fat" +codegen-units = 1 +strip = "symbols" +panic = "abort" + [build-dependencies] pimalaya-cli = { version = "0.0.1", default-features = false, features = ["build"] } @@ -38,14 +44,13 @@ clap = { version = "4.4", features = ["derive", "env", "wrap_help"] } comfy-table = "7" convert_case = { version = "0.11", optional = true } dirs = "6" -gethostname = "1" humansize = "2" io-discovery = { version = "0.0.1", default-features = false, features = ["pacc", "autoconfig", "rfc6186", "client"] } ariadne = "0.5" io-email = { version = "0.0.1", default-features = false, features = ["serde", "client", "search"] } io-imap = { version = "0.0.1", default-features = false, optional = true } io-jmap = { version = "0.0.1", default-features = false, optional = true } -io-maildir = { version = "0.0.1", default-features = false, features = ["serde"], optional = true } +io-maildir = { version = "0.0.1", default-features = false, optional = true } io-smtp = { version = "0.0.1", default-features = false, optional = true } log = "0.4" mail-builder = "0.3" diff --git a/README.md b/README.md index e7095241..63ae4c3e 100644 --- a/README.md +++ b/README.md @@ -45,18 +45,18 @@ himalaya envelopes list --account posteo -m Archives.FOSS --page 2 ## Features -- **Shared API** that maps `mailboxes`, `envelopes`, `flags`, `messages` and `attachments` to the active backend (IMAP, JMAP or Maildir) -- **Protocol-specific APIs** exposing each backend's full surface (`himalaya imap …`, `himalaya jmap …`, `himalaya maildir …`, `himalaya smtp …`) -- **IMAP** backend [rfc9051](https://www.iana.org/go/rfc9051) (requires `imap` cargo feature) -- **JMAP** backend [rfc8620](https://www.iana.org/go/rfc8620), [rfc8621](https://www.iana.org/go/rfc8621) (requires `jmap` cargo feature) -- **Maildir** backend (requires `maildir` cargo feature) -- **SMTP** backend [rfc5321](https://www.iana.org/go/rfc5321) (requires `smtp` cargo feature) +- **Shared API** that maps `mailboxes`, `envelopes`, `flags`, `messages` and `attachments` to the active backend +- **Protocol-specific APIs** exposing each backend's full surface (`himalaya imap/smtp/maildir/jmap…`) +- **IMAP** support [rfc9051](https://www.iana.org/go/rfc9051) (requires `imap` feature) +- **JMAP** support [rfc8620](https://www.iana.org/go/rfc8620), [rfc8621](https://www.iana.org/go/rfc8621) (requires `jmap` feature) +- **Maildir** support (requires `maildir` feature) +- **SMTP** backend [rfc5321](https://www.iana.org/go/rfc5321) (requires `smtp` feature) - **TLS** support: - [native-tls](https://crates.io/crates/native-tls) (requires `native-tls` feature) - [rustls](https://crates.io/crates/rustls): - AWS-LC crypto provider (requires `rustls-aws` feature) - Ring crypto provider (requires `rustls-ring` feature) -- **SASL** support: ANONYMOUS, LOGIN, PLAIN (IMAP/SMTP) +- **SASL** support: anonymous, login, plain, oauthbearer, xoauth2, scram-sha-256 - **Provider discovery** wizard powered by [io-discovery](https://github.com/pimalaya/io-discovery): Thunderbird Autoconfiguration, PACC and RFC 6186 SRV lookups - **TOML** configuration with multi-account support - **JSON** output via `--json` @@ -212,7 +212,7 @@ Accounts can be (re)configured later with `himalaya account configure `. T You can also write the configuration by hand: -- Copy the documented [`./config.sample.toml`](./config.sample.toml) +- Copy the documented [./config.sample.toml](./config.sample.toml) - Paste it into one of: - `$XDG_CONFIG_HOME/himalaya/config.toml` - `$HOME/.config/himalaya/config.toml` @@ -230,7 +230,7 @@ Backend-agnostic commands operate on the account's first configured backend, or ``` himalaya mailboxes list himalaya envelopes list -m INBOX --page 2 -himalaya envelopes list from alice and after 2026-01-01 order by date desc +himalaya envelopes search from alice and after 2026-01-01 order by date desc himalaya flags add -m INBOX --flag seen 1:3,5 himalaya messages copy --from INBOX --to Archives 42 himalaya attachments download -m INBOX 42 @@ -238,13 +238,7 @@ himalaya attachments download -m INBOX 42 When the `inbox` alias is configured under `[mailbox.alias]`, `-m/--mailbox` becomes optional: shared commands fall back to that id. With `[mailbox.alias] inbox = "INBOX"`, the calls above shorten to `envelopes list --page 2`, `flags add --flag seen 1:3,5`, etc. -`envelopes list` accepts a trailing search query covering `date`, `after`, `from`, `to`, `subject`, `body`, `flag` conditions (combined with `and`, `or`, `not`, grouped with parens) and a `order by date|from|to|subject [asc|desc]` sort chain. Date clauses target the `Date:` header (sent-at) on every backend. - -Backend coverage: - -- **IMAP**: full grammar via `SEARCH` (RFC 9051) + `SORT` (RFC 5256). `SENTON` / `SENTSINCE` keep date semantics anchored to the `Date:` header. -- **JMAP**: conjunctive filters only (`or` / `not` rejected; the JMAP wire model does not expose `FilterOperator` in `io-jmap` yet). Date clauses use an over-approximating `receivedAt` server filter plus a client-side `sentAt` post-filter so the sent-at rule is honored exactly. -- **Maildir**: full grammar except `body` (would require parsing every candidate message file; planned). +`envelopes list` is plain pagination, ordered by date descending. To filter or sort, use `envelopes search` with a trailing query covering `date`, `after`, `from`, `to`, `subject`, `body`, `flag` conditions (combined with `and`, `or`, `not`, grouped with parens) and an `order by date|from|to|subject [asc|desc]` sort chain. Date clauses target the `Date:` header (sent-at) on every backend. The shared surface is a strict least-common-denominator subset across IMAP, JMAP and Maildir. Operations that do not generalize (mailbox roles, attribute flags, JMAP-specific queries…) live under the protocol-specific subcommands.