refactor: getting rid of crossbeam
This commit is contained in:
parent
5e45659599
commit
662f2d7735
32
Cargo.lock
generated
32
Cargo.lock
generated
@ -129,28 +129,6 @@ version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
|
||||
dependencies = [
|
||||
"crossbeam-channel",
|
||||
"crossbeam-deque",
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-queue",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.5"
|
||||
@ -170,15 +148,6 @@ dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-queue"
|
||||
version = "0.3.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.20"
|
||||
@ -301,7 +270,6 @@ version = "0.3.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
"crossbeam",
|
||||
"grep",
|
||||
"ignore",
|
||||
"serde",
|
||||
|
@ -20,7 +20,6 @@ categories = [
|
||||
[dependencies]
|
||||
anyhow = "1.0.86"
|
||||
clap = { version = "4.5.9", features = ["derive"] }
|
||||
crossbeam = { version = "0.8.4", features = ["crossbeam-queue"] }
|
||||
grep = "0.3.1"
|
||||
ignore = "0.4.22"
|
||||
serde = { version = "1.0.204", features = ["derive"] }
|
||||
|
62
src/main.rs
62
src/main.rs
@ -1,11 +1,10 @@
|
||||
use std::io::{stdin, Read};
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
use std::sync::{mpsc, Arc};
|
||||
|
||||
use clap::Parser;
|
||||
|
||||
use cli::Commands;
|
||||
use crossbeam::queue::SegQueue;
|
||||
use fs::is_readable_stdin;
|
||||
use grep::regex::RegexMatcher;
|
||||
use ignore::DirEntry;
|
||||
@ -67,8 +66,6 @@ pub fn main() -> anyhow::Result<()> {
|
||||
}
|
||||
}
|
||||
|
||||
let queue: Arc<SegQueue<FileResults>> = Arc::new(SegQueue::new());
|
||||
|
||||
let haystack_builder = walk_builder(
|
||||
cli_args.paths.iter().map(|p| p.as_path()).collect(),
|
||||
&cli_args.ignored_paths,
|
||||
@ -77,31 +74,36 @@ pub fn main() -> anyhow::Result<()> {
|
||||
cli_args.filter_filetypes,
|
||||
);
|
||||
let matcher: Arc<RegexMatcher> = Arc::new(build_matcher(&cli_args.patterns)?);
|
||||
haystack_builder.build_parallel().run(|| {
|
||||
let matcher = Arc::clone(&matcher);
|
||||
let mut searcher = build_searcher(cli_args.multiline);
|
||||
let queue = Arc::clone(&queue);
|
||||
Box::new(move |entry: Result<DirEntry, ignore::Error>| match entry {
|
||||
Ok(entry) => {
|
||||
let file_type = entry.file_type().unwrap();
|
||||
if !file_type.is_dir() {
|
||||
let path = entry.path().to_path_buf();
|
||||
match search_file(path, &matcher, &mut searcher) {
|
||||
Ok(file_results) => {
|
||||
if !file_results.is_empty() {
|
||||
queue.push(file_results);
|
||||
|
||||
let (tx, printer_queue) = mpsc::channel();
|
||||
|
||||
std::thread::spawn(move || {
|
||||
haystack_builder.build_parallel().run(|| {
|
||||
let matcher = Arc::clone(&matcher);
|
||||
let mut searcher = build_searcher(cli_args.multiline);
|
||||
let tx = tx.clone();
|
||||
Box::new(move |entry: Result<DirEntry, ignore::Error>| match entry {
|
||||
Ok(entry) => {
|
||||
let file_type = entry.file_type().unwrap();
|
||||
if !file_type.is_dir() {
|
||||
let path = entry.path().to_path_buf();
|
||||
match search_file(path, &matcher, &mut searcher) {
|
||||
Ok(file_results) => {
|
||||
if !file_results.is_empty() {
|
||||
tx.send(file_results).unwrap();
|
||||
}
|
||||
}
|
||||
Err(_err) => (),
|
||||
}
|
||||
Err(_err) => (),
|
||||
}
|
||||
ignore::WalkState::Continue
|
||||
}
|
||||
ignore::WalkState::Continue
|
||||
}
|
||||
Err(err) => {
|
||||
eprintln!("Error: {}", err);
|
||||
ignore::WalkState::Continue
|
||||
}
|
||||
})
|
||||
Err(err) => {
|
||||
eprintln!("Error: {}", err);
|
||||
ignore::WalkState::Continue
|
||||
}
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
let printer_config = PrinterConfig {
|
||||
@ -112,12 +114,12 @@ pub fn main() -> anyhow::Result<()> {
|
||||
..Default::default()
|
||||
};
|
||||
let mut printer = ResultsPrinter::new(printer_config);
|
||||
let printer_queue = Arc::into_inner(queue).unwrap();
|
||||
while !printer_queue.is_empty() {
|
||||
let file_results = printer_queue.pop().unwrap();
|
||||
printer.write(file_results)?;
|
||||
|
||||
while let Ok(result) = printer_queue.recv() {
|
||||
printer.write(result)?;
|
||||
printer.print()?;
|
||||
}
|
||||
|
||||
printer.print()?;
|
||||
//printer.print()?;
|
||||
Ok(())
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user