mirror of
https://github.com/soywod/himalaya.git
synced 2024-07-08 10:35:13 +00:00
fix sort command not found (#308)
This commit is contained in:
parent
e4aa569458
commit
34ab0f4fa5
|
@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
- Build failure due to `imap` version [#303]
|
- Build failure due to `imap` version [#303]
|
||||||
- No tilde expansion in `maildir-dir` [#305]
|
- No tilde expansion in `maildir-dir` [#305]
|
||||||
|
- Unknown command SORT [#308]
|
||||||
|
|
||||||
## [0.5.6] - 2022-02-22
|
## [0.5.6] - 2022-02-22
|
||||||
|
|
||||||
|
@ -440,3 +441,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
[#289]: https://github.com/soywod/himalaya/issues/289
|
[#289]: https://github.com/soywod/himalaya/issues/289
|
||||||
[#303]: https://github.com/soywod/himalaya/issues/303
|
[#303]: https://github.com/soywod/himalaya/issues/303
|
||||||
[#305]: https://github.com/soywod/himalaya/issues/305
|
[#305]: https://github.com/soywod/himalaya/issues/305
|
||||||
|
[#308]: https://github.com/soywod/himalaya/issues/308
|
||||||
|
|
|
@ -21,8 +21,14 @@ pub trait Backend<'a> {
|
||||||
fn get_envelopes(
|
fn get_envelopes(
|
||||||
&mut self,
|
&mut self,
|
||||||
mbox: &str,
|
mbox: &str,
|
||||||
|
page_size: usize,
|
||||||
|
page: usize,
|
||||||
|
) -> Result<Box<dyn Envelopes>>;
|
||||||
|
fn find_envelopes(
|
||||||
|
&mut self,
|
||||||
|
mbox: &str,
|
||||||
|
query: &str,
|
||||||
sort: &str,
|
sort: &str,
|
||||||
filter: &str,
|
|
||||||
page_size: usize,
|
page_size: usize,
|
||||||
page: usize,
|
page: usize,
|
||||||
) -> Result<Box<dyn Envelopes>>;
|
) -> Result<Box<dyn Envelopes>>;
|
||||||
|
|
|
@ -229,8 +229,42 @@ impl<'a> Backend<'a> for ImapBackend<'a> {
|
||||||
fn get_envelopes(
|
fn get_envelopes(
|
||||||
&mut self,
|
&mut self,
|
||||||
mbox: &str,
|
mbox: &str,
|
||||||
|
page_size: usize,
|
||||||
|
page: usize,
|
||||||
|
) -> Result<Box<dyn Envelopes>> {
|
||||||
|
let last_seq = self
|
||||||
|
.sess()?
|
||||||
|
.select(mbox)
|
||||||
|
.context(format!("cannot select mailbox {:?}", mbox))?
|
||||||
|
.exists as usize;
|
||||||
|
debug!("last sequence number: {:?}", last_seq);
|
||||||
|
if last_seq == 0 {
|
||||||
|
return Ok(Box::new(ImapEnvelopes::default()));
|
||||||
|
}
|
||||||
|
|
||||||
|
let range = if page_size > 0 {
|
||||||
|
let cursor = page * page_size;
|
||||||
|
let begin = 1.max(last_seq - cursor);
|
||||||
|
let end = begin - begin.min(page_size) + 1;
|
||||||
|
format!("{}:{}", end, begin)
|
||||||
|
} else {
|
||||||
|
String::from("1:*")
|
||||||
|
};
|
||||||
|
debug!("range: {:?}", range);
|
||||||
|
|
||||||
|
let fetches = self
|
||||||
|
.sess()?
|
||||||
|
.fetch(&range, "(ENVELOPE FLAGS INTERNALDATE)")
|
||||||
|
.context(format!("cannot fetch messages within range {:?}", range))?;
|
||||||
|
let envelopes: ImapEnvelopes = fetches.try_into()?;
|
||||||
|
Ok(Box::new(envelopes))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_envelopes(
|
||||||
|
&mut self,
|
||||||
|
mbox: &str,
|
||||||
|
query: &str,
|
||||||
sort: &str,
|
sort: &str,
|
||||||
filter: &str,
|
|
||||||
page_size: usize,
|
page_size: usize,
|
||||||
page: usize,
|
page: usize,
|
||||||
) -> Result<Box<dyn Envelopes>> {
|
) -> Result<Box<dyn Envelopes>> {
|
||||||
|
@ -239,24 +273,36 @@ impl<'a> Backend<'a> for ImapBackend<'a> {
|
||||||
.select(mbox)
|
.select(mbox)
|
||||||
.context(format!("cannot select mailbox {:?}", mbox))?
|
.context(format!("cannot select mailbox {:?}", mbox))?
|
||||||
.exists;
|
.exists;
|
||||||
|
debug!("last sequence number: {:?}", last_seq);
|
||||||
if last_seq == 0 {
|
if last_seq == 0 {
|
||||||
return Ok(Box::new(ImapEnvelopes::default()));
|
return Ok(Box::new(ImapEnvelopes::default()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let sort: SortCriteria = sort.try_into()?;
|
|
||||||
let charset = imap::extensions::sort::SortCharset::Utf8;
|
|
||||||
let begin = page * page_size;
|
let begin = page * page_size;
|
||||||
let end = begin + (page_size - 1);
|
let end = begin + (page_size - 1);
|
||||||
let seqs: Vec<String> = self
|
let seqs: Vec<String> = if sort.is_empty() {
|
||||||
.sess()?
|
self.sess()?
|
||||||
.sort(&sort, charset, filter)
|
.search(query)
|
||||||
.context(format!(
|
.context(format!(
|
||||||
"cannot search in {:?} with query {:?}",
|
"cannot find envelopes in {:?} with query {:?}",
|
||||||
mbox, filter
|
mbox, query
|
||||||
))?
|
))?
|
||||||
.iter()
|
.iter()
|
||||||
.map(|seq| seq.to_string())
|
.map(|seq| seq.to_string())
|
||||||
.collect();
|
.collect()
|
||||||
|
} else {
|
||||||
|
let sort: SortCriteria = sort.try_into()?;
|
||||||
|
let charset = imap::extensions::sort::SortCharset::Utf8;
|
||||||
|
self.sess()?
|
||||||
|
.sort(&sort, charset, query)
|
||||||
|
.context(format!(
|
||||||
|
"cannot find envelopes in {:?} with query {:?}",
|
||||||
|
mbox, query
|
||||||
|
))?
|
||||||
|
.iter()
|
||||||
|
.map(|seq| seq.to_string())
|
||||||
|
.collect()
|
||||||
|
};
|
||||||
if seqs.is_empty() {
|
if seqs.is_empty() {
|
||||||
return Ok(Box::new(ImapEnvelopes::default()));
|
return Ok(Box::new(ImapEnvelopes::default()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,17 +69,12 @@ impl<'a> Backend<'a> for MaildirBackend<'a> {
|
||||||
fn get_envelopes(
|
fn get_envelopes(
|
||||||
&mut self,
|
&mut self,
|
||||||
mdir: &str,
|
mdir: &str,
|
||||||
_sort: &str,
|
|
||||||
filter: &str,
|
|
||||||
page_size: usize,
|
page_size: usize,
|
||||||
page: usize,
|
page: usize,
|
||||||
) -> Result<Box<dyn Envelopes>> {
|
) -> Result<Box<dyn Envelopes>> {
|
||||||
let mdir = self.get_mdir_from_name(mdir)?;
|
let mdir = self.get_mdir_from_name(mdir)?;
|
||||||
let mail_entries = match filter {
|
let mut envelopes: MaildirEnvelopes = mdir
|
||||||
"new" => mdir.list_new(),
|
.list_cur()
|
||||||
_ => mdir.list_cur(),
|
|
||||||
};
|
|
||||||
let mut envelopes: MaildirEnvelopes = mail_entries
|
|
||||||
.try_into()
|
.try_into()
|
||||||
.context("cannot parse maildir envelopes from {:?}")?;
|
.context("cannot parse maildir envelopes from {:?}")?;
|
||||||
envelopes.sort_by(|a, b| b.date.partial_cmp(&a.date).unwrap());
|
envelopes.sort_by(|a, b| b.date.partial_cmp(&a.date).unwrap());
|
||||||
|
@ -96,6 +91,19 @@ impl<'a> Backend<'a> for MaildirBackend<'a> {
|
||||||
Ok(Box::new(envelopes))
|
Ok(Box::new(envelopes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn find_envelopes(
|
||||||
|
&mut self,
|
||||||
|
_mdir: &str,
|
||||||
|
_query: &str,
|
||||||
|
_sort: &str,
|
||||||
|
_page_size: usize,
|
||||||
|
_page: usize,
|
||||||
|
) -> Result<Box<dyn Envelopes>> {
|
||||||
|
Err(anyhow!(
|
||||||
|
"cannot find maildir envelopes: feature not implemented"
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
fn add_msg(&mut self, mdir: &str, msg: &[u8], flags: &str) -> Result<Box<dyn ToString>> {
|
fn add_msg(&mut self, mdir: &str, msg: &[u8], flags: &str) -> Result<Box<dyn ToString>> {
|
||||||
let mdir = self.get_mdir_from_name(mdir)?;
|
let mdir = self.get_mdir_from_name(mdir)?;
|
||||||
let flags: MaildirFlags = flags.try_into()?;
|
let flags: MaildirFlags = flags.try_into()?;
|
||||||
|
|
|
@ -51,18 +51,30 @@ impl<'a> Backend<'a> for NotmuchBackend<'a> {
|
||||||
fn get_envelopes(
|
fn get_envelopes(
|
||||||
&mut self,
|
&mut self,
|
||||||
mdir: &str,
|
mdir: &str,
|
||||||
_sort: &str,
|
|
||||||
filter: &str,
|
|
||||||
page_size: usize,
|
page_size: usize,
|
||||||
page: usize,
|
page: usize,
|
||||||
) -> Result<Box<dyn Envelopes>> {
|
) -> Result<Box<dyn Envelopes>> {
|
||||||
let query = self
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_envelopes(
|
||||||
|
&mut self,
|
||||||
|
_mdir: &str,
|
||||||
|
query: &str,
|
||||||
|
_sort: &str,
|
||||||
|
_page_size: usize,
|
||||||
|
_page: usize,
|
||||||
|
) -> Result<Box<dyn Envelopes>> {
|
||||||
|
let query_builder = self
|
||||||
.db
|
.db
|
||||||
.create_query(filter)
|
.create_query(query)
|
||||||
.context("cannot create query")?;
|
.context("cannot create notmuch query")?;
|
||||||
let msgs: NotmuchEnvelopes = query
|
let msgs: NotmuchEnvelopes = query_builder
|
||||||
.search_messages()
|
.search_messages()
|
||||||
.context("cannot get messages")?
|
.context(format!(
|
||||||
|
"cannot find notmuch envelopes with query {:?}",
|
||||||
|
query
|
||||||
|
))?
|
||||||
.try_into()?;
|
.try_into()?;
|
||||||
Ok(Box::new(msgs))
|
Ok(Box::new(msgs))
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ pub fn list<'a, P: PrinterService, B: Backend<'a> + ?Sized>(
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let page_size = page_size.unwrap_or(config.default_page_size);
|
let page_size = page_size.unwrap_or(config.default_page_size);
|
||||||
debug!("page size: {}", page_size);
|
debug!("page size: {}", page_size);
|
||||||
let msgs = imap.get_envelopes(mbox, "arrival:desc", "all", page_size, page)?;
|
let msgs = imap.get_envelopes(mbox, page_size, page)?;
|
||||||
trace!("envelopes: {:?}", msgs);
|
trace!("envelopes: {:?}", msgs);
|
||||||
printer.print_table(msgs, PrintTableOpts { max_width })
|
printer.print_table(msgs, PrintTableOpts { max_width })
|
||||||
}
|
}
|
||||||
|
@ -273,7 +273,7 @@ pub fn search<'a, P: PrinterService, B: Backend<'a> + ?Sized>(
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let page_size = page_size.unwrap_or(config.default_page_size);
|
let page_size = page_size.unwrap_or(config.default_page_size);
|
||||||
debug!("page size: {}", page_size);
|
debug!("page size: {}", page_size);
|
||||||
let msgs = backend.get_envelopes(mbox, "arrival:desc", &query, page_size, page)?;
|
let msgs = backend.find_envelopes(mbox, &query, "", page_size, page)?;
|
||||||
trace!("messages: {:#?}", msgs);
|
trace!("messages: {:#?}", msgs);
|
||||||
printer.print_table(msgs, PrintTableOpts { max_width })
|
printer.print_table(msgs, PrintTableOpts { max_width })
|
||||||
}
|
}
|
||||||
|
@ -292,7 +292,7 @@ pub fn sort<'a, P: PrinterService, B: Backend<'a> + ?Sized>(
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let page_size = page_size.unwrap_or(config.default_page_size);
|
let page_size = page_size.unwrap_or(config.default_page_size);
|
||||||
debug!("page size: {}", page_size);
|
debug!("page size: {}", page_size);
|
||||||
let msgs = backend.get_envelopes(mbox, &sort, &query, page_size, page)?;
|
let msgs = backend.find_envelopes(mbox, &query, &sort, page_size, page)?;
|
||||||
trace!("envelopes: {:#?}", msgs);
|
trace!("envelopes: {:#?}", msgs);
|
||||||
printer.print_table(msgs, PrintTableOpts { max_width })
|
printer.print_table(msgs, PrintTableOpts { max_width })
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue