mirror of https://github.com/sharkdp/fd.git
Use absolute path to perform search, fixes #81
Previously, we were using the relative path to extract the search string. For the current directory, the returned relative path was equal to `""`. This is why the current directory did not show in the search results (see #81). This commit also changes the way that `--full-path` works, which was previously working on relative paths. It seems more useful to search the absolute path, though. Otherwise, search results could change just by calling fd (with a given search path) from a different directory.
This commit is contained in:
parent
97e3110333
commit
8fc3a83d92
36
src/walk.rs
36
src/walk.rs
|
@ -2,7 +2,7 @@ use internal::{error, FdOptions};
|
||||||
use fshelper;
|
use fshelper;
|
||||||
use output;
|
use output;
|
||||||
|
|
||||||
use std::path::Path;
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
@ -101,6 +101,7 @@ pub fn scan(root: &Path, pattern: Arc<Regex>, base: &Path, config: Arc<FdOptions
|
||||||
let config = Arc::clone(&config);
|
let config = Arc::clone(&config);
|
||||||
let pattern = Arc::clone(&pattern);
|
let pattern = Arc::clone(&pattern);
|
||||||
let tx_thread = tx.clone();
|
let tx_thread = tx.clone();
|
||||||
|
let root = root.to_owned();
|
||||||
|
|
||||||
Box::new(move |entry_o| {
|
Box::new(move |entry_o| {
|
||||||
let entry = match entry_o {
|
let entry = match entry_o {
|
||||||
|
@ -108,6 +109,12 @@ pub fn scan(root: &Path, pattern: Arc<Regex>, base: &Path, config: Arc<FdOptions
|
||||||
Err(_) => return ignore::WalkState::Continue,
|
Err(_) => return ignore::WalkState::Continue,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let entry_path = entry.path();
|
||||||
|
|
||||||
|
if entry_path == root {
|
||||||
|
return ignore::WalkState::Continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Filter out unwanted file types.
|
// Filter out unwanted file types.
|
||||||
match config.file_type {
|
match config.file_type {
|
||||||
FileType::Any => (),
|
FileType::Any => (),
|
||||||
|
@ -130,29 +137,32 @@ pub fn scan(root: &Path, pattern: Arc<Regex>, base: &Path, config: Arc<FdOptions
|
||||||
|
|
||||||
// Filter out unwanted extensions.
|
// Filter out unwanted extensions.
|
||||||
if let Some(ref filter_ext) = config.extension {
|
if let Some(ref filter_ext) = config.extension {
|
||||||
let entry_ext = entry.path().extension().map(|e| {
|
let entry_ext = entry_path.extension().map(
|
||||||
e.to_string_lossy().to_lowercase()
|
|e| e.to_string_lossy().to_lowercase(),
|
||||||
});
|
);
|
||||||
if entry_ext.map_or(true, |ext| ext != *filter_ext) {
|
if entry_ext.map_or(true, |ext| ext != *filter_ext) {
|
||||||
return ignore::WalkState::Continue;
|
return ignore::WalkState::Continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let path_rel_buf = match fshelper::path_relative_from(entry.path(), &*base) {
|
|
||||||
Some(p) => p,
|
|
||||||
None => error("Error: could not get relative path for directory entry."),
|
|
||||||
};
|
|
||||||
let path_rel = path_rel_buf.as_path();
|
|
||||||
|
|
||||||
let search_str_o = if config.search_full_path {
|
let search_str_o = if config.search_full_path {
|
||||||
Some(path_rel.to_string_lossy())
|
Some(entry_path.to_string_lossy())
|
||||||
} else {
|
} else {
|
||||||
path_rel.file_name().map(|f| f.to_string_lossy())
|
entry_path.file_name().map(|f| f.to_string_lossy())
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(search_str) = search_str_o {
|
if let Some(search_str) = search_str_o {
|
||||||
// TODO: take care of the unwrap call
|
|
||||||
pattern.find(&*search_str).map(|_| {
|
pattern.find(&*search_str).map(|_| {
|
||||||
|
let mut path_rel_buf = match fshelper::path_relative_from(entry_path, &*base) {
|
||||||
|
Some(p) => p,
|
||||||
|
None => error("Error: could not get relative path for directory entry."),
|
||||||
|
};
|
||||||
|
|
||||||
|
if path_rel_buf == PathBuf::new() {
|
||||||
|
path_rel_buf.push(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: take care of the unwrap call
|
||||||
tx_thread.send(path_rel_buf.to_owned()).unwrap()
|
tx_thread.send(path_rel_buf.to_owned()).unwrap()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,16 @@ fn test_explicit_root_path() {
|
||||||
three/d.foo
|
three/d.foo
|
||||||
three/directory_foo",
|
three/directory_foo",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
te.assert_output_subdirectory(
|
||||||
|
"one/two/three",
|
||||||
|
&["", ".."],
|
||||||
|
".
|
||||||
|
../c.foo
|
||||||
|
../C.Foo2
|
||||||
|
d.foo
|
||||||
|
directory_foo",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Regex searches
|
/// Regex searches
|
||||||
|
@ -150,8 +160,6 @@ fn test_full_path() {
|
||||||
"one/two/three/d.foo
|
"one/two/three/d.foo
|
||||||
one/two/three/directory_foo",
|
one/two/three/directory_foo",
|
||||||
);
|
);
|
||||||
|
|
||||||
te.assert_output(&["--full-path", "^a\\.foo"], "a.foo");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Hidden files (--hidden)
|
/// Hidden files (--hidden)
|
||||||
|
@ -308,6 +316,23 @@ fn test_absolute_path() {
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
let abs_path = abs_path.trim_left_matches(r"\\?\");
|
let abs_path = abs_path.trim_left_matches(r"\\?\");
|
||||||
|
|
||||||
|
te.assert_output(
|
||||||
|
&["--absolute-path"],
|
||||||
|
&format!(
|
||||||
|
"{abs_path}/a.foo
|
||||||
|
{abs_path}/one
|
||||||
|
{abs_path}/one/b.foo
|
||||||
|
{abs_path}/one/two
|
||||||
|
{abs_path}/one/two/c.foo
|
||||||
|
{abs_path}/one/two/C.Foo2
|
||||||
|
{abs_path}/one/two/three
|
||||||
|
{abs_path}/one/two/three/d.foo
|
||||||
|
{abs_path}/one/two/three/directory_foo
|
||||||
|
{abs_path}/symlink",
|
||||||
|
abs_path = abs_path
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
te.assert_output(
|
te.assert_output(
|
||||||
&["--absolute-path", "foo"],
|
&["--absolute-path", "foo"],
|
||||||
&format!(
|
&format!(
|
||||||
|
|
Loading…
Reference in New Issue