mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-07-31 04:02:00 -07:00
cli: fix non-path sorting behavior
Previously, sorting worked by sorting the parents and then sorting the children within each parent. This was done during traversal, but it only works when sorting parents preserves the overall order. This generally only works for '--sort path' in ascending order. This commit fixes the rest of the sorting behavior by collecting all of the paths to search and then sorting them before searching. We only collect all of the paths when sorting was requested. Fixes #2243, Closes #2361
This commit is contained in:
committed by
Andrew Gallant
parent
6d95c130d5
commit
6abb962f0d
@@ -1065,3 +1065,48 @@ rgtest!(type_list, |_: Dir, mut cmd: TestCommand| {
|
||||
// This can change over time, so just make sure we print something.
|
||||
assert!(!cmd.stdout().is_empty());
|
||||
});
|
||||
|
||||
// The following series of tests seeks to test all permutations of ripgrep's
|
||||
// sorted queries.
|
||||
//
|
||||
// They all rely on this setup function, which sets up this particular file
|
||||
// structure with a particular creation order:
|
||||
// ├── a # 1
|
||||
// ├── b # 4
|
||||
// └── dir # 2
|
||||
// ├── c # 3
|
||||
// └── d # 5
|
||||
//
|
||||
// This order is important when sorting them by system time-stamps.
|
||||
fn sort_setup(dir: Dir) {
|
||||
use std::{thread::sleep, time::Duration};
|
||||
|
||||
let sub_dir = dir.path().join("dir");
|
||||
dir.create("a", "test");
|
||||
sleep(Duration::from_millis(100));
|
||||
dir.create_dir(&sub_dir);
|
||||
sleep(Duration::from_millis(100));
|
||||
dir.create(sub_dir.join("c"), "test");
|
||||
sleep(Duration::from_millis(100));
|
||||
dir.create("b", "test");
|
||||
sleep(Duration::from_millis(100));
|
||||
dir.create(sub_dir.join("d"), "test");
|
||||
}
|
||||
|
||||
rgtest!(sort_files, |dir: Dir, mut cmd: TestCommand| {
|
||||
sort_setup(dir);
|
||||
let expected = "a:test\nb:test\ndir/c:test\ndir/d:test\n";
|
||||
eqnice!(expected, cmd.args(["--sort", "path", "test"]).stdout());
|
||||
});
|
||||
|
||||
rgtest!(sort_accessed, |dir: Dir, mut cmd: TestCommand| {
|
||||
sort_setup(dir);
|
||||
let expected = "a:test\ndir/c:test\nb:test\ndir/d:test\n";
|
||||
eqnice!(expected, cmd.args(["--sort", "accessed", "test"]).stdout());
|
||||
});
|
||||
|
||||
rgtest!(sortr_accessed, |dir: Dir, mut cmd: TestCommand| {
|
||||
sort_setup(dir);
|
||||
let expected = "dir/d:test\nb:test\ndir/c:test\na:test\n";
|
||||
eqnice!(expected, cmd.args(["--sortr", "accessed", "test"]).stdout());
|
||||
});
|
||||
|
Reference in New Issue
Block a user