mirror of
https://github.com/soywod/himalaya.git
synced 2024-09-29 04:31:11 +00:00
fix watch command (#271)
This commit is contained in:
parent
1dbd7a4893
commit
c1841a2932
|
@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Nix run issue [#272]
|
- Nix run issue [#272]
|
||||||
- Range not displayed when fetch fails [#276]
|
- Range not displayed when fetch fails [#276]
|
||||||
- Blank lines and spaces in `text/plain` parts [#280]
|
- Blank lines and spaces in `text/plain` parts [#280]
|
||||||
|
- Watch command [#271]
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
@ -373,4 +374,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
[#272]: https://github.com/soywod/himalaya/issues/272
|
[#272]: https://github.com/soywod/himalaya/issues/272
|
||||||
[#273]: https://github.com/soywod/himalaya/issues/273
|
[#273]: https://github.com/soywod/himalaya/issues/273
|
||||||
[#276]: https://github.com/soywod/himalaya/issues/276
|
[#276]: https://github.com/soywod/himalaya/issues/276
|
||||||
|
[#271]: https://github.com/soywod/himalaya/issues/271
|
||||||
[#280]: https://github.com/soywod/himalaya/issues/280
|
[#280]: https://github.com/soywod/himalaya/issues/280
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use anyhow::{Context, Error, Result};
|
use anyhow::{Context, Error, Result};
|
||||||
use log::{debug, trace};
|
use log::{debug, trace};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::{collections::HashMap, convert::TryFrom, env, fs, path::PathBuf, thread};
|
use std::{collections::HashMap, convert::TryFrom, env, fs, path::PathBuf};
|
||||||
use toml;
|
use toml;
|
||||||
|
|
||||||
use crate::output::run_cmd;
|
use crate::output::run_cmd;
|
||||||
|
@ -135,28 +135,8 @@ impl Config {
|
||||||
.map(|cmd| format!(r#"{} {:?} {:?}"#, cmd, subject, sender))
|
.map(|cmd| format!(r#"{} {:?} {:?}"#, cmd, subject, sender))
|
||||||
.unwrap_or(default_cmd);
|
.unwrap_or(default_cmd);
|
||||||
|
|
||||||
|
debug!("run command: {}", cmd);
|
||||||
run_cmd(&cmd).context("cannot run notify cmd")?;
|
run_cmd(&cmd).context("cannot run notify cmd")?;
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn _exec_watch_cmds(&self, account: &ConfigAccountEntry) -> Result<()> {
|
|
||||||
let cmds = account
|
|
||||||
.watch_cmds
|
|
||||||
.as_ref()
|
|
||||||
.or_else(|| self.watch_cmds.as_ref())
|
|
||||||
.map(|cmds| cmds.to_owned())
|
|
||||||
.unwrap_or_default();
|
|
||||||
|
|
||||||
thread::spawn(move || {
|
|
||||||
debug!("batch execution of {} cmd(s)", cmds.len());
|
|
||||||
cmds.iter().for_each(|cmd| {
|
|
||||||
debug!("running command {:?}…", cmd);
|
|
||||||
let res = run_cmd(cmd);
|
|
||||||
debug!("{:?}", res);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
|
||||||
use crate::{config::Config, domain::imap::ImapServiceInterface};
|
use crate::{
|
||||||
|
config::{Account, Config},
|
||||||
|
domain::imap::ImapServiceInterface,
|
||||||
|
};
|
||||||
|
|
||||||
/// Notify handler.
|
/// Notify handler.
|
||||||
pub fn notify<'a, ImapService: ImapServiceInterface<'a>>(
|
pub fn notify<'a, ImapService: ImapServiceInterface<'a>>(
|
||||||
|
@ -18,7 +21,8 @@ pub fn notify<'a, ImapService: ImapServiceInterface<'a>>(
|
||||||
/// Watch handler.
|
/// Watch handler.
|
||||||
pub fn watch<'a, ImapService: ImapServiceInterface<'a>>(
|
pub fn watch<'a, ImapService: ImapServiceInterface<'a>>(
|
||||||
keepalive: u64,
|
keepalive: u64,
|
||||||
|
account: &Account,
|
||||||
imap: &mut ImapService,
|
imap: &mut ImapService,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
imap.watch(keepalive)
|
imap.watch(account, keepalive)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,18 +9,20 @@ use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
convert::{TryFrom, TryInto},
|
convert::{TryFrom, TryInto},
|
||||||
net::TcpStream,
|
net::TcpStream,
|
||||||
|
thread,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
config::{Account, Config},
|
config::{Account, Config},
|
||||||
domain::{Envelope, Envelopes, Flags, Mbox, Mboxes, Msg, RawEnvelopes, RawMboxes},
|
domain::{Envelope, Envelopes, Flags, Mbox, Mboxes, Msg, RawEnvelopes, RawMboxes},
|
||||||
|
output::run_cmd,
|
||||||
};
|
};
|
||||||
|
|
||||||
type ImapSession = imap::Session<TlsStream<TcpStream>>;
|
type ImapSession = imap::Session<TlsStream<TcpStream>>;
|
||||||
|
|
||||||
pub trait ImapServiceInterface<'a> {
|
pub trait ImapServiceInterface<'a> {
|
||||||
fn notify(&mut self, config: &Config, keepalive: u64) -> Result<()>;
|
fn notify(&mut self, config: &Config, keepalive: u64) -> Result<()>;
|
||||||
fn watch(&mut self, keepalive: u64) -> Result<()>;
|
fn watch(&mut self, account: &Account, keepalive: u64) -> Result<()>;
|
||||||
fn fetch_mboxes(&'a mut self) -> Result<Mboxes>;
|
fn fetch_mboxes(&'a mut self) -> Result<Mboxes>;
|
||||||
fn fetch_envelopes(&mut self, page_size: &usize, page: &usize) -> Result<Envelopes>;
|
fn fetch_envelopes(&mut self, page_size: &usize, page: &usize) -> Result<Envelopes>;
|
||||||
fn fetch_envelopes_with(
|
fn fetch_envelopes_with(
|
||||||
|
@ -247,12 +249,14 @@ impl<'a> ImapServiceInterface<'a> for ImapService<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn notify(&mut self, config: &Config, keepalive: u64) -> Result<()> {
|
fn notify(&mut self, config: &Config, keepalive: u64) -> Result<()> {
|
||||||
|
debug!("notify");
|
||||||
|
|
||||||
let mbox = self.mbox.to_owned();
|
let mbox = self.mbox.to_owned();
|
||||||
|
|
||||||
debug!("examine mailbox: {}", mbox.name);
|
debug!("examine mailbox {:?}", mbox);
|
||||||
self.sess()?
|
self.sess()?
|
||||||
.examine(&mbox.name)
|
.examine(&mbox.name)
|
||||||
.context(format!("cannot examine mailbox `{}`", &self.mbox.name))?;
|
.context(format!("cannot examine mailbox {}", self.mbox.name))?;
|
||||||
|
|
||||||
debug!("init messages hashset");
|
debug!("init messages hashset");
|
||||||
let mut msgs_set: HashSet<u32> = self
|
let mut msgs_set: HashSet<u32> = self
|
||||||
|
@ -317,7 +321,7 @@ impl<'a> ImapServiceInterface<'a> for ImapService<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn watch(&mut self, keepalive: u64) -> Result<()> {
|
fn watch(&mut self, account: &Account, keepalive: u64) -> Result<()> {
|
||||||
debug!("examine mailbox: {}", &self.mbox.name);
|
debug!("examine mailbox: {}", &self.mbox.name);
|
||||||
let mbox = self.mbox.to_owned();
|
let mbox = self.mbox.to_owned();
|
||||||
|
|
||||||
|
@ -338,8 +342,17 @@ impl<'a> ImapServiceInterface<'a> for ImapService<'a> {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.context("cannot start the idle mode")?;
|
.context("cannot start the idle mode")?;
|
||||||
// FIXME
|
|
||||||
// ctx.config.exec_watch_cmds(&ctx.account)?;
|
let cmds = account.watch_cmds.clone();
|
||||||
|
thread::spawn(move || {
|
||||||
|
debug!("batch execution of {} cmd(s)", cmds.len());
|
||||||
|
cmds.iter().for_each(|cmd| {
|
||||||
|
debug!("running command {:?}…", cmd);
|
||||||
|
let res = run_cmd(cmd);
|
||||||
|
debug!("{:?}", res);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
debug!("end loop");
|
debug!("end loop");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ mod tests {
|
||||||
use termcolor::ColorSpec;
|
use termcolor::ColorSpec;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
config::Config,
|
config::{Account, Config},
|
||||||
domain::{AttrRemote, Attrs, Envelopes, Flags, Mbox, Mboxes, Msg},
|
domain::{AttrRemote, Attrs, Envelopes, Flags, Mbox, Mboxes, Msg},
|
||||||
output::{Print, PrintTable, WriteColor},
|
output::{Print, PrintTable, WriteColor},
|
||||||
};
|
};
|
||||||
|
@ -117,7 +117,7 @@ mod tests {
|
||||||
fn notify(&mut self, _: &Config, _: u64) -> Result<()> {
|
fn notify(&mut self, _: &Config, _: u64) -> Result<()> {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
fn watch(&mut self, _: u64) -> Result<()> {
|
fn watch(&mut self, _: &Account, _: u64) -> Result<()> {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
fn fetch_envelopes(&mut self, _: &usize, _: &usize) -> Result<Envelopes> {
|
fn fetch_envelopes(&mut self, _: &usize, _: &usize) -> Result<Envelopes> {
|
||||||
|
|
|
@ -80,7 +80,7 @@ fn main() -> Result<()> {
|
||||||
return imap_handler::notify(keepalive, &config, &mut imap);
|
return imap_handler::notify(keepalive, &config, &mut imap);
|
||||||
}
|
}
|
||||||
Some(imap_arg::Command::Watch(keepalive)) => {
|
Some(imap_arg::Command::Watch(keepalive)) => {
|
||||||
return imap_handler::watch(keepalive, &mut imap);
|
return imap_handler::watch(keepalive, &account, &mut imap);
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue