now we don't have to pass &db through three different functions, hooray

this also makes it easier to replace xdg_mime with something else in future
This commit is contained in:
Lynne Megido 2021-02-15 03:33:24 +10:00
parent d7eb0de299
commit bc4edecd21
Signed by: lynnesbian
GPG key ID: F0A184B5213D9F90

View file

@ -14,21 +14,20 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
use std::fmt::{self, Display};
use std::io::{BufWriter, stdout}; use std::io::{BufWriter, stdout};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use clap::Clap; use clap::Clap;
use log::{debug, info, trace, warn}; use log::{debug, info, trace, warn};
use once_cell::sync::OnceCell;
use rayon::prelude::*; use rayon::prelude::*;
use smartstring::alias::String; use smartstring::alias::String;
use walkdir::{DirEntry, WalkDir}; use walkdir::{DirEntry, WalkDir};
use xdg_mime::SharedMimeInfo;
use crate::findings::Findings;
use crate::formats::{Format, Script}; use crate::formats::{Format, Script};
use crate::parameters::OutputFormat; use crate::parameters::OutputFormat;
use crate::scanerror::ScanError; use crate::scanerror::ScanError;
use crate::findings::Findings;
mod parameters; mod parameters;
mod inspectors; mod inspectors;
@ -36,6 +35,8 @@ mod formats;
mod scanerror; mod scanerror;
mod findings; mod findings;
static MIMEDB: OnceCell<xdg_mime::SharedMimeInfo> = OnceCell::new();
// TODO: test if this actually works on a windows machine - not there's much of a point right now, considering // TODO: test if this actually works on a windows machine - not there's much of a point right now, considering
// xdg-mime-rs doesn't support windows // xdg-mime-rs doesn't support windows
#[cfg(windows)] #[cfg(windows)]
@ -80,9 +81,9 @@ fn extension_from_path(path: &Path) -> Option<String> {
map(|e| String::from(e.to_string_lossy())) // Convert from OsStr to String map(|e| String::from(e.to_string_lossy())) // Convert from OsStr to String
} }
fn scan_file(db: &SharedMimeInfo, entry: &DirEntry) -> Result<Findings, (ScanError, PathBuf)> { fn scan_file(entry: &DirEntry) -> Result<Findings, (ScanError, PathBuf)> {
// try to determine mimetype for this entry // try to determine mimetype for this entry
let result = inspectors::mime_type(db, entry.path()); let result = inspectors::mime_type(MIMEDB.get().unwrap(), entry.path());
if result.is_err() { if result.is_err() {
// an error occurred while trying to read the file // an error occurred while trying to read the file
@ -120,7 +121,7 @@ fn scan_file(db: &SharedMimeInfo, entry: &DirEntry) -> Result<Findings, (ScanErr
}) })
} }
fn scan_from_walkdir(db: &SharedMimeInfo, entries: Vec<DirEntry>) -> Vec<Result<Findings, (ScanError, PathBuf)>> { fn scan_from_walkdir(entries: Vec<DirEntry>) -> Vec<Result<Findings, (ScanError, PathBuf)>> {
#[cfg(feature = "multi-threaded")] { #[cfg(feature = "multi-threaded")] {
// rather than using a standard par_iter, split the entries into chunks of 32 first. // rather than using a standard par_iter, split the entries into chunks of 32 first.
// this allows each spawned thread to handle 16 files before before closing, rather than creating a new thread for // this allows each spawned thread to handle 16 files before before closing, rather than creating a new thread for
@ -129,7 +130,7 @@ fn scan_from_walkdir(db: &SharedMimeInfo, entries: Vec<DirEntry>) -> Vec<Result<
.par_chunks(32) // split into chunks of 32 .par_chunks(32) // split into chunks of 32
.flat_map(|chunk| chunk // return Vec<...> instead of Chunk<Vec<...>> .flat_map(|chunk| chunk // return Vec<...> instead of Chunk<Vec<...>>
.iter() // iter over the chunk, which is a slice of DirEntry structs .iter() // iter over the chunk, which is a slice of DirEntry structs
.map(|entry| scan_file(db, entry)) .map(|entry| scan_file(entry))
.collect::<Vec<_>>() .collect::<Vec<_>>()
) )
.collect() .collect()
@ -153,7 +154,7 @@ fn main() {
// .target(env_logger::Target::Stdout) // log to stdout rather than stderr // .target(env_logger::Target::Stdout) // log to stdout rather than stderr
.init(); .init();
let db = xdg_mime::SharedMimeInfo::new(); MIMEDB.set(xdg_mime::SharedMimeInfo::new()).or(Err("Failed to initialise MIMEDB")).unwrap();
debug!("Iterating directory: {:?}", args.dirs); debug!("Iterating directory: {:?}", args.dirs);
let stepper = WalkDir::new(&args.dirs).into_iter(); let stepper = WalkDir::new(&args.dirs).into_iter();
@ -165,7 +166,7 @@ fn main() {
trace!("Found {} items to check", entries.len()); trace!("Found {} items to check", entries.len());
let results = scan_from_walkdir(&db, entries); let results = scan_from_walkdir(entries);
for result in &results { for result in &results {
match result { match result {