feat!: respect COMPOSE_FILE env and remove docker command

Read COMPOSE_FILE from env and use it if it is set. Default is still
docker/local/docker-compose.yaml.

BREAKING CHANGE: Removed docker subcommand. Added deprecation notice to
compose subcommand.
This commit is contained in:
2024-10-25 09:37:04 +02:00
parent 73a0b87c31
commit 3077420db2
7 changed files with 143 additions and 167 deletions

View File

@@ -1,4 +1,4 @@
use super::{Django, Docker, DockerCompose, Postgres};
use super::{Django, DockerCompose, Postgres};
use clap::{Parser, Subcommand};
/// A program for interacting with various dockerized applications.
@@ -11,12 +11,6 @@ pub struct Ahab {
#[derive(Debug, Subcommand)]
pub enum Commands {
/// Docker related subcommands
Docker {
#[command(subcommand)]
command: Docker,
},
/// Docker compose related subcommands
Compose {
#[command(subcommand)]

View File

@@ -1,7 +0,0 @@
use clap::Parser;
#[derive(Parser, Debug)]
pub enum Docker {
/// Stop all containers via `docker stop $(docker ps -q)`
StopAll,
}

View File

@@ -1,11 +1,9 @@
mod ahab;
mod django;
mod docker;
mod docker_compose;
mod postgres;
pub use ahab::{Ahab, Commands};
pub use django::Django;
pub use docker::Docker;
pub use docker_compose::DockerCompose;
pub use postgres::Postgres;

View File

@@ -1,6 +1,7 @@
use anyhow::{anyhow, Context, Result};
use std::{
collections::VecDeque,
env,
ffi::OsStr,
fmt::Display,
fs::{File, OpenOptions},
@@ -27,10 +28,15 @@ impl From<&String> for Args {
impl From<&[String]> for Args {
fn from(value: &[String]) -> Self {
Self(Vec::from_iter(value.iter().map(|x| x.to_string())))
Self(value.to_vec())
}
}
fn get_compose_file() -> Result<String> {
let cf = env::var("COMPOSE_FILE")?;
Ok(cf)
}
#[derive(Default)]
pub struct CommandBuilder {
args: Vec<String>,
@@ -52,7 +58,9 @@ impl CommandBuilder {
}
pub fn docker_compose() -> Self {
Self::default().args("docker compose -f docker/local/docker-compose.yaml")
let cf =
get_compose_file().unwrap_or_else(|_| "docker/local/docker-compose.yaml".to_string());
Self::default().args("docker compose -f").args(&cf)
}
pub fn args<T>(mut self, args: T) -> Self
@@ -64,7 +72,7 @@ impl CommandBuilder {
}
pub fn build(self) -> Result<Command> {
debug_eprintln!("-----\n{self}\n-----");
debug_eprintln!("running `{self}`");
let (first, rest) = self.args.split_first().context("empty args")?;
let mut command = Command::new(first);

View File

@@ -13,21 +13,21 @@ fn main() -> Result<()> {
let args = cli::Ahab::parse();
match args.command {
cli::Commands::Docker { command } => match command {
cli::Docker::StopAll => scripts::docker::stop_all(),
},
cli::Commands::Compose { command } => match command {
cli::DockerCompose::Bash => scripts::docker_compose::bash(),
cli::DockerCompose::Build => scripts::docker_compose::build(),
cli::DockerCompose::Down => scripts::docker_compose::down(),
cli::DockerCompose::Exec { rest } => scripts::docker_compose::exec(&rest),
cli::DockerCompose::Ps => scripts::docker_compose::ps(),
cli::DockerCompose::Rebuild => scripts::docker_compose::rebuild(),
cli::DockerCompose::Restart => scripts::docker_compose::restart(),
cli::DockerCompose::Start => scripts::docker_compose::start(None),
cli::DockerCompose::Stop => scripts::docker_compose::stop(),
cli::DockerCompose::Up => scripts::docker_compose::up(),
},
cli::Commands::Compose { command } => {
eprintln!("DEPRECATION NOTICE: this is deprecated in favor of docker compose COMPOSE_FILE env");
match command {
cli::DockerCompose::Bash => scripts::docker_compose::bash(),
cli::DockerCompose::Build => scripts::docker_compose::build(),
cli::DockerCompose::Down => scripts::docker_compose::down(),
cli::DockerCompose::Exec { rest } => scripts::docker_compose::exec(&rest),
cli::DockerCompose::Ps => scripts::docker_compose::ps(),
cli::DockerCompose::Rebuild => scripts::docker_compose::rebuild(),
cli::DockerCompose::Restart => scripts::docker_compose::restart(),
cli::DockerCompose::Start => scripts::docker_compose::start(None),
cli::DockerCompose::Stop => scripts::docker_compose::stop(),
cli::DockerCompose::Up => scripts::docker_compose::up(),
}
}
cli::Commands::Django { command } => match command {
cli::Django::MakeCommand { app, name } => scripts::django::make_command(&app, &name),
cli::Django::Makemigrations => scripts::django::makemigrations(),