Commit Graph

2278 Commits (06ec2790d0f3fd429e68987b4dfe6151afbc3d5b)
 

Author SHA1 Message Date
Manos Pitsidianakis 866166eb8e
attachments: don't print parsing error for empty bytes 1 year ago
Manos Pitsidianakis d4e605c098
Add tagref source code annotations
Source Code Annotation Tags:

Global tags (in tagref format <https://github.com/stepchowfun/tagref>)
for source code annotation:

- [tag:hardcoded_color_value] Replace hardcoded color values with user
   configurable ones.
- [tag:needs_unit_test]
- [tag:needs_user_doc]
- [tag:needs_dev_doc]
- [tag:FIXME]
- [tag:TODO]
- [tag:VERIFY] Verify whether this is the correct way to do something
- [tag:DEBT] Technical debt
1 year ago
Manos Pitsidianakis a5770c89f4
Add Woodpecker-CI check pipeline 1 year ago
Manos Pitsidianakis 74e15316db
view/envelope: open message/rfc822 attachments in subview instead of new tab 1 year ago
Manos Pitsidianakis d93ee413a7
melib/datetime: add timestamp_to_string_utc
Tests were using `timestamp_to_string` which in turn uses `localtime_r`
which assumes the local machine's time zone. Use gmtime_r instead.

Fixes #252
1 year ago
Manos Pitsidianakis c2ed3e283f
view/envelope: fix Source::* view showing only envelope body
Instead of the entire envelope source
1 year ago
Manos Pitsidianakis b0e867eb68
Move src to meli/src 1 year ago
Manos Pitsidianakis b5657201db
melib: fix doctest compilation errors 1 year ago
rek2 3803d788ab
if auth is false checks if config has password entry 1 year ago
rek2 b5f205b77b add availability to use server_password_command in the nntp backend like in the IMAP backend 1 year ago
Damian Poddebniak 7c33f8999b chore: Use published imap-codec 0.10.0. 1 year ago
Damian Poddebniak 34a54d3c05 docs: Add some `TODO(#222)`s. 1 year ago
Damian Poddebniak 9d51b6bd52 chore: Update `imap-codec`. 1 year ago
Manos Pitsidianakis 7998e1e77e
melib/datetime: add missing LC libc constants for openbsd target_os
Fixes #242

"Compilation failure on master on OpenBSD" #242
1 year ago
Manos Pitsidianakis 957abf4e72
Update cargo dependencies
Concerns #242 - "Compilation failure on master on OpenBSD"
1 year ago
Manos Pitsidianakis e3dfeaad7e
Fix compilation error when building without `gpgme` feature 1 year ago
Manos Pitsidianakis 619fbef129
melib/thread: recursively calculate update_show_subject()
Walk the entire thread tree and update show_subject collectively when a
new entry is added.
1 year ago
Manos Pitsidianakis 342df091a0
mail/view: don't set all thread to seen when opening a thread entry 1 year ago
Manos Pitsidianakis 1bcc0bbece
melib/mbox: add mbox parsing test 1 year ago
Manos Pitsidianakis e8e49e741b
melib/mbox: fix wrong per message offset 1 year ago
Manos Pitsidianakis 1dc1d86848
melib/shellexpand: fix infinite loop bug
Introduced in recent "fixing clippy lints" commit
1 year ago
Manos Pitsidianakis ba7f5dce1c
listing/thread: fix display of threaded conversations tree structure
When missing intermediate and/or parent messages in a thread, the
printed thread tree branches were completely invalid. This commit makes
sure thread node entries that have no corresponding envelopes are
accounted for in the tree structure.
1 year ago
Manos Pitsidianakis 0b258a1f05
meli: clippy lint fixes 1 year ago
Manos Pitsidianakis 5f29faa640
melib: clippy lint fixes 1 year ago
Manos Pitsidianakis 6858ee1fab
meli: move subcommand handling to its own module 1 year ago
Manos Pitsidianakis f98e36cee5
melib: Replace old-style /*! module doc comments with //! 1 year ago
Manos Pitsidianakis f0d88005fb
melib/email: change message/rfc822 Display repr
Put subject first.
1 year ago
Manos Pitsidianakis e64923eeaa
melib/email/headers/names: fix debug_assert condition
On invalid parsings, _cnt can be equal to probe and chunk len because
the value won't be a valid header
1 year ago
Manos Pitsidianakis 65179d4816
composer: fix cursor/widget focus scrolling logic
Scrolling up/down with scroll_{up,down} shortcuts didn't work correctly,
because the form widget used its own shortcuts. This commit refactors
the cursor logic.
1 year ago
Manos Pitsidianakis 0c0a678cff
state.rs: fix overlay widgets not being reaped after Unrealize event 1 year ago
Manos Pitsidianakis f5cfbd32e6
melib/imap: on set_flags, update {un,}seen sets in all mailboxes
Some envelopes might be in several mailboxes, for example in Gmail's
implementation of IMAP.
1 year ago
Manos Pitsidianakis 363f493099
listing: add {previous,next}_entry shortcuts to quickly open other mail entries
When reading a mail entry, with Ctrl+n you can switch to the next entry,
and with Ctrl+p to the previous one. They can be reconfigured by setting
the shortcuts.listing.next_entry and shortcuts.listing.previous_entry
settings.
1 year ago
Manos Pitsidianakis 8cab9d9da8
listing/thread: add option to hide consecutive identical From values inside a thread
The config setting is listing.threaded_repeat_identical_from_values and
the default value is false

Before:

data:image/webp;base64,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

After:

data:image/webp;base64,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
1 year ago
Manos Pitsidianakis b05d929975
account: impl exponential backoff when retrying connection
When connection fails to be established because of network issues,
perform an exponential back-off reconnection.

https://cloud.google.com/iot/docs/how-tos/exponential-backoff

This will limit maximum waiting time before next attempt and also
prevent reconnecting without wait when there's no reason to (network or
remote server is down).

The algorithm is really crude:

Instead of uniformly sampling 1..=1000 milliseconds, we sample (4 *
random::<u8>()) which is at most 4 * 255 = 1020 which is good enough.

1. Try to connect immediately
2. If it fails, set retries = 1.
3. Try to reconnect after retries * (4 * random::<u8>())
4. If it fails, set retries *= 2 = 2.
5. Try to reconnect after retries * (4 * random::<u8>())
6. If it fails, set retries *= 2 = 4.
7. Try to reconnect after retries * (4 * random::<u8>())
8. If it fails, set retries *= 2 = 8. Stop increasing retries from now
   on.
9. Try to reconnect in a loop after retries * (4 * random::<u8>())
1 year ago
Manos Pitsidianakis 5699baecfb
melib: add utils::{futures, random} 1 year ago
Manos Pitsidianakis 02e86d1fad
listing/conversations: check for subject overflow on draw 1 year ago
Manos Pitsidianakis fdc0861ac0
view/thread.rs: fix expanded_hash argument off by one error
When calling ThreadView::new with an envelope hash, Some(expanded_hash),
in the arguments, when translating it to a cursor position (usize) it
was mistakenly subtracted with 1 resulting in the wrong thread entry
showing up as expanded.
1 year ago
Manos Pitsidianakis 45bac6eb16
meli: Tidy up use of debug!
melib::debug! macro was deprecated when we started using the `log` crate
in `melib`. This commit replaces it with log::{debug,trace}! macro uses.
1 year ago
Manos Pitsidianakis 575509f1ed
mail/listing.rs: move mail view to listing parent component
Instead of having a different widget to view mail in for each Listing
(plain, threaded, compact, etc) use a single widget in the listing's
parent type.

This will help with making the listing logic more modular in future
refactors to allow all combinations of listing/mail view/ thread view
positions and layouts.
1 year ago
Manos Pitsidianakis 5c9b3fb044
component: impl Component for Box<dyn Component>
Useful to have.
1 year ago
Manos Pitsidianakis 155fb41b93
components.rs: remove unused Component::set_id method 1 year ago
Manos Pitsidianakis 96537e48c5
Add {Timer,Component}Id wrapper types over Uuid 1 year ago
Manos Pitsidianakis 4da5366959
Remove bincode dep, use serde_json for sqlite3 values 1 year ago
Manos Pitsidianakis fd0faade06
melib/imap: add connection instance id string for debugging in logs
- Add an ID field in ImapConnection and ImapStream that records where
  each instance was created. This is useful for differentiating main
  backend connections from watching thread connections (the ones that
  listen to updates from the IMAP server with IDLE or polling).
- Add an imap_trace! macro that uses log::trace! internally but also
  prepends the connection's ID string to each log line.
1 year ago
Manos Pitsidianakis 8f14a2373e
melib/imap: put imap-codec logic under the imap_backend feature 1 year ago
Damian Poddebniak 330887c4f5
refactor: Introduce imap-codec. 1 year ago
Damian Poddebniak 6c6d9f4b4e
chore: Improve ordering of `flag_impl!`s. 1 year ago
Damian Poddebniak 579372b4a7
chore: Improve readability of `Envelope`.
* Sorted according to RFC.
* Separated IMAP4rev1 and other values.
1 year ago
Manos Pitsidianakis b6c93e49f2
docs/meli.conf.5: add use_tls option in IMAP connection settings 1 year ago
Manos Pitsidianakis d33f9d54c7
terminal/keys: remove unreachable!() in Key::serialize 1 year ago