82 lines
2.3 KiB
Rust
82 lines
2.3 KiB
Rust
use blue_build_process_management::drivers::{BuildDriver, Driver, DriverArgs, opts::PruneOpts};
|
|
use bon::Builder;
|
|
use clap::Args;
|
|
use colored::Colorize;
|
|
use miette::bail;
|
|
|
|
use super::BlueBuildCommand;
|
|
|
|
#[derive(Debug, Args, Builder)]
|
|
pub struct PruneCommand {
|
|
/// Remove all unused images
|
|
#[builder(default)]
|
|
#[arg(short, long)]
|
|
all: bool,
|
|
|
|
/// Do not prompt for confirmation
|
|
#[builder(default)]
|
|
#[arg(short, long)]
|
|
force: bool,
|
|
|
|
/// Prune volumes
|
|
#[builder(default)]
|
|
#[arg(long)]
|
|
volumes: bool,
|
|
|
|
#[clap(flatten)]
|
|
#[builder(default)]
|
|
drivers: DriverArgs,
|
|
}
|
|
|
|
impl BlueBuildCommand for PruneCommand {
|
|
fn try_run(&mut self) -> miette::Result<()> {
|
|
Driver::init(self.drivers);
|
|
|
|
if !self.force {
|
|
eprintln!(
|
|
"{} This will remove:{default}{images}{build_cache}{volumes}",
|
|
"WARNING!".bright_yellow(),
|
|
default = concat!(
|
|
"\n - all stopped containers",
|
|
"\n - all networks not used by at least one container",
|
|
),
|
|
images = if self.all {
|
|
"\n - all images without at least one container associated to them"
|
|
} else {
|
|
"\n - all dangling images"
|
|
},
|
|
build_cache = if self.all {
|
|
"\n - all build cache"
|
|
} else {
|
|
"\n - unused build cache"
|
|
},
|
|
volumes = if self.volumes {
|
|
"\n - all anonymous volumes not used by at least one container"
|
|
} else {
|
|
""
|
|
},
|
|
);
|
|
|
|
match requestty::prompt_one(
|
|
requestty::Question::confirm("anonymous")
|
|
.message("Are you sure you want to continue?")
|
|
.default(false)
|
|
.build(),
|
|
) {
|
|
Err(e) => bail!("Canceled {e:?}"),
|
|
Ok(answer) => {
|
|
if answer.as_bool().is_some_and(|a| !a) {
|
|
return Ok(());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Driver::prune(
|
|
&PruneOpts::builder()
|
|
.all(self.all)
|
|
.volumes(self.volumes)
|
|
.build(),
|
|
)
|
|
}
|
|
}
|