diff --git a/Cargo.lock b/Cargo.lock index 273aca84a..123cba5cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -29,6 +38,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "cc" version = "1.2.41" @@ -82,6 +101,27 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -212,6 +252,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -224,6 +275,19 @@ dependencies = [ "wasip2", ] +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + [[package]] name = "hashbrown" version = "0.15.5" @@ -241,7 +305,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom", + "getrandom 0.3.4", "libc", ] @@ -251,6 +315,16 @@ version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags", + "libc", +] + [[package]] name = "lock_api" version = "0.4.14" @@ -340,6 +414,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "parking_lot" version = "0.12.5" @@ -525,6 +605,34 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + [[package]] name = "rsconf" version = "0.2.2" @@ -554,6 +662,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", + "shellexpand", "syn", "walkdir", ] @@ -564,6 +673,7 @@ version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21fcbee55c2458836bcdbfffb6ec9ba74bbc23ca7aa6816015a3dd2c4d8fc185" dependencies = [ + "globset", "sha2", "walkdir", ] @@ -598,6 +708,35 @@ version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serial_test" version = "3.2.0" @@ -632,6 +771,15 @@ dependencies = [ "digest", ] +[[package]] +name = "shellexpand" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" @@ -673,6 +821,26 @@ dependencies = [ "phf_codegen 0.11.3", ] +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "typenum" version = "1.19.0" @@ -728,6 +896,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" diff --git a/Cargo.toml b/Cargo.toml index c71776967..1edaee3eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,12 @@ proc-macro2 = "1.0" # minimum supported version to 10.12. rand = { version = "0.8.5", default-features = false, features = ["small_rng"] } rsconf = "0.2.2" -rust-embed = { version = "8.7.2", features = ["deterministic-timestamps"] } +rust-embed = { version = "8.7.2", features = [ + "deterministic-timestamps", + "include-exclude", + "interpolate-folder-path", +] } + serial_test = { version = "3", default-features = false } # We need 0.9.0 specifically for some crash fixes. terminfo = "0.9.0" @@ -102,10 +107,14 @@ portable-atomic.workspace = true rust-embed = { workspace = true, optional = true, features = [ "deterministic-timestamps", "debug-embed", + "include-exclude", + "interpolate-folder-path", ] } [target.'cfg(not(windows))'.dependencies] rust-embed = { workspace = true, optional = true, features = [ "deterministic-timestamps", + "include-exclude", + "interpolate-folder-path", ] } [dev-dependencies] diff --git a/share/config.fish b/share/config.fish index 215a2dc33..50500aa86 100644 --- a/share/config.fish +++ b/share/config.fish @@ -35,7 +35,10 @@ end set -l __extra_completionsdir set -l __extra_functionsdir set -l __extra_confdir -if path is -f -- $__fish_data_dir/__fish_build_paths.fish +# N.B. can't load __fish_data_with_file this early in non-embedded builds, so reimplement it. +if status get-file __fish_build_paths.fish &>/dev/null + status get-file __fish_build_paths.fish | source +else if path is -f -- $__fish_data_dir/__fish_build_paths.fish source $__fish_data_dir/__fish_build_paths.fish end diff --git a/src/autoload.rs b/src/autoload.rs index a9eb84899..d363fabd9 100644 --- a/src/autoload.rs +++ b/src/autoload.rs @@ -42,7 +42,8 @@ pub struct Autoload { #[cfg(feature = "embed-data")] #[derive(RustEmbed)] -#[folder = "share/"] +#[folder = "share"] +#[exclude = "__fish_build_paths.fish.in"] pub struct Asset; cfg_if!( diff --git a/src/builtins/status.rs b/src/builtins/status.rs index 54eb7e6dc..82bfeabdf 100644 --- a/src/builtins/status.rs +++ b/src/builtins/status.rs @@ -337,6 +337,12 @@ fn parse_cmd_opts( #[prefix = "man/man1/"] struct Docs; +#[cfg(all(using_cmake, feature = "embed-data"))] +#[derive(RustEmbed)] +#[folder = "$FISH_CMAKE_BINARY_DIR/share"] +#[include = "__fish_build_paths.fish"] +struct CMakeBinaryDir; + pub fn status(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr]) -> BuiltinResult { localizable_consts!( #[allow(dead_code)] @@ -481,7 +487,16 @@ pub fn status(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr]) -> B } else { let arg = crate::common::wcs2bytes(args[0]); let arg = std::str::from_utf8(&arg).unwrap(); - let Some(emfile) = crate::autoload::Asset::get(arg).or_else(|| Docs::get(arg)) + cfg_if!( + if #[cfg(using_cmake)] { + let emfile = CMakeBinaryDir::get(arg); + } else { + let emfile = None; + } + ); + let Some(emfile) = emfile + .or_else(|| crate::autoload::Asset::get(arg)) + .or_else(|| Docs::get(arg)) else { return Err(STATUS_CMD_ERROR); }; @@ -515,7 +530,10 @@ pub fn status(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr]) -> B let mut paths = vec![]; let arg = crate::common::wcs2bytes(args.first().unwrap_or(&L!(""))); let arg = std::str::from_utf8(&arg).unwrap(); - for path in crate::autoload::Asset::iter().chain(Docs::iter()) { + let embedded_files = crate::autoload::Asset::iter().chain(Docs::iter()); + #[cfg(using_cmake)] + let embedded_files = embedded_files.chain(CMakeBinaryDir::iter()); + for path in embedded_files { if arg.is_empty() || path.starts_with(arg) { paths.push(bytes2wcstring(path.as_bytes())); }