parent
1735be05d7
commit
38172f3501
17 changed files with 55 additions and 49 deletions
|
@ -70,8 +70,8 @@ pub fn current_context() -> Context {
|
|||
|
||||
#[async_trait]
|
||||
pub trait Database: Send + Sync + 'static {
|
||||
async fn save(&mut self, h: &History) -> Result<()>;
|
||||
async fn save_bulk(&mut self, h: &[History]) -> Result<()>;
|
||||
async fn save(&self, h: &History) -> Result<()>;
|
||||
async fn save_bulk(&self, h: &[History]) -> Result<()>;
|
||||
|
||||
async fn load(&self, id: &str) -> Result<Option<History>>;
|
||||
async fn list(
|
||||
|
@ -193,7 +193,7 @@ impl Sqlite {
|
|||
|
||||
#[async_trait]
|
||||
impl Database for Sqlite {
|
||||
async fn save(&mut self, h: &History) -> Result<()> {
|
||||
async fn save(&self, h: &History) -> Result<()> {
|
||||
debug!("saving history to sqlite");
|
||||
let mut tx = self.pool.begin().await?;
|
||||
Self::save_raw(&mut tx, h).await?;
|
||||
|
@ -202,7 +202,7 @@ impl Database for Sqlite {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
async fn save_bulk(&mut self, h: &[History]) -> Result<()> {
|
||||
async fn save_bulk(&self, h: &[History]) -> Result<()> {
|
||||
debug!("saving history to sqlite");
|
||||
|
||||
let mut tx = self.pool.begin().await?;
|
||||
|
|
|
@ -37,7 +37,7 @@ async fn sync_download(
|
|||
key: &Key,
|
||||
force: bool,
|
||||
client: &api_client::Client<'_>,
|
||||
db: &mut (impl Database + Send),
|
||||
db: &(impl Database + Send),
|
||||
) -> Result<(i64, i64)> {
|
||||
debug!("starting sync download");
|
||||
|
||||
|
@ -127,7 +127,7 @@ async fn sync_upload(
|
|||
key: &Key,
|
||||
_force: bool,
|
||||
client: &api_client::Client<'_>,
|
||||
db: &mut (impl Database + Send),
|
||||
db: &(impl Database + Send),
|
||||
) -> Result<()> {
|
||||
debug!("starting sync upload");
|
||||
|
||||
|
@ -188,7 +188,7 @@ async fn sync_upload(
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn sync(settings: &Settings, force: bool, db: &mut (impl Database + Send)) -> Result<()> {
|
||||
pub async fn sync(settings: &Settings, force: bool, db: &(impl Database + Send)) -> Result<()> {
|
||||
let client = api_client::Client::new(
|
||||
&settings.sync_address,
|
||||
&settings.session_token,
|
||||
|
|
|
@ -18,7 +18,7 @@ mod kv;
|
|||
mod search;
|
||||
mod stats;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
#[derive(Subcommand, Debug)]
|
||||
#[command(infer_subcommands = true)]
|
||||
pub enum Cmd {
|
||||
/// Manipulate shell history
|
||||
|
@ -54,22 +54,24 @@ impl Cmd {
|
|||
.parse_env("ATUIN_LOG")
|
||||
.init();
|
||||
|
||||
tracing::trace!(command = ?self, "client command");
|
||||
|
||||
let mut settings = Settings::new().wrap_err("could not load client settings")?;
|
||||
|
||||
let db_path = PathBuf::from(settings.db_path.as_str());
|
||||
let record_store_path = PathBuf::from(settings.record_store_path.as_str());
|
||||
|
||||
let mut db = Sqlite::new(db_path).await?;
|
||||
let db = Sqlite::new(db_path).await?;
|
||||
let mut store = SqliteStore::new(record_store_path).await?;
|
||||
|
||||
match self {
|
||||
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::History(history) => history.run(&settings, &db).await,
|
||||
Self::Import(import) => import.run(&db).await,
|
||||
Self::Stats(stats) => stats.run(&db, &settings).await,
|
||||
Self::Search(search) => search.run(db, &mut settings).await,
|
||||
|
||||
#[cfg(feature = "sync")]
|
||||
Self::Sync(sync) => sync.run(settings, &mut db, &mut store).await,
|
||||
Self::Sync(sync) => sync.run(settings, &db, &mut store).await,
|
||||
|
||||
#[cfg(feature = "sync")]
|
||||
Self::Account(account) => account.run(settings).await,
|
||||
|
|
|
@ -8,13 +8,13 @@ pub mod login;
|
|||
pub mod logout;
|
||||
pub mod register;
|
||||
|
||||
#[derive(Args)]
|
||||
#[derive(Args, Debug)]
|
||||
pub struct Cmd {
|
||||
#[command(subcommand)]
|
||||
command: Commands,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum Commands {
|
||||
/// Login to the configured server
|
||||
Login(login::Cmd),
|
||||
|
|
|
@ -12,7 +12,7 @@ use atuin_client::{
|
|||
use atuin_common::api::LoginRequest;
|
||||
use rpassword::prompt_password;
|
||||
|
||||
#[derive(Parser)]
|
||||
#[derive(Parser, Debug)]
|
||||
pub struct Cmd {
|
||||
#[clap(long, short)]
|
||||
pub username: Option<String>,
|
||||
|
|
|
@ -4,7 +4,7 @@ use tokio::{fs::File, io::AsyncWriteExt};
|
|||
|
||||
use atuin_client::{api_client, settings::Settings};
|
||||
|
||||
#[derive(Parser)]
|
||||
#[derive(Parser, Debug)]
|
||||
pub struct Cmd {
|
||||
#[clap(long, short)]
|
||||
pub username: Option<String>,
|
||||
|
|
|
@ -23,7 +23,7 @@ use time::{macros::format_description, OffsetDateTime};
|
|||
|
||||
use super::search::format_duration_into;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
#[derive(Subcommand, Debug)]
|
||||
#[command(infer_subcommands = true)]
|
||||
pub enum Cmd {
|
||||
/// Begins a new command in the history
|
||||
|
@ -239,7 +239,7 @@ fn parse_fmt(format: &str) -> ParsedFmt {
|
|||
impl Cmd {
|
||||
#[allow(clippy::too_many_lines, clippy::cast_possible_truncation)]
|
||||
async fn handle_start(
|
||||
db: &mut impl Database,
|
||||
db: &impl Database,
|
||||
settings: &Settings,
|
||||
command: &[String],
|
||||
) -> Result<()> {
|
||||
|
@ -268,7 +268,7 @@ impl Cmd {
|
|||
}
|
||||
|
||||
async fn handle_end(
|
||||
db: &mut impl Database,
|
||||
db: &impl Database,
|
||||
settings: &Settings,
|
||||
id: &str,
|
||||
exit: i64,
|
||||
|
@ -313,7 +313,7 @@ impl Cmd {
|
|||
#[allow(clippy::too_many_arguments)]
|
||||
#[allow(clippy::fn_params_excessive_bools)]
|
||||
async fn handle_list(
|
||||
db: &mut impl Database,
|
||||
db: &impl Database,
|
||||
settings: &Settings,
|
||||
context: atuin_client::database::Context,
|
||||
session: bool,
|
||||
|
@ -361,7 +361,7 @@ impl Cmd {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn run(self, settings: &Settings, db: &mut impl Database) -> Result<()> {
|
||||
pub async fn run(self, settings: &Settings, db: &impl Database) -> Result<()> {
|
||||
let context = current_context();
|
||||
|
||||
match self {
|
||||
|
@ -377,7 +377,6 @@ impl Cmd {
|
|||
format,
|
||||
} => {
|
||||
let mode = ListMode::from_flags(human, cmd_only);
|
||||
let reverse = reverse;
|
||||
Self::handle_list(
|
||||
db, settings, context, session, cwd, mode, format, false, print0, reverse,
|
||||
)
|
||||
|
|
|
@ -14,7 +14,7 @@ use atuin_client::{
|
|||
},
|
||||
};
|
||||
|
||||
#[derive(Parser)]
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(infer_subcommands = true)]
|
||||
pub enum Cmd {
|
||||
/// Import history for the current shell
|
||||
|
@ -39,7 +39,7 @@ pub enum Cmd {
|
|||
const BATCH_SIZE: usize = 100;
|
||||
|
||||
impl Cmd {
|
||||
pub async fn run<DB: Database>(&self, db: &mut DB) -> Result<()> {
|
||||
pub async fn run<DB: Database>(&self, db: &DB) -> Result<()> {
|
||||
println!(" Atuin ");
|
||||
println!("======================");
|
||||
println!(" \u{1f30d} ");
|
||||
|
@ -104,11 +104,11 @@ impl Cmd {
|
|||
pub struct HistoryImporter<'db, DB: Database> {
|
||||
pb: ProgressBar,
|
||||
buf: Vec<History>,
|
||||
db: &'db mut DB,
|
||||
db: &'db DB,
|
||||
}
|
||||
|
||||
impl<'db, DB: Database> HistoryImporter<'db, DB> {
|
||||
fn new(db: &'db mut DB, len: usize) -> Self {
|
||||
fn new(db: &'db DB, len: usize) -> Self {
|
||||
Self {
|
||||
pb: ProgressBar::new(len as u64),
|
||||
buf: Vec::with_capacity(BATCH_SIZE),
|
||||
|
@ -138,7 +138,7 @@ impl<'db, DB: Database> Loader for HistoryImporter<'db, DB> {
|
|||
}
|
||||
}
|
||||
|
||||
async fn import<I: Importer + Send, DB: Database>(db: &mut DB) -> Result<()> {
|
||||
async fn import<I: Importer + Send, DB: Database>(db: &DB) -> Result<()> {
|
||||
println!("Importing history from {}", I::NAME);
|
||||
|
||||
let mut importer = I::new().await?;
|
||||
|
|
|
@ -3,7 +3,7 @@ use eyre::{Context, Result};
|
|||
|
||||
use atuin_client::{encryption, kv::KvStore, record::store::Store, settings::Settings};
|
||||
|
||||
#[derive(Subcommand)]
|
||||
#[derive(Subcommand, Debug)]
|
||||
#[command(infer_subcommands = true)]
|
||||
pub enum Cmd {
|
||||
// atuin kv set foo bar bar
|
||||
|
|
|
@ -19,7 +19,7 @@ mod interactive;
|
|||
pub use duration::{format_duration, format_duration_into};
|
||||
|
||||
#[allow(clippy::struct_excessive_bools)]
|
||||
#[derive(Parser)]
|
||||
#[derive(Parser, Debug)]
|
||||
pub struct Cmd {
|
||||
/// Filter search result by directory
|
||||
#[arg(long, short)]
|
||||
|
@ -103,7 +103,7 @@ pub struct Cmd {
|
|||
}
|
||||
|
||||
impl Cmd {
|
||||
pub async fn run(self, mut db: impl Database, settings: &mut Settings) -> Result<()> {
|
||||
pub async fn run(self, db: impl Database, settings: &mut Settings) -> Result<()> {
|
||||
if self.delete && self.query.is_empty() {
|
||||
println!("Please specify a query to match the items you wish to delete. If you wish to delete all history, pass --delete-it-all");
|
||||
return Ok(());
|
||||
|
@ -147,7 +147,7 @@ impl Cmd {
|
|||
};
|
||||
|
||||
let mut entries =
|
||||
run_non_interactive(settings, opt_filter.clone(), &self.query, &mut db).await?;
|
||||
run_non_interactive(settings, opt_filter.clone(), &self.query, &db).await?;
|
||||
|
||||
if entries.is_empty() {
|
||||
std::process::exit(1)
|
||||
|
@ -165,8 +165,7 @@ impl Cmd {
|
|||
}
|
||||
|
||||
entries =
|
||||
run_non_interactive(settings, opt_filter.clone(), &self.query, &mut db)
|
||||
.await?;
|
||||
run_non_interactive(settings, opt_filter.clone(), &self.query, &db).await?;
|
||||
}
|
||||
} else {
|
||||
super::history::print_list(
|
||||
|
@ -189,7 +188,7 @@ async fn run_non_interactive(
|
|||
settings: &Settings,
|
||||
filter_options: OptFilters,
|
||||
query: &[String],
|
||||
db: &mut impl Database,
|
||||
db: &impl Database,
|
||||
) -> Result<Vec<History>> {
|
||||
let dir = if filter_options.cwd.as_deref() == Some(".") {
|
||||
Some(utils::get_current_dir())
|
||||
|
|
|
@ -12,7 +12,7 @@ use atuin_client::{
|
|||
};
|
||||
use time::{Duration, OffsetDateTime, Time};
|
||||
|
||||
#[derive(Parser)]
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(infer_subcommands = true)]
|
||||
pub struct Cmd {
|
||||
/// compute statistics for the specified period, leave blank for statistics since the beginning
|
||||
|
@ -73,7 +73,7 @@ fn compute_stats(history: &[History], count: usize) -> Result<()> {
|
|||
}
|
||||
|
||||
impl Cmd {
|
||||
pub async fn run(&self, db: &mut impl Database, settings: &Settings) -> Result<()> {
|
||||
pub async fn run(&self, db: &impl Database, settings: &Settings) -> Result<()> {
|
||||
let context = current_context();
|
||||
let words = if self.period.is_empty() {
|
||||
String::from("all")
|
||||
|
|
|
@ -11,7 +11,7 @@ mod status;
|
|||
|
||||
use crate::command::client::account;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
#[derive(Subcommand, Debug)]
|
||||
#[command(infer_subcommands = true)]
|
||||
pub enum Cmd {
|
||||
/// Sync with the configured server
|
||||
|
@ -44,7 +44,7 @@ impl Cmd {
|
|||
pub async fn run(
|
||||
self,
|
||||
settings: Settings,
|
||||
db: &mut impl Database,
|
||||
db: &impl Database,
|
||||
store: &mut (impl Store + Send + Sync),
|
||||
) -> Result<()> {
|
||||
match self {
|
||||
|
@ -74,7 +74,7 @@ impl Cmd {
|
|||
async fn run(
|
||||
settings: &Settings,
|
||||
force: bool,
|
||||
db: &mut impl Database,
|
||||
db: &impl Database,
|
||||
store: &mut (impl Store + Send + Sync),
|
||||
) -> Result<()> {
|
||||
let (diff, remote_index) = sync::diff(settings, store).await?;
|
||||
|
|
|
@ -6,7 +6,7 @@ use eyre::{Context, Result};
|
|||
|
||||
use atuin_server::{launch, Settings};
|
||||
|
||||
#[derive(Parser)]
|
||||
#[derive(Parser, Debug)]
|
||||
#[clap(infer_subcommands = true)]
|
||||
pub enum Cmd {
|
||||
/// Start the server
|
||||
|
@ -29,6 +29,8 @@ impl Cmd {
|
|||
.with(EnvFilter::from_default_env())
|
||||
.init();
|
||||
|
||||
tracing::trace!(command = ?self, "server command");
|
||||
|
||||
let settings = Settings::new().wrap_err("could not load server settings")?;
|
||||
|
||||
match self {
|
||||
|
|
|
@ -12,12 +12,13 @@ _atuin_precmd() {
|
|||
|
||||
[[ -z "${ATUIN_HISTORY_ID}" ]] && return
|
||||
|
||||
(RUST_LOG=error atuin history end --exit "${EXIT}" -- "${ATUIN_HISTORY_ID}" &) >/dev/null 2>&1
|
||||
(ATUIN_LOG=error atuin history end --exit "${EXIT}" -- "${ATUIN_HISTORY_ID}" &) >/dev/null 2>&1
|
||||
export ATUIN_HISTORY_ID=""
|
||||
}
|
||||
|
||||
__atuin_history() {
|
||||
# shellcheck disable=SC2048,SC2086
|
||||
HISTORY="$(RUST_LOG=error atuin search $* -i -- "${READLINE_LINE}" 3>&1 1>&2 2>&3)"
|
||||
HISTORY="$(ATUIN_LOG=error atuin search $* -i -- "${READLINE_LINE}" 3>&1 1>&2 2>&3)"
|
||||
|
||||
READLINE_LINE=${HISTORY}
|
||||
READLINE_POINT=${#READLINE_LINE}
|
||||
|
|
|
@ -9,13 +9,14 @@ end
|
|||
function _atuin_postexec --on-event fish_postexec
|
||||
set s $status
|
||||
if test -n "$ATUIN_HISTORY_ID"
|
||||
RUST_LOG=error atuin history end --exit $s -- $ATUIN_HISTORY_ID &>/dev/null &
|
||||
ATUIN_LOG=error atuin history end --exit $s -- $ATUIN_HISTORY_ID &>/dev/null &
|
||||
disown
|
||||
end
|
||||
set --erase ATUIN_HISTORY_ID
|
||||
end
|
||||
|
||||
function _atuin_search
|
||||
set h (RUST_LOG=error atuin search $argv -i -- (commandline -b) 3>&1 1>&2 2>&3)
|
||||
set h (ATUIN_LOG=error atuin search $argv -i -- (commandline -b) 3>&1 1>&2 2>&3)
|
||||
commandline -f repaint
|
||||
if test -n "$h"
|
||||
commandline -r "$h"
|
||||
|
|
|
@ -19,16 +19,17 @@ let _atuin_pre_prompt = {||
|
|||
if 'ATUIN_HISTORY_ID' not-in $env {
|
||||
return
|
||||
}
|
||||
with-env { RUST_LOG: error } {
|
||||
with-env { ATUIN_LOG: error } {
|
||||
atuin history end $'--exit=($last_exit)' -- $env.ATUIN_HISTORY_ID | null
|
||||
}
|
||||
hide-env ATUIN_HISTORY_ID
|
||||
}
|
||||
|
||||
def _atuin_search_cmd [...flags: string] {
|
||||
[
|
||||
$ATUIN_KEYBINDING_TOKEN,
|
||||
([
|
||||
`commandline (RUST_LOG=error run-external --redirect-stderr atuin search`,
|
||||
`commandline (ATUIN_LOG=error run-external --redirect-stderr atuin search`,
|
||||
($flags | append [--interactive, --] | each {|e| $'"($e)"'}),
|
||||
`(commandline) | complete | $in.stderr | str substring ..-1)`,
|
||||
] | flatten | str join ' '),
|
||||
|
|
|
@ -23,7 +23,8 @@ _atuin_precmd() {
|
|||
|
||||
[[ -z "${ATUIN_HISTORY_ID:-}" ]] && return
|
||||
|
||||
(RUST_LOG=error atuin history end --exit $EXIT -- $ATUIN_HISTORY_ID &) >/dev/null 2>&1
|
||||
(ATUIN_LOG=error atuin history end --exit $EXIT -- $ATUIN_HISTORY_ID &) >/dev/null 2>&1
|
||||
export ATUIN_HISTORY_ID=""
|
||||
}
|
||||
|
||||
_atuin_search() {
|
||||
|
@ -33,7 +34,7 @@ _atuin_search() {
|
|||
# swap stderr and stdout, so that the tui stuff works
|
||||
# TODO: not this
|
||||
# shellcheck disable=SC2048
|
||||
output=$(RUST_LOG=error atuin search $* -i -- $BUFFER 3>&1 1>&2 2>&3)
|
||||
output=$(ATUIN_LOG=error atuin search $* -i -- $BUFFER 3>&1 1>&2 2>&3)
|
||||
|
||||
if [[ -n $output ]]; then
|
||||
RBUFFER=""
|
||||
|
|
Loading…
Reference in a new issue