Fix/1207 deleted entries shown in interactive search (#1272)
This commit is contained in:
parent
573ff69749
commit
f25681d8b1
9 changed files with 32 additions and 18 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<_>>())
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue