From 045c87fbcd1cb8efe8bd3a41f55790b326ed6ee4 Mon Sep 17 00:00:00 2001 From: c-14 <git@c-14.de> Date: Sun, 25 Sep 2022 12:15:33 +0200 Subject: [PATCH] Allow stateless commands to be run without config/database (#544) * Allow stateless commands to be run without config/database Fixes an issue where gen-completions fails trying to create a config directory in restrained build environments/distribution. * move non-db commands up to core subcommands * re-add lost lines * re-add lost lines Co-authored-by: Conrad Ludgate <conrad.ludgate@truelayer.com> --- src/command/client.rs | 50 +------------------------------- src/command/{client => }/init.rs | 6 ++-- src/command/mod.rs | 50 +++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 53 deletions(-) rename src/command/{client => }/init.rs (73%) diff --git a/src/command/client.rs b/src/command/client.rs index ae49b85..94148c0 100644 --- a/src/command/client.rs +++ b/src/command/client.rs @@ -1,18 +1,15 @@ use std::path::PathBuf; -use clap::{CommandFactory, Subcommand}; -use clap_complete::{generate, generate_to, Shell}; +use clap::Subcommand; use eyre::{Result, WrapErr}; use atuin_client::{database::Sqlite, settings::Settings}; -use atuin_common::utils::uuid_v4; #[cfg(feature = "sync")] mod sync; mod history; mod import; -mod init; mod search; mod stats; @@ -30,27 +27,9 @@ pub enum Cmd { /// Calculate statistics for your history Stats(stats::Cmd), - /// Output shell setup - #[clap(subcommand)] - Init(init::Cmd), - - /// Generate a UUID - Uuid, - /// Interactive history search Search(search::Cmd), - /// Generate shell completions - GenCompletions { - /// Set the shell for generating completions - #[clap(long, short)] - shell: Shell, - - /// Set the output directory - #[clap(long, short)] - out_dir: Option<String>, - }, - #[cfg(feature = "sync")] #[clap(flatten)] Sync(sync::Cmd), @@ -70,34 +49,7 @@ impl Cmd { Self::History(history) => history.run(&settings, &mut db).await, Self::Import(import) => import.run(&mut db).await, Self::Stats(stats) => stats.run(&mut db, &settings).await, - Self::Init(init) => { - init.run(); - Ok(()) - } Self::Search(search) => search.run(&mut db, &settings).await, - Self::Uuid => { - println!("{}", uuid_v4()); - Ok(()) - } - Self::GenCompletions { shell, out_dir } => { - let mut cli = crate::Atuin::command(); - - match out_dir { - Some(out_dir) => { - generate_to(shell, &mut cli, env!("CARGO_PKG_NAME"), &out_dir)?; - } - None => { - generate( - shell, - &mut cli, - env!("CARGO_PKG_NAME"), - &mut std::io::stdout(), - ); - } - } - - Ok(()) - } #[cfg(feature = "sync")] Self::Sync(sync) => sync.run(settings, &mut db).await, } diff --git a/src/command/client/init.rs b/src/command/init.rs similarity index 73% rename from src/command/client/init.rs rename to src/command/init.rs index a2c6378..37453f9 100644 --- a/src/command/client/init.rs +++ b/src/command/init.rs @@ -11,17 +11,17 @@ pub enum Cmd { } fn init_zsh() { - let full = include_str!("../../shell/atuin.zsh"); + let full = include_str!("../shell/atuin.zsh"); println!("{}", full); } fn init_bash() { - let full = include_str!("../../shell/atuin.bash"); + let full = include_str!("../shell/atuin.bash"); println!("{}", full); } fn init_fish() { - let full = include_str!("../../shell/atuin.fish"); + let full = include_str!("../shell/atuin.fish"); println!("{}", full); } diff --git a/src/command/mod.rs b/src/command/mod.rs index ca7fc72..393936b 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -1,4 +1,5 @@ -use clap::Subcommand; +use clap::{CommandFactory, Subcommand}; +use clap_complete::{generate, generate_to, Shell}; use eyre::Result; #[cfg(feature = "client")] @@ -7,6 +8,8 @@ mod client; #[cfg(feature = "server")] mod server; +mod init; + #[derive(Subcommand)] #[clap(infer_subcommands = true)] pub enum AtuinCmd { @@ -18,6 +21,24 @@ pub enum AtuinCmd { #[cfg(feature = "server")] #[clap(subcommand)] Server(server::Cmd), + + /// Output shell setup + #[clap(subcommand)] + Init(init::Cmd), + + /// Generate a UUID + Uuid, + + /// Generate shell completions + GenCompletions { + /// Set the shell for generating completions + #[clap(long, short)] + shell: Shell, + + /// Set the output directory + #[clap(long, short)] + out_dir: Option<String>, + }, } impl AtuinCmd { @@ -27,6 +48,33 @@ impl AtuinCmd { Self::Client(client) => client.run(), #[cfg(feature = "server")] Self::Server(server) => server.run(), + Self::Init(init) => { + init.run(); + Ok(()) + } + Self::Uuid => { + println!("{}", atuin_common::utils::uuid_v4()); + Ok(()) + } + Self::GenCompletions { shell, out_dir } => { + let mut cli = crate::Atuin::command(); + + match out_dir { + Some(out_dir) => { + generate_to(shell, &mut cli, env!("CARGO_PKG_NAME"), &out_dir)?; + } + None => { + generate( + shell, + &mut cli, + env!("CARGO_PKG_NAME"), + &mut std::io::stdout(), + ); + } + } + + Ok(()) + } } } }