clear history id (#1263)

* clear history id

* fix nu
This commit is contained in:
Conrad Ludgate 2023-10-08 17:15:14 +01:00 committed by GitHub
parent 1735be05d7
commit 38172f3501
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 55 additions and 49 deletions

View file

@ -70,8 +70,8 @@ pub fn current_context() -> Context {
#[async_trait] #[async_trait]
pub trait Database: Send + Sync + 'static { pub trait Database: Send + Sync + 'static {
async fn save(&mut self, h: &History) -> Result<()>; async fn save(&self, h: &History) -> Result<()>;
async fn save_bulk(&mut self, h: &[History]) -> Result<()>; async fn save_bulk(&self, h: &[History]) -> Result<()>;
async fn load(&self, id: &str) -> Result<Option<History>>; async fn load(&self, id: &str) -> Result<Option<History>>;
async fn list( async fn list(
@ -193,7 +193,7 @@ impl Sqlite {
#[async_trait] #[async_trait]
impl Database for Sqlite { impl Database for Sqlite {
async fn save(&mut self, h: &History) -> Result<()> { async fn save(&self, h: &History) -> Result<()> {
debug!("saving history to sqlite"); debug!("saving history to sqlite");
let mut tx = self.pool.begin().await?; let mut tx = self.pool.begin().await?;
Self::save_raw(&mut tx, h).await?; Self::save_raw(&mut tx, h).await?;
@ -202,7 +202,7 @@ impl Database for Sqlite {
Ok(()) Ok(())
} }
async fn save_bulk(&mut self, h: &[History]) -> Result<()> { async fn save_bulk(&self, h: &[History]) -> Result<()> {
debug!("saving history to sqlite"); debug!("saving history to sqlite");
let mut tx = self.pool.begin().await?; let mut tx = self.pool.begin().await?;

View file

@ -37,7 +37,7 @@ async fn sync_download(
key: &Key, key: &Key,
force: bool, force: bool,
client: &api_client::Client<'_>, client: &api_client::Client<'_>,
db: &mut (impl Database + Send), db: &(impl Database + Send),
) -> Result<(i64, i64)> { ) -> Result<(i64, i64)> {
debug!("starting sync download"); debug!("starting sync download");
@ -127,7 +127,7 @@ async fn sync_upload(
key: &Key, key: &Key,
_force: bool, _force: bool,
client: &api_client::Client<'_>, client: &api_client::Client<'_>,
db: &mut (impl Database + Send), db: &(impl Database + Send),
) -> Result<()> { ) -> Result<()> {
debug!("starting sync upload"); debug!("starting sync upload");
@ -188,7 +188,7 @@ async fn sync_upload(
Ok(()) 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( let client = api_client::Client::new(
&settings.sync_address, &settings.sync_address,
&settings.session_token, &settings.session_token,

View file

@ -18,7 +18,7 @@ mod kv;
mod search; mod search;
mod stats; mod stats;
#[derive(Subcommand)] #[derive(Subcommand, Debug)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
pub enum Cmd { pub enum Cmd {
/// Manipulate shell history /// Manipulate shell history
@ -54,22 +54,24 @@ impl Cmd {
.parse_env("ATUIN_LOG") .parse_env("ATUIN_LOG")
.init(); .init();
tracing::trace!(command = ?self, "client command");
let mut settings = Settings::new().wrap_err("could not load client settings")?; let mut settings = Settings::new().wrap_err("could not load client settings")?;
let db_path = PathBuf::from(settings.db_path.as_str()); let db_path = PathBuf::from(settings.db_path.as_str());
let record_store_path = PathBuf::from(settings.record_store_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?; let mut store = SqliteStore::new(record_store_path).await?;
match self { match self {
Self::History(history) => history.run(&settings, &mut db).await, Self::History(history) => history.run(&settings, &db).await,
Self::Import(import) => import.run(&mut db).await, Self::Import(import) => import.run(&db).await,
Self::Stats(stats) => stats.run(&mut db, &settings).await, Self::Stats(stats) => stats.run(&db, &settings).await,
Self::Search(search) => search.run(db, &mut settings).await, Self::Search(search) => search.run(db, &mut settings).await,
#[cfg(feature = "sync")] #[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")] #[cfg(feature = "sync")]
Self::Account(account) => account.run(settings).await, Self::Account(account) => account.run(settings).await,

View file

@ -8,13 +8,13 @@ pub mod login;
pub mod logout; pub mod logout;
pub mod register; pub mod register;
#[derive(Args)] #[derive(Args, Debug)]
pub struct Cmd { pub struct Cmd {
#[command(subcommand)] #[command(subcommand)]
command: Commands, command: Commands,
} }
#[derive(Subcommand)] #[derive(Subcommand, Debug)]
pub enum Commands { pub enum Commands {
/// Login to the configured server /// Login to the configured server
Login(login::Cmd), Login(login::Cmd),

View file

@ -12,7 +12,7 @@ use atuin_client::{
use atuin_common::api::LoginRequest; use atuin_common::api::LoginRequest;
use rpassword::prompt_password; use rpassword::prompt_password;
#[derive(Parser)] #[derive(Parser, Debug)]
pub struct Cmd { pub struct Cmd {
#[clap(long, short)] #[clap(long, short)]
pub username: Option<String>, pub username: Option<String>,

View file

@ -4,7 +4,7 @@ use tokio::{fs::File, io::AsyncWriteExt};
use atuin_client::{api_client, settings::Settings}; use atuin_client::{api_client, settings::Settings};
#[derive(Parser)] #[derive(Parser, Debug)]
pub struct Cmd { pub struct Cmd {
#[clap(long, short)] #[clap(long, short)]
pub username: Option<String>, pub username: Option<String>,

View file

@ -23,7 +23,7 @@ use time::{macros::format_description, OffsetDateTime};
use super::search::format_duration_into; use super::search::format_duration_into;
#[derive(Subcommand)] #[derive(Subcommand, Debug)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
pub enum Cmd { pub enum Cmd {
/// Begins a new command in the history /// Begins a new command in the history
@ -239,7 +239,7 @@ fn parse_fmt(format: &str) -> ParsedFmt {
impl Cmd { impl Cmd {
#[allow(clippy::too_many_lines, clippy::cast_possible_truncation)] #[allow(clippy::too_many_lines, clippy::cast_possible_truncation)]
async fn handle_start( async fn handle_start(
db: &mut impl Database, db: &impl Database,
settings: &Settings, settings: &Settings,
command: &[String], command: &[String],
) -> Result<()> { ) -> Result<()> {
@ -268,7 +268,7 @@ impl Cmd {
} }
async fn handle_end( async fn handle_end(
db: &mut impl Database, db: &impl Database,
settings: &Settings, settings: &Settings,
id: &str, id: &str,
exit: i64, exit: i64,
@ -313,7 +313,7 @@ impl Cmd {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
#[allow(clippy::fn_params_excessive_bools)] #[allow(clippy::fn_params_excessive_bools)]
async fn handle_list( async fn handle_list(
db: &mut impl Database, db: &impl Database,
settings: &Settings, settings: &Settings,
context: atuin_client::database::Context, context: atuin_client::database::Context,
session: bool, session: bool,
@ -361,7 +361,7 @@ impl Cmd {
Ok(()) 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(); let context = current_context();
match self { match self {
@ -377,7 +377,6 @@ impl Cmd {
format, format,
} => { } => {
let mode = ListMode::from_flags(human, cmd_only); let mode = ListMode::from_flags(human, cmd_only);
let reverse = reverse;
Self::handle_list( Self::handle_list(
db, settings, context, session, cwd, mode, format, false, print0, reverse, db, settings, context, session, cwd, mode, format, false, print0, reverse,
) )

View file

@ -14,7 +14,7 @@ use atuin_client::{
}, },
}; };
#[derive(Parser)] #[derive(Parser, Debug)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
pub enum Cmd { pub enum Cmd {
/// Import history for the current shell /// Import history for the current shell
@ -39,7 +39,7 @@ pub enum Cmd {
const BATCH_SIZE: usize = 100; const BATCH_SIZE: usize = 100;
impl Cmd { 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!(" Atuin ");
println!("======================"); println!("======================");
println!(" \u{1f30d} "); println!(" \u{1f30d} ");
@ -104,11 +104,11 @@ impl Cmd {
pub struct HistoryImporter<'db, DB: Database> { pub struct HistoryImporter<'db, DB: Database> {
pb: ProgressBar, pb: ProgressBar,
buf: Vec<History>, buf: Vec<History>,
db: &'db mut DB, db: &'db DB,
} }
impl<'db, DB: Database> HistoryImporter<'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 { Self {
pb: ProgressBar::new(len as u64), pb: ProgressBar::new(len as u64),
buf: Vec::with_capacity(BATCH_SIZE), 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); println!("Importing history from {}", I::NAME);
let mut importer = I::new().await?; let mut importer = I::new().await?;

View file

@ -3,7 +3,7 @@ use eyre::{Context, Result};
use atuin_client::{encryption, kv::KvStore, record::store::Store, settings::Settings}; use atuin_client::{encryption, kv::KvStore, record::store::Store, settings::Settings};
#[derive(Subcommand)] #[derive(Subcommand, Debug)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
pub enum Cmd { pub enum Cmd {
// atuin kv set foo bar bar // atuin kv set foo bar bar

View file

@ -19,7 +19,7 @@ mod interactive;
pub use duration::{format_duration, format_duration_into}; pub use duration::{format_duration, format_duration_into};
#[allow(clippy::struct_excessive_bools)] #[allow(clippy::struct_excessive_bools)]
#[derive(Parser)] #[derive(Parser, Debug)]
pub struct Cmd { pub struct Cmd {
/// Filter search result by directory /// Filter search result by directory
#[arg(long, short)] #[arg(long, short)]
@ -103,7 +103,7 @@ pub struct Cmd {
} }
impl 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() { 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"); 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(()); return Ok(());
@ -147,7 +147,7 @@ impl Cmd {
}; };
let mut entries = 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() { if entries.is_empty() {
std::process::exit(1) std::process::exit(1)
@ -165,8 +165,7 @@ impl Cmd {
} }
entries = entries =
run_non_interactive(settings, opt_filter.clone(), &self.query, &mut db) run_non_interactive(settings, opt_filter.clone(), &self.query, &db).await?;
.await?;
} }
} else { } else {
super::history::print_list( super::history::print_list(
@ -189,7 +188,7 @@ async fn run_non_interactive(
settings: &Settings, settings: &Settings,
filter_options: OptFilters, filter_options: OptFilters,
query: &[String], query: &[String],
db: &mut impl Database, db: &impl Database,
) -> Result<Vec<History>> { ) -> Result<Vec<History>> {
let dir = if filter_options.cwd.as_deref() == Some(".") { let dir = if filter_options.cwd.as_deref() == Some(".") {
Some(utils::get_current_dir()) Some(utils::get_current_dir())

View file

@ -12,7 +12,7 @@ use atuin_client::{
}; };
use time::{Duration, OffsetDateTime, Time}; use time::{Duration, OffsetDateTime, Time};
#[derive(Parser)] #[derive(Parser, Debug)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
pub struct Cmd { pub struct Cmd {
/// compute statistics for the specified period, leave blank for statistics since the beginning /// 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 { 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 context = current_context();
let words = if self.period.is_empty() { let words = if self.period.is_empty() {
String::from("all") String::from("all")

View file

@ -11,7 +11,7 @@ mod status;
use crate::command::client::account; use crate::command::client::account;
#[derive(Subcommand)] #[derive(Subcommand, Debug)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
pub enum Cmd { pub enum Cmd {
/// Sync with the configured server /// Sync with the configured server
@ -44,7 +44,7 @@ impl Cmd {
pub async fn run( pub async fn run(
self, self,
settings: Settings, settings: Settings,
db: &mut impl Database, db: &impl Database,
store: &mut (impl Store + Send + Sync), store: &mut (impl Store + Send + Sync),
) -> Result<()> { ) -> Result<()> {
match self { match self {
@ -74,7 +74,7 @@ impl Cmd {
async fn run( async fn run(
settings: &Settings, settings: &Settings,
force: bool, force: bool,
db: &mut impl Database, db: &impl Database,
store: &mut (impl Store + Send + Sync), store: &mut (impl Store + Send + Sync),
) -> Result<()> { ) -> Result<()> {
let (diff, remote_index) = sync::diff(settings, store).await?; let (diff, remote_index) = sync::diff(settings, store).await?;

View file

@ -6,7 +6,7 @@ use eyre::{Context, Result};
use atuin_server::{launch, Settings}; use atuin_server::{launch, Settings};
#[derive(Parser)] #[derive(Parser, Debug)]
#[clap(infer_subcommands = true)] #[clap(infer_subcommands = true)]
pub enum Cmd { pub enum Cmd {
/// Start the server /// Start the server
@ -29,6 +29,8 @@ impl Cmd {
.with(EnvFilter::from_default_env()) .with(EnvFilter::from_default_env())
.init(); .init();
tracing::trace!(command = ?self, "server command");
let settings = Settings::new().wrap_err("could not load server settings")?; let settings = Settings::new().wrap_err("could not load server settings")?;
match self { match self {

View file

@ -12,12 +12,13 @@ _atuin_precmd() {
[[ -z "${ATUIN_HISTORY_ID}" ]] && return [[ -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() { __atuin_history() {
# shellcheck disable=SC2048,SC2086 # 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_LINE=${HISTORY}
READLINE_POINT=${#READLINE_LINE} READLINE_POINT=${#READLINE_LINE}

View file

@ -9,13 +9,14 @@ end
function _atuin_postexec --on-event fish_postexec function _atuin_postexec --on-event fish_postexec
set s $status set s $status
if test -n "$ATUIN_HISTORY_ID" 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 disown
end end
set --erase ATUIN_HISTORY_ID
end end
function _atuin_search 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 commandline -f repaint
if test -n "$h" if test -n "$h"
commandline -r "$h" commandline -r "$h"

View file

@ -19,16 +19,17 @@ let _atuin_pre_prompt = {||
if 'ATUIN_HISTORY_ID' not-in $env { if 'ATUIN_HISTORY_ID' not-in $env {
return return
} }
with-env { RUST_LOG: error } { with-env { ATUIN_LOG: error } {
atuin history end $'--exit=($last_exit)' -- $env.ATUIN_HISTORY_ID | null atuin history end $'--exit=($last_exit)' -- $env.ATUIN_HISTORY_ID | null
} }
hide-env ATUIN_HISTORY_ID
} }
def _atuin_search_cmd [...flags: string] { def _atuin_search_cmd [...flags: string] {
[ [
$ATUIN_KEYBINDING_TOKEN, $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)"'}), ($flags | append [--interactive, --] | each {|e| $'"($e)"'}),
`(commandline) | complete | $in.stderr | str substring ..-1)`, `(commandline) | complete | $in.stderr | str substring ..-1)`,
] | flatten | str join ' '), ] | flatten | str join ' '),

View file

@ -23,7 +23,8 @@ _atuin_precmd() {
[[ -z "${ATUIN_HISTORY_ID:-}" ]] && return [[ -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() { _atuin_search() {
@ -33,7 +34,7 @@ _atuin_search() {
# swap stderr and stdout, so that the tui stuff works # swap stderr and stdout, so that the tui stuff works
# TODO: not this # TODO: not this
# shellcheck disable=SC2048 # 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 if [[ -n $output ]]; then
RBUFFER="" RBUFFER=""