use std::process::{Command, Stdio};
use anyhow::{Context, Result, bail};
pub fn system_df() -> Result<String> {
run_docker(&["system", "df", "-v"])
}
pub fn prune_build_cache(older_than: Option<&str>) -> Result<String> {
let mut arguments = vec!["builder", "prune", "-af"];
let filter;
if let Some(age) = older_than {
filter = format!("until={age}");
arguments.extend(["--filter", &filter]);
}
run_docker(&arguments)
}
pub fn prune_system(older_than: Option<&str>) -> Result<String> {
let mut arguments = vec!["system", "prune", "-af"];
let filter;
if let Some(age) = older_than {
filter = format!("until={age}");
arguments.extend(["--filter", &filter]);
}
run_docker(&arguments)
}
fn run_docker(arguments: &[&str]) -> Result<String> {
let output = Command::new("docker")
.args(arguments)
.stdin(Stdio::null())
.output()
.context("failed to run docker")?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
bail!("docker failed: {}", stderr.trim());
}
Ok(String::from_utf8_lossy(&output.stdout).into_owned())
}