1
0
Fork 0
mirror of https://codeberg.org/icewind/haze.git synced 2026-06-03 09:04:12 +02:00

add follow option to log command

This commit is contained in:
Robin Appelman 2022-02-18 16:30:49 +01:00
commit 1f438e8e4f
3 changed files with 37 additions and 14 deletions

View file

@ -36,6 +36,7 @@ pub enum HazeArgs {
Clean, Clean,
Logs { Logs {
filter: Option<String>, filter: Option<String>,
follow: bool,
service: Option<LogService>, service: Option<LogService>,
count: Option<usize>, count: Option<usize>,
}, },
@ -168,15 +169,13 @@ impl HazeArgs {
HazeCommand::Clean => Ok(HazeArgs::Clean), HazeCommand::Clean => Ok(HazeArgs::Clean),
HazeCommand::Logs => { HazeCommand::Logs => {
let mut args = args.peekable(); let mut args = args.peekable();
let follow = args.next_if(|arg| arg.as_ref() == "-f").is_some();
let service = args let service = args
.peek() .next_if(|arg| LogService::from_type(arg.as_ref()).is_some())
.map(|s| s.as_ref()) .and_then(|arg| LogService::from_type(arg.as_ref()));
.and_then(LogService::from_type);
if service.is_some() {
let _ = args.next();
}
Ok(HazeArgs::Logs { Ok(HazeArgs::Logs {
filter, filter,
follow,
service, service,
count: args count: args
.next() .next()
@ -312,4 +311,22 @@ fn test_arg_parse() {
args: vec!["foo".into(), "bar".into()] args: vec!["foo".into(), "bar".into()]
} }
); );
assert_eq!(
HazeArgs::parse(vec!["haze", "logs", "-f", "smb"].into_iter()).unwrap(),
HazeArgs::Logs {
filter: None,
follow: true,
service: Some(LogService::from_type("smb").unwrap()),
count: None,
}
);
assert_eq!(
HazeArgs::parse(vec!["haze", "asdasd", "logs", "smb", "123"].into_iter()).unwrap(),
HazeArgs::Logs {
filter: Some("asdasd".to_string()),
follow: false,
service: Some(LogService::from_type("smb").unwrap()),
count: Some(123),
}
);
} }

View file

@ -145,21 +145,28 @@ pub async fn exec<S1: AsRef<str>, S2: Into<String>>(
.into()) .into())
} }
pub async fn container_logs(docker: &Docker, container: &str, count: usize) -> Result<Vec<String>> { pub async fn container_logs(
let mut logs = Vec::new(); docker: &Docker,
mut std_out: impl Write,
container: &str,
count: usize,
follow: bool,
) -> Result<()> {
let mut stream = docker.logs::<String>( let mut stream = docker.logs::<String>(
container, container,
Some(LogsOptions { Some(LogsOptions {
stdout: true, stdout: true,
stderr: true, stderr: true,
follow,
tail: format!("{}", count), tail: format!("{}", count),
..Default::default() ..Default::default()
}), }),
); );
while let Some(line) = stream.next().await { while let Some(line) = stream.next().await {
logs.push(line.into_diagnostic()?.to_string()); let line = line.into_diagnostic()?.to_string();
write!(&mut std_out, "{}", line).into_diagnostic()?;
} }
Ok(logs) Ok(())
} }
pub struct ExitCode(i64); pub struct ExitCode(i64);

View file

@ -8,6 +8,7 @@ use crate::service::Service;
use crate::service::ServiceTrait; use crate::service::ServiceTrait;
use bollard::Docker; use bollard::Docker;
use miette::{IntoDiagnostic, Result, WrapErr}; use miette::{IntoDiagnostic, Result, WrapErr};
use std::io::stdout;
mod args; mod args;
mod cloud; mod cloud;
@ -154,6 +155,7 @@ async fn main() -> Result<()> {
} }
HazeArgs::Logs { HazeArgs::Logs {
filter, filter,
follow,
count, count,
service, service,
} => { } => {
@ -163,10 +165,7 @@ async fn main() -> Result<()> {
} else { } else {
cloud.id cloud.id
}; };
let logs = container_logs(&docker, &container, count.unwrap_or(20)).await?; container_logs(&docker, stdout(), &container, count.unwrap_or(20), follow).await?;
for log in logs {
print!("{}", log);
}
} }
HazeArgs::Exec { HazeArgs::Exec {
filter, filter,