From 97e0eda477af0b57d9971cd23a0a66104715cb57 Mon Sep 17 00:00:00 2001 From: Daniel Rainer Date: Mon, 12 Jan 2026 18:47:59 +0100 Subject: [PATCH] util: extract into new crate Move `src/util.rs` into a new dedicated crate. Closes #12316 --- Cargo.lock | 9 +++++++++ Cargo.toml | 2 ++ crates/util/Cargo.toml | 14 ++++++++++++++ src/util.rs => crates/util/src/lib.rs | 2 +- src/builtins/path.rs | 2 +- src/builtins/random.rs | 2 +- src/builtins/status.rs | 2 +- src/common.rs | 2 +- src/complete.rs | 2 +- src/expand.rs | 2 +- src/history/history.rs | 2 +- src/lib.rs | 1 - src/parser.rs | 2 +- 13 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 crates/util/Cargo.toml rename src/util.rs => crates/util/src/lib.rs (99%) diff --git a/Cargo.lock b/Cargo.lock index 88c3aa9f3..42e87a13d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -168,6 +168,7 @@ dependencies = [ "fish-gettext-mo-file-parser", "fish-printf", "fish-tempfile", + "fish-util", "fish-wcstringutil", "fish-widecharwidth", "fish-widestring", @@ -285,6 +286,14 @@ dependencies = [ "rand 0.9.2", ] +[[package]] +name = "fish-util" +version = "0.0.0" +dependencies = [ + "fish-widestring", + "rand 0.9.2", +] + [[package]] name = "fish-wcstringutil" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index a844df1c9..458dd8759 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ fish-gettext-maps = { path = "crates/gettext-maps" } fish-gettext-mo-file-parser = { path = "crates/gettext-mo-file-parser" } fish-printf = { path = "crates/printf", features = ["widestring"] } fish-tempfile = { path = "crates/tempfile" } +fish-util = { path = "crates/util" } fish-wcstringutil = { path = "crates/wcstringutil" } fish-widecharwidth = { path = "crates/widecharwidth" } fish-widestring = { path = "crates/widestring" } @@ -102,6 +103,7 @@ fish-gettext = { workspace = true, optional = true } fish-gettext-extraction = { workspace = true, optional = true } fish-printf.workspace = true fish-tempfile.workspace = true +fish-util.workspace = true fish-wcstringutil.workspace = true fish-widecharwidth.workspace = true fish-widestring.workspace = true diff --git a/crates/util/Cargo.toml b/crates/util/Cargo.toml new file mode 100644 index 000000000..d8cfd179c --- /dev/null +++ b/crates/util/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "fish-util" +edition.workspace = true +rust-version.workspace = true +version = "0.0.0" +repository.workspace = true +license.workspace = true + +[dependencies] +fish-widestring.workspace = true +rand.workspace = true + +[lints] +workspace = true diff --git a/src/util.rs b/crates/util/src/lib.rs similarity index 99% rename from src/util.rs rename to crates/util/src/lib.rs index d11fb6b4c..952693a17 100644 --- a/src/util.rs +++ b/crates/util/src/lib.rs @@ -239,7 +239,7 @@ fn wcsfilecmp_leading_digits(a: &wstr, b: &wstr) -> (Ordering, usize, usize) { /// # Examples /// /// ``` -/// use fish::util::find_subslice; +/// use fish_util::find_subslice; /// let haystack = b"ABC ABCDAB ABCDABCDABDE"; /// /// assert_eq!(find_subslice(b"ABCDABD", haystack), Some(15)); diff --git a/src/builtins/path.rs b/src/builtins/path.rs index 20fb4b352..549ff4994 100644 --- a/src/builtins/path.rs +++ b/src/builtins/path.rs @@ -6,12 +6,12 @@ use super::prelude::*; use crate::nix::{getegid, geteuid}; use crate::path::path_apply_working_directory; -use crate::util::wcsfilecmp_glob; use crate::wutil::{ INVALID_FILE_ID, file_id_for_path, lwstat, normalize_path, waccess, wbasename, wdirname, wrealpath, wstat, }; use bitflags::bitflags; +use fish_util::wcsfilecmp_glob; use fish_wcstringutil::split_string_tok; use libc::{F_OK, PATH_MAX, R_OK, S_ISGID, S_ISUID, W_OK, X_OK, mode_t}; diff --git a/src/builtins/random.rs b/src/builtins/random.rs index 288344780..735c266df 100644 --- a/src/builtins/random.rs +++ b/src/builtins/random.rs @@ -1,7 +1,7 @@ use super::prelude::*; -use crate::util::get_seeded_rng; use crate::wutil; +use fish_util::get_seeded_rng; use rand::rngs::SmallRng; use rand::{Rng, RngCore}; use std::sync::{LazyLock, Mutex}; diff --git a/src/builtins/status.rs b/src/builtins/status.rs index 9bf30db82..f835b9e46 100644 --- a/src/builtins/status.rs +++ b/src/builtins/status.rs @@ -527,7 +527,7 @@ pub fn status(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr]) -> B } } STATUS_LIST_FILES => { - use crate::util::wcsfilecmp_glob; + use fish_util::wcsfilecmp_glob; let mut paths = vec![]; let mut add = |arg| { let arg = crate::common::wcs2bytes(arg); diff --git a/src/common.rs b/src/common.rs index a3d86b8a7..3ea4a2ecc 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1382,7 +1382,7 @@ mod tests { ENCODE_DIRECT_END, ESCAPE_TEST_CHAR, EscapeFlags, EscapeStringStyle, UnescapeStringStyle, bytes2wcstring, escape_string, unescape_string, wcs2bytes, }; - use crate::util::get_seeded_rng; + use fish_util::get_seeded_rng; use fish_widestring::{ENCODE_DIRECT_BASE, L, WString, wstr}; use rand::{Rng, RngCore}; diff --git a/src/complete.rs b/src/complete.rs index 966f8e4ad..f7d894936 100644 --- a/src/complete.rs +++ b/src/complete.rs @@ -46,9 +46,9 @@ common::charptr2wcstring, localization::{LocalizableString, localizable_string}, reader::{get_quote, is_backslashed}, - util::wcsfilecmp, }; use bitflags::bitflags; +use fish_util::wcsfilecmp; use fish_wcstringutil::{ StringFuzzyMatch, string_fuzzy_match_string, string_prefixes_string, string_prefixes_string_case_insensitive, string_suffixes_string_case_insensitive, diff --git a/src/expand.rs b/src/expand.rs index ffab690f8..434d5ca91 100644 --- a/src/expand.rs +++ b/src/expand.rs @@ -24,12 +24,12 @@ }; use crate::path::path_apply_working_directory; use crate::prelude::*; -use crate::util::wcsfilecmp_glob; use crate::wildcard::{ANY_CHAR, ANY_STRING, ANY_STRING_RECURSIVE, WildcardResult}; use crate::wildcard::{wildcard_expand_string, wildcard_has_internal}; use crate::wutil::{Options, normalize_path, wcstoi_partial}; use bitflags::bitflags; use fish_common::{EXPAND_RESERVED_BASE, EXPAND_RESERVED_END}; +use fish_util::wcsfilecmp_glob; use fish_wcstringutil::{join_strings, trim}; use fish_widestring::char_offset; use std::mem::MaybeUninit; diff --git a/src/history/history.rs b/src/history/history.rs index f6632d108..05e700a99 100644 --- a/src/history/history.rs +++ b/src/history/history.rs @@ -61,10 +61,10 @@ path::{path_get_config, path_get_data, path_is_valid}, prelude::*, threads::assert_is_background_thread, - util::find_subslice, wildcard::{ANY_STRING, wildcard_match}, wutil::{FileId, INVALID_FILE_ID, file_id_for_file, wrealpath, wstat, wunlink}, }; +use fish_util::find_subslice; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum SearchType { diff --git a/src/lib.rs b/src/lib.rs index 478338b72..baf131743 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -73,7 +73,6 @@ pub mod trace; pub mod tty_handoff; pub mod universal_notifier; -pub mod util; pub mod wait_handle; pub mod wgetopt; pub mod wildcard; diff --git a/src/parser.rs b/src/parser.rs index a96207038..c5863a33c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -32,10 +32,10 @@ use crate::prelude::*; use crate::proc::{JobGroupRef, JobList, JobRef, Pid, ProcStatus, job_reap}; use crate::signal::{Signal, signal_check_cancel, signal_clear_cancel}; -use crate::util::get_time; use crate::wait_handle::WaitHandleStore; use crate::wutil::perror; use crate::{flog, flogf, function}; +use fish_util::get_time; use fish_widestring::WExt; use libc::c_int; use std::cell::{Ref, RefCell, RefMut};