Accept existing paths in interactive query
This commit is contained in:
parent
c8a47a068b
commit
b4057529a1
|
|
@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- `zoxide query --interactive` now accepts a single existing path directly.
|
||||||
- PowerShell: use fully qualified names when invoking cmdlets.
|
- PowerShell: use fully qualified names when invoking cmdlets.
|
||||||
- Bash/Fish/POSIX/Zsh: resolve symlinks on Windows.
|
- Bash/Fish/POSIX/Zsh: resolve symlinks on Windows.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
|
|
||||||
|
|
@ -18,17 +19,50 @@ impl Run for Query {
|
||||||
impl Query {
|
impl Query {
|
||||||
fn query(&self, db: &mut Database) -> Result<()> {
|
fn query(&self, db: &mut Database) -> Result<()> {
|
||||||
let now = util::current_time()?;
|
let now = util::current_time()?;
|
||||||
let mut stream = self.get_stream(db, now)?;
|
|
||||||
|
|
||||||
if self.interactive {
|
if self.interactive {
|
||||||
|
if let Some(path) = self.existing_path()? {
|
||||||
|
println!("{path}");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut stream = self.get_stream(db, now)?;
|
||||||
self.query_interactive(&mut stream, now)
|
self.query_interactive(&mut stream, now)
|
||||||
} else if self.list {
|
} else if self.list {
|
||||||
|
let mut stream = self.get_stream(db, now)?;
|
||||||
self.query_list(&mut stream, now)
|
self.query_list(&mut stream, now)
|
||||||
} else {
|
} else {
|
||||||
|
let mut stream = self.get_stream(db, now)?;
|
||||||
self.query_first(&mut stream, now)
|
self.query_first(&mut stream, now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn existing_path(&self) -> Result<Option<String>> {
|
||||||
|
if self.score || self.keywords.len() != 1 {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
let path = Path::new(&self.keywords[0]);
|
||||||
|
if !path.is_dir() {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
let path = util::resolve_path(path)?;
|
||||||
|
let path = util::path_to_str(&path)?;
|
||||||
|
|
||||||
|
if Some(path) == self.exclude.as_deref() {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(base_dir) = &self.base_dir
|
||||||
|
&& !Path::new(path).starts_with(base_dir)
|
||||||
|
{
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Some(path.to_owned()))
|
||||||
|
}
|
||||||
|
|
||||||
fn query_interactive(&self, stream: &mut Stream, now: Epoch) -> Result<()> {
|
fn query_interactive(&self, stream: &mut Stream, now: Epoch) -> Result<()> {
|
||||||
let mut fzf = Self::get_fzf()?;
|
let mut fzf = Self::get_fzf()?;
|
||||||
let selection = loop {
|
let selection = loop {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
use assert_cmd::Command;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn interactive_query_accepts_existing_path() {
|
||||||
|
let data_dir = tempfile::tempdir().unwrap();
|
||||||
|
let target_parent = tempfile::tempdir().unwrap();
|
||||||
|
let target = target_parent.path().join("project");
|
||||||
|
std::fs::create_dir(&target).unwrap();
|
||||||
|
|
||||||
|
let expected = target.to_string_lossy();
|
||||||
|
|
||||||
|
Command::cargo_bin("zoxide")
|
||||||
|
.unwrap()
|
||||||
|
.env("_ZO_DATA_DIR", data_dir.path())
|
||||||
|
.args(["query", "--interactive", "--", expected.as_ref()])
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(format!("{expected}\n"))
|
||||||
|
.stderr("");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue