Fix/1207 deleted entries shown in interactive search (#1272)

This commit is contained in:
Dieter Eickstaedt 2023-10-04 20:13:29 +02:00 committed by GitHub
parent 573ff69749
commit f25681d8b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 32 additions and 18 deletions

View file

@ -80,16 +80,17 @@ pub trait Database: Send + Sync + 'static {
context: &Context, context: &Context,
max: Option<usize>, max: Option<usize>,
unique: bool, unique: bool,
include_deleted: bool,
) -> Result<Vec<History>>; ) -> Result<Vec<History>>;
async fn range(&self, from: OffsetDateTime, to: OffsetDateTime) -> Result<Vec<History>>; async fn range(&self, from: OffsetDateTime, to: OffsetDateTime) -> Result<Vec<History>>;
async fn update(&self, h: &History) -> Result<()>; async fn update(&self, h: &History) -> Result<()>;
async fn history_count(&self) -> Result<i64>; async fn history_count(&self, include_deleted: bool) -> Result<i64>;
async fn last(&self) -> Result<Option<History>>; async fn last(&self) -> Result<Option<History>>;
async fn before(&self, timestamp: OffsetDateTime, count: i64) -> Result<Vec<History>>; async fn before(&self, timestamp: OffsetDateTime, count: i64) -> Result<Vec<History>>;
async fn delete(&self, mut h: History) -> Result<()>; async fn delete(&self, h: History) -> Result<()>;
async fn deleted(&self) -> Result<Vec<History>>; async fn deleted(&self) -> Result<Vec<History>>;
// Yes I know, it's a lot. // Yes I know, it's a lot.
@ -257,11 +258,15 @@ impl Database for Sqlite {
context: &Context, context: &Context,
max: Option<usize>, max: Option<usize>,
unique: bool, unique: bool,
include_deleted: bool,
) -> Result<Vec<History>> { ) -> Result<Vec<History>> {
debug!("listing history"); debug!("listing history");
let mut query = SqlBuilder::select_from(SqlName::new("history").alias("h").baquoted()); let mut query = SqlBuilder::select_from(SqlName::new("history").alias("h").baquoted());
query.field("*").order_desc("timestamp"); query.field("*").order_desc("timestamp");
if !include_deleted {
query.and_where_is_null("deleted_at");
}
match filter { match filter {
FilterMode::Global => &mut query, FilterMode::Global => &mut query,
@ -340,11 +345,13 @@ impl Database for Sqlite {
Ok(res) Ok(res)
} }
async fn history_count(&self) -> Result<i64> { async fn history_count(&self, include_deleted: bool) -> Result<i64> {
let res: (i64,) = sqlx::query_as("select count(1) from history") let exclude_deleted: &str = if include_deleted { "" } else { "not" };
.fetch_one(&self.pool) let query = format!(
.await?; "select count(1) from history where deleted_at is {} null",
exclude_deleted
);
let res: (i64,) = sqlx::query_as(&query).fetch_one(&self.pool).await?;
Ok(res.0) Ok(res.0)
} }

View file

@ -48,7 +48,7 @@ async fn sync_download(
let remote_deleted = let remote_deleted =
HashSet::<&str>::from_iter(remote_status.deleted.iter().map(String::as_str)); HashSet::<&str>::from_iter(remote_status.deleted.iter().map(String::as_str));
let initial_local = db.history_count().await?; let initial_local = db.history_count(true).await?;
let mut local_count = initial_local; let mut local_count = initial_local;
let mut last_sync = if force { let mut last_sync = if force {
@ -84,7 +84,7 @@ async fn sync_download(
db.save_bulk(&history).await?; db.save_bulk(&history).await?;
local_count = db.history_count().await?; local_count = db.history_count(true).await?;
if history.len() < remote_status.page_size.try_into().unwrap() { if history.len() < remote_status.page_size.try_into().unwrap() {
break; break;
@ -137,7 +137,7 @@ async fn sync_upload(
let initial_remote_count = client.count().await?; let initial_remote_count = client.count().await?;
let mut remote_count = initial_remote_count; let mut remote_count = initial_remote_count;
let local_count = db.history_count().await?; let local_count = db.history_count(true).await?;
debug!("remote has {}, we have {}", remote_count, local_count); debug!("remote has {}, we have {}", remote_count, local_count);

View file

@ -320,6 +320,7 @@ impl Cmd {
cwd: bool, cwd: bool,
mode: ListMode, mode: ListMode,
format: Option<String>, format: Option<String>,
include_deleted: bool,
print0: bool, print0: bool,
reverse: bool, reverse: bool,
) -> Result<()> { ) -> Result<()> {
@ -335,7 +336,10 @@ impl Cmd {
}; };
let history = match (session, cwd) { let history = match (session, cwd) {
(None, None) => db.list(settings.filter_mode, &context, None, false).await?, (None, None) => {
db.list(settings.filter_mode, &context, None, false, include_deleted)
.await?
}
(None, Some(cwd)) => { (None, Some(cwd)) => {
let query = format!("select * from history where cwd = '{cwd}';"); let query = format!("select * from history where cwd = '{cwd}';");
db.query_history(&query).await? db.query_history(&query).await?
@ -375,7 +379,7 @@ impl Cmd {
let mode = ListMode::from_flags(human, cmd_only); let mode = ListMode::from_flags(human, cmd_only);
let reverse = reverse; let reverse = reverse;
Self::handle_list( Self::handle_list(
db, settings, context, session, cwd, mode, format, print0, reverse, db, settings, context, session, cwd, mode, format, false, print0, reverse,
) )
.await .await
} }

View file

@ -35,7 +35,7 @@ pub trait SearchEngine: Send + Sync + 'static {
async fn query(&mut self, state: &SearchState, db: &mut dyn Database) -> Result<Vec<History>> { async fn query(&mut self, state: &SearchState, db: &mut dyn Database) -> Result<Vec<History>> {
if state.input.as_str().is_empty() { if state.input.as_str().is_empty() {
Ok(db Ok(db
.list(state.filter_mode, &state.context, Some(200), true) .list(state.filter_mode, &state.context, Some(200), true, false)
.await? .await?
.into_iter() .into_iter()
.collect::<Vec<_>>()) .collect::<Vec<_>>())

View file

@ -617,7 +617,7 @@ pub async fn history(
let context = current_context(); let context = current_context();
let history_count = db.history_count().await?; let history_count = db.history_count(false).await?;
let search_mode = if settings.shell_up_key_binding { let search_mode = if settings.shell_up_key_binding {
settings settings
.search_mode_shell_up_key_binding .search_mode_shell_up_key_binding

View file

@ -82,7 +82,8 @@ impl Cmd {
}; };
let history = if words.as_str() == "all" { let history = if words.as_str() == "all" {
db.list(FilterMode::Global, &context, None, false).await? db.list(FilterMode::Global, &context, None, false, false)
.await?
} else if words.trim() == "today" { } else if words.trim() == "today" {
let start = OffsetDateTime::now_local()?.replace_time(Time::MIDNIGHT); let start = OffsetDateTime::now_local()?.replace_time(Time::MIDNIGHT);
let end = start + Duration::days(1); let end = start + Duration::days(1);

View file

@ -88,7 +88,7 @@ async fn run(
println!( println!(
"Sync complete! {} items in history database, force: {}", "Sync complete! {} items in history database, force: {}",
db.history_count().await?, db.history_count(true).await?,
force force
); );

View file

@ -13,7 +13,7 @@ pub async fn run(settings: &Settings, db: &impl Database) -> Result<()> {
let status = client.status().await?; let status = client.status().await?;
let last_sync = Settings::last_sync()?; let last_sync = Settings::last_sync()?;
let local_count = db.history_count().await?; let local_count = db.history_count(false).await?;
println!("Atuin v{VERSION} - Build rev {SHA}\n"); println!("Atuin v{VERSION} - Build rev {SHA}\n");

View file

@ -6,13 +6,15 @@ title: Listing History
| Arg | Description | | Arg | Description |
| ---------------- | ----------------------------------------------------------------------------- | |------------------|-------------------------------------------------------------------------------|
| `--cwd`/`-c` | The directory to list history for (default: all dirs) | | `--cwd`/`-c` | The directory to list history for (default: all dirs) |
| `--session`/`-s` | Enable listing history for the current session only (default: false) | | `--session`/`-s` | Enable listing history for the current session only (default: false) |
| `--human` | Use human-readable formatting for the timestamp and duration (default: false) | | `--human` | Use human-readable formatting for the timestamp and duration (default: false) |
| `--cmd-only` | Show only the text of the command (default: false) | | `--cmd-only` | Show only the text of the command (default: false) |
| `--reverse` | Reverse the order of the output (default: false) | | `--reverse` | Reverse the order of the output (default: false) |
| `--format` | Specify the formatting of a command (see below) | | `--format` | Specify the formatting of a command (see below) |
| `--print0` | Terminate the output with a null, for better multiline support |
## Format ## Format