From e12e7b6c4829c8b0559eb3a28f23116229c839b4 Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sat, 7 Mar 2026 12:36:43 -0700 Subject: [PATCH 1/7] switch out winsafe for custom tiny FFI bindings --- Cargo.lock | 397 +++++++++++++++++---- Cargo.toml | 38 +- gen-windows-bindings/Cargo.toml | 7 + gen-windows-bindings/README.md | 4 + gen-windows-bindings/src/main.rs | 14 + CHANGELOG.md => which/CHANGELOG.md | 1 + which/Cargo.lock | 272 ++++++++++++++ which/Cargo.toml | 35 ++ LICENSE.txt => which/LICENSE.txt | 0 RELEASE_STEPS.md => which/RELEASE_STEPS.md | 0 clippy.toml => which/clippy.toml | 0 deny.toml => which/deny.toml | 0 {src => which/src}/checker.rs | 0 {src => which/src}/error.rs | 0 {src => which/src}/finder.rs | 12 +- {src => which/src}/helper.rs | 0 {src => which/src}/lib.rs | 2 + {src => which/src}/sys.rs | 20 +- which/src/win_ffi.rs | 15 + {tests => which/tests}/basic.rs | 12 +- 20 files changed, 724 insertions(+), 105 deletions(-) create mode 100644 gen-windows-bindings/Cargo.toml create mode 100644 gen-windows-bindings/README.md create mode 100644 gen-windows-bindings/src/main.rs rename CHANGELOG.md => which/CHANGELOG.md (95%) create mode 100644 which/Cargo.lock create mode 100644 which/Cargo.toml rename LICENSE.txt => which/LICENSE.txt (100%) rename RELEASE_STEPS.md => which/RELEASE_STEPS.md (100%) rename clippy.toml => which/clippy.toml (100%) rename deny.toml => which/deny.toml (100%) rename {src => which/src}/checker.rs (100%) rename {src => which/src}/error.rs (100%) rename {src => which/src}/finder.rs (95%) rename {src => which/src}/helper.rs (100%) rename {src => which/src}/lib.rs (99%) rename {src => which/src}/sys.rs (94%) create mode 100644 which/src/win_ffi.rs rename {tests => which/tests}/basic.rs (99%) diff --git a/Cargo.lock b/Cargo.lock index 57bc227..3dfae67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + [[package]] name = "bitflags" version = "2.11.0" @@ -23,6 +29,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "errno" version = "0.3.14" @@ -39,18 +51,83 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "gen-windows-bindings" +version = "0.1.0" +dependencies = [ + "windows-bindgen", +] + [[package]] name = "getrandom" -version = "0.3.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", "r-efi", "wasip2", + "wasip3", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", ] +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.182" @@ -63,6 +140,12 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + [[package]] name = "memchr" version = "2.8.0" @@ -81,11 +164,39 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + [[package]] name = "r-efi" -version = "5.3.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "regex" @@ -129,11 +240,71 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[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 = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tempfile" -version = "3.25.0" +version = "3.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" dependencies = [ "fastrand", "getrandom", @@ -158,13 +329,68 @@ version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen 0.46.0", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ - "wit-bindgen", + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", ] [[package]] @@ -175,9 +401,26 @@ dependencies = [ "rustix", "tempfile", "tracing", - "winsafe", + "windows-link 0.2.1", ] +[[package]] +name = "windows-bindgen" +version = "0.62.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b541b67bb66a43de06888703b15519e40b3fc9b65917dc1ccd71aecfd7c5703" +dependencies = [ + "serde", + "serde_json", + "windows-threading", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" @@ -186,86 +429,118 @@ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" -version = "0.60.2" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets", + "windows-link 0.2.1", ] [[package]] -name = "windows-targets" -version = "0.53.5" +name = "windows-threading" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link", - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-link 0.1.3", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] [[package]] -name = "windows_i686_msvc" -version = "0.53.1" +name = "wit-bindgen-core" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" +name = "wit-bindgen-rust" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" +name = "wit-bindgen-rust-macro" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "wit-component" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] [[package]] -name = "winsafe" -version = "0.0.19" +name = "wit-parser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] -name = "wit-bindgen" -version = "0.51.0" +name = "zmij" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index c4c5131..231b3e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,35 +1,3 @@ -[package] -name = "which" -version = "9.0.0" -edition = "2021" -rust-version = "1.85" -authors = ["Harry Fei , Jacob Kiesel "] -repository = "https://github.com/harryfei/which-rs.git" -documentation = "https://docs.rs/which/" -license = "MIT" -description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms." -readme = "README.md" -categories = ["os", "filesystem"] -keywords = ["which", "which-rs", "unix", "command"] - -[features] -default = ["real-sys"] -regex = ["dep:regex"] -tracing = ["dep:tracing"] -real-sys = ["dep:rustix", "dep:winsafe"] - -[dependencies] -regex = { version = "1.10.2", optional = true } -tracing = { version = "0.1.40", default-features = false, optional = true } - -[target.'cfg(any(unix, target_os = "wasi", target_os = "redox"))'.dependencies] -rustix = { version = "1.0.5", default-features = false, features = ["fs", "std"], optional = true } - -[target.'cfg(windows)'.dependencies] -winsafe = { version = "0.0.19", features = ["kernel"], optional = true } - -[dev-dependencies] -tempfile = "3.9.0" - -[package.metadata.docs.rs] -all-features = true +[workspace] +members = ["which", "gen-windows-bindings"] +resolver = "3" \ No newline at end of file diff --git a/gen-windows-bindings/Cargo.toml b/gen-windows-bindings/Cargo.toml new file mode 100644 index 0000000..f3b7b27 --- /dev/null +++ b/gen-windows-bindings/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "gen-windows-bindings" +version = "0.1.0" +edition = "2024" + +[dependencies] +windows-bindgen = "0.62" diff --git a/gen-windows-bindings/README.md b/gen-windows-bindings/README.md new file mode 100644 index 0000000..697a935 --- /dev/null +++ b/gen-windows-bindings/README.md @@ -0,0 +1,4 @@ +# gen-windows-bindings + +This binary is used for generating bindings to Windows APIs. It is not intended for distribution. +The bindings output by this are committed to the repo. \ No newline at end of file diff --git a/gen-windows-bindings/src/main.rs b/gen-windows-bindings/src/main.rs new file mode 100644 index 0000000..8b95928 --- /dev/null +++ b/gen-windows-bindings/src/main.rs @@ -0,0 +1,14 @@ +fn main() { + windows_bindgen::bindgen([ + "--out", + concat!(env!("CARGO_MANIFEST_DIR"), "/../which/src/win_ffi.rs"), + "--flat", + "--sys", + "--no-deps", + "--filter", + "Windows.Win32.Storage.FileSystem.GetBinaryTypeW", + "--filter", + "Windows.Win32.Foundation.GetLastError", + ]) + .unwrap(); +} diff --git a/CHANGELOG.md b/which/CHANGELOG.md similarity index 95% rename from CHANGELOG.md rename to which/CHANGELOG.md index 98599f1..1d048d8 100644 --- a/CHANGELOG.md +++ b/which/CHANGELOG.md @@ -5,6 +5,7 @@ - MSRV bumped to Rust 1.85.0 - Dependency on `home_env` removed, the implementation found in rust 1.85.0 for a home directory has been fixed. Thanks, [@madsmtm],(https://github.com/madsmtm) for this contribution to which! +- Dependency on `winsafe` swapped out for generated bindings to the two Windows functions that we actually need. ## 8.0.1 diff --git a/which/Cargo.lock b/which/Cargo.lock new file mode 100644 index 0000000..d71b0f0 --- /dev/null +++ b/which/Cargo.lock @@ -0,0 +1,272 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "tempfile" +version = "3.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "which" +version = "9.0.0" +dependencies = [ + "regex", + "rustix", + "tempfile", + "tracing", + "windows-link", + "winsafe", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" diff --git a/which/Cargo.toml b/which/Cargo.toml new file mode 100644 index 0000000..857e5dd --- /dev/null +++ b/which/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "which" +version = "9.0.0" +edition = "2024" +rust-version = "1.85" +authors = ["Harry Fei , Jacob Kiesel "] +repository = "https://github.com/harryfei/which-rs.git" +documentation = "https://docs.rs/which/" +license = "MIT" +description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms." +readme = "../README.md" +categories = ["os", "filesystem"] +keywords = ["which", "which-rs", "unix", "command"] + +[features] +default = ["real-sys"] +regex = ["dep:regex"] +tracing = ["dep:tracing"] +real-sys = ["dep:rustix", "dep:windows-link"] + +[dependencies] +regex = { version = "1.10.2", optional = true } +tracing = { version = "0.1.40", default-features = false, optional = true } + +[target.'cfg(any(unix, target_os = "wasi", target_os = "redox"))'.dependencies] +rustix = { version = "1.0.5", default-features = false, features = ["fs", "std"], optional = true } + +[target.'cfg(windows)'.dependencies] +windows-link= { version = "0.2", optional = true } + +[dev-dependencies] +tempfile = "3.9.0" + +[package.metadata.docs.rs] +all-features = true diff --git a/LICENSE.txt b/which/LICENSE.txt similarity index 100% rename from LICENSE.txt rename to which/LICENSE.txt diff --git a/RELEASE_STEPS.md b/which/RELEASE_STEPS.md similarity index 100% rename from RELEASE_STEPS.md rename to which/RELEASE_STEPS.md diff --git a/clippy.toml b/which/clippy.toml similarity index 100% rename from clippy.toml rename to which/clippy.toml diff --git a/deny.toml b/which/deny.toml similarity index 100% rename from deny.toml rename to which/deny.toml diff --git a/src/checker.rs b/which/src/checker.rs similarity index 100% rename from src/checker.rs rename to which/src/checker.rs diff --git a/src/error.rs b/which/src/error.rs similarity index 100% rename from src/error.rs rename to which/src/error.rs diff --git a/src/finder.rs b/which/src/finder.rs similarity index 95% rename from src/finder.rs rename to which/src/finder.rs index 9b25e54..3a34261 100644 --- a/src/finder.rs +++ b/which/src/finder.rs @@ -2,7 +2,7 @@ use crate::checker::is_valid; use crate::helper::has_executable_extension; use crate::sys::Sys; use crate::sys::SysReadDirEntry; -use crate::{error::*, NonFatalErrorHandler}; +use crate::{NonFatalErrorHandler, error::*}; #[cfg(feature = "regex")] use regex::Regex; #[cfg(feature = "regex")] @@ -82,7 +82,10 @@ impl Finder { } _ => { #[cfg(feature = "tracing")] - tracing::trace!("{} has no path seperators, so only paths in PATH environment variable will be searched.", path.display()); + tracing::trace!( + "{} has no path seperators, so only paths in PATH environment variable will be searched.", + path.display() + ); // Search binary in PATHs(defined in environment variable). let paths = paths.ok_or(Error::CannotGetCurrentDirAndPathListEmpty)?; let paths = self.sys.env_split_paths(paths.as_ref()); @@ -346,7 +349,10 @@ impl, F: NonFatalErrorHandler> Iterator } } else { #[cfg(feature = "tracing")] - tracing::debug!("regex unable to evaluate filename as it's not valid unicode. Lossy filename conversion: {}", path.file_name().to_string_lossy()); + tracing::debug!( + "regex unable to evaluate filename as it's not valid unicode. Lossy filename conversion: {}", + path.file_name().to_string_lossy() + ); } } Some(Err(e)) => { diff --git a/src/helper.rs b/which/src/helper.rs similarity index 100% rename from src/helper.rs rename to which/src/helper.rs diff --git a/src/lib.rs b/which/src/lib.rs similarity index 99% rename from src/lib.rs rename to which/src/lib.rs index 3a975da..e3af417 100644 --- a/src/lib.rs +++ b/which/src/lib.rs @@ -21,6 +21,8 @@ mod error; mod finder; mod helper; pub mod sys; +#[cfg(all(windows, feature = "real-sys"))] +mod win_ffi; use std::fmt; use std::path; diff --git a/src/sys.rs b/which/src/sys.rs similarity index 94% rename from src/sys.rs rename to which/src/sys.rs index 53795e0..986e9ee 100644 --- a/src/sys.rs +++ b/which/src/sys.rs @@ -210,9 +210,23 @@ impl Sys for RealSys { #[cfg(windows)] fn is_valid_executable(&self, path: &Path) -> io::Result { - winsafe::GetBinaryType(&path.display().to_string()) - .map(|_| true) - .map_err(|e| io::Error::from_raw_os_error(e.raw() as i32)) + use std::os::windows::ffi::OsStrExt; + + use crate::win_ffi; + let w_str: Vec = path + .as_os_str() + .encode_wide() + .chain(std::iter::once(0)) + .collect(); + let mut binary_type = 0u32; + unsafe { + let success = win_ffi::GetBinaryTypeW(w_str.as_ptr(), &mut binary_type); + if success != 0 { + Ok(true) + } else { + Err(io::Error::from_raw_os_error(win_ffi::GetLastError() as i32)) + } + } } } diff --git a/which/src/win_ffi.rs b/which/src/win_ffi.rs new file mode 100644 index 0000000..d8594de --- /dev/null +++ b/which/src/win_ffi.rs @@ -0,0 +1,15 @@ +// Bindings generated by `windows-bindgen` 0.62.1 + +#![allow( + non_snake_case, + non_upper_case_globals, + non_camel_case_types, + dead_code, + clippy::all +)] + +windows_link::link!("kernel32.dll" "system" fn GetBinaryTypeW(lpapplicationname : PCWSTR, lpbinarytype : *mut u32) -> BOOL); +windows_link::link!("kernel32.dll" "system" fn GetLastError() -> WIN32_ERROR); +pub type BOOL = i32; +pub type PCWSTR = *const u16; +pub type WIN32_ERROR = u32; diff --git a/tests/basic.rs b/which/tests/basic.rs similarity index 99% rename from tests/basic.rs rename to which/tests/basic.rs index d14dcac..3555bdd 100644 --- a/tests/basic.rs +++ b/which/tests/basic.rs @@ -175,12 +175,18 @@ mod real_sys { fn test_which_tilde() { let old_home = env::var_os("HOME"); let f = TestFixture::new_with_tilde_path(); - env::set_var("HOME", f.tempdir.path().as_os_str()); + unsafe { + env::set_var("HOME", f.tempdir.path().as_os_str()); + } assert_eq!(_which(&f, BIN_NAME).unwrap(), f.bins[0]); if let Some(old_home) = old_home { - env::set_var("HOME", old_home); + unsafe { + env::set_var("HOME", old_home); + } } else { - env::remove_var("HOME"); + unsafe { + env::remove_var("HOME"); + } } } From 54730c6120c8b0e5a53f202553eac1540ed0ccd9 Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sat, 7 Mar 2026 13:01:58 -0700 Subject: [PATCH 2/7] allow deps which specify dual licensing --- which/deny.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/which/deny.toml b/which/deny.toml index 7fccced..b7e43cd 100644 --- a/which/deny.toml +++ b/which/deny.toml @@ -91,6 +91,7 @@ ignore = [ allow = [ "MIT", "Apache-2.0", + "MIT OR Apache-2.0", ] # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the From 378bd2eac4b10f68a8bfd66d92bde031fa6730fa Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sat, 7 Mar 2026 13:04:25 -0700 Subject: [PATCH 3/7] move deny.toml to correct location --- which/deny.toml => deny.toml | 1 - 1 file changed, 1 deletion(-) rename which/deny.toml => deny.toml (99%) diff --git a/which/deny.toml b/deny.toml similarity index 99% rename from which/deny.toml rename to deny.toml index b7e43cd..7fccced 100644 --- a/which/deny.toml +++ b/deny.toml @@ -91,7 +91,6 @@ ignore = [ allow = [ "MIT", "Apache-2.0", - "MIT OR Apache-2.0", ] # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the From 571b3f8477bcb3356ff6fcf76794f37a8e469261 Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sat, 7 Mar 2026 13:07:50 -0700 Subject: [PATCH 4/7] allow unicode-3.0 license --- deny.toml | 1 + gen-windows-bindings/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/deny.toml b/deny.toml index 7fccced..f872b18 100644 --- a/deny.toml +++ b/deny.toml @@ -91,6 +91,7 @@ ignore = [ allow = [ "MIT", "Apache-2.0", + "Unicode-3.0", ] # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the diff --git a/gen-windows-bindings/Cargo.toml b/gen-windows-bindings/Cargo.toml index f3b7b27..958bd17 100644 --- a/gen-windows-bindings/Cargo.toml +++ b/gen-windows-bindings/Cargo.toml @@ -2,6 +2,7 @@ name = "gen-windows-bindings" version = "0.1.0" edition = "2024" +license = "MIT" [dependencies] windows-bindgen = "0.62" From 61c16566cbce8d3d69b88bb7ebc5e30a00f124c3 Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sun, 8 Mar 2026 11:43:47 -0600 Subject: [PATCH 5/7] switch to zero dependency Windows implementation --- .github/workflows/rust.yml | 2 +- which/CHANGELOG.md => CHANGELOG.md | 0 Cargo.lock | 394 +++------------------ Cargo.toml | 35 +- which/LICENSE.txt => LICENSE.txt | 0 which/RELEASE_STEPS.md => RELEASE_STEPS.md | 0 which/clippy.toml => clippy.toml | 0 gen-windows-bindings/Cargo.toml | 8 - gen-windows-bindings/README.md | 4 - gen-windows-bindings/src/main.rs | 14 - {which/src => src}/checker.rs | 0 {which/src => src}/error.rs | 0 {which/src => src}/finder.rs | 2 +- {which/src => src}/helper.rs | 0 {which/src => src}/lib.rs | 0 {which/src => src}/sys.rs | 0 src/win_ffi.rs | 18 + {which/tests => tests}/basic.rs | 14 +- which/Cargo.lock | 272 -------------- which/Cargo.toml | 35 -- which/src/win_ffi.rs | 15 - 21 files changed, 112 insertions(+), 701 deletions(-) rename which/CHANGELOG.md => CHANGELOG.md (100%) rename which/LICENSE.txt => LICENSE.txt (100%) rename which/RELEASE_STEPS.md => RELEASE_STEPS.md (100%) rename which/clippy.toml => clippy.toml (100%) delete mode 100644 gen-windows-bindings/Cargo.toml delete mode 100644 gen-windows-bindings/README.md delete mode 100644 gen-windows-bindings/src/main.rs rename {which/src => src}/checker.rs (100%) rename {which/src => src}/error.rs (100%) rename {which/src => src}/finder.rs (99%) rename {which/src => src}/helper.rs (100%) rename {which/src => src}/lib.rs (100%) rename {which/src => src}/sys.rs (100%) create mode 100644 src/win_ffi.rs rename {which/tests => tests}/basic.rs (98%) delete mode 100644 which/Cargo.lock delete mode 100644 which/Cargo.toml delete mode 100644 which/src/win_ffi.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 60921de..a14d04b 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -81,7 +81,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - rust: ['1.85', stable, nightly] + rust: ['1.70', stable, nightly] steps: - name: Setup | Checkout uses: actions/checkout@v4 diff --git a/which/CHANGELOG.md b/CHANGELOG.md similarity index 100% rename from which/CHANGELOG.md rename to CHANGELOG.md diff --git a/Cargo.lock b/Cargo.lock index 3dfae67..2f06bd2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 [[package]] name = "aho-corasick" @@ -11,12 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - [[package]] name = "bitflags" version = "2.11.0" @@ -29,12 +23,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - [[package]] name = "errno" version = "0.3.14" @@ -51,83 +39,18 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "gen-windows-bindings" -version = "0.1.0" -dependencies = [ - "windows-bindgen", -] - [[package]] name = "getrandom" -version = "0.4.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", "wasip2", - "wasip3", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "itoa" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" version = "0.2.182" @@ -140,12 +63,6 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - [[package]] name = "memchr" version = "2.8.0" @@ -164,39 +81,11 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" -dependencies = [ - "proc-macro2", -] - [[package]] name = "r-efi" -version = "6.0.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "regex" @@ -240,71 +129,11 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[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 = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "tempfile" -version = "3.26.0" +version = "3.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ "fastrand", "getrandom", @@ -329,98 +158,25 @@ version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen 0.46.0", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap", - "semver", + "wit-bindgen", ] [[package]] name = "which" -version = "9.0.0" +version = "8.0.2" dependencies = [ "regex", "rustix", "tempfile", "tracing", - "windows-link 0.2.1", -] - -[[package]] -name = "windows-bindgen" -version = "0.62.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b541b67bb66a43de06888703b15519e40b3fc9b65917dc1ccd71aecfd7c5703" -dependencies = [ - "serde", - "serde_json", - "windows-threading", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" @@ -429,118 +185,80 @@ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" -version = "0.61.2" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-link 0.2.1", + "windows-targets", ] [[package]] -name = "windows-threading" -version = "0.1.0" +name = "windows-targets" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] -name = "wit-bindgen" -version = "0.46.0" +name = "windows_aarch64_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] -name = "wit-bindgen" -version = "0.51.0" +name = "windows_aarch64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] -name = "wit-bindgen-core" -version = "0.51.0" +name = "windows_i686_gnu" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] -name = "wit-bindgen-rust" -version = "0.51.0" +name = "windows_i686_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" +name = "windows_i686_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] -name = "wit-component" -version = "0.244.0" +name = "windows_x86_64_gnu" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] -name = "wit-parser" -version = "0.244.0" +name = "windows_x86_64_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] -name = "zmij" -version = "1.0.21" +name = "windows_x86_64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" diff --git a/Cargo.toml b/Cargo.toml index 231b3e9..4bfeac5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,32 @@ -[workspace] -members = ["which", "gen-windows-bindings"] -resolver = "3" \ No newline at end of file +[package] +name = "which" +version = "8.0.2" +edition = "2021" +rust-version = "1.70" +authors = ["Harry Fei , Jacob Kiesel "] +repository = "https://github.com/harryfei/which-rs.git" +documentation = "https://docs.rs/which/" +license = "MIT" +description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms." +readme = "../README.md" +categories = ["os", "filesystem"] +keywords = ["which", "which-rs", "unix", "command"] + +[features] +default = ["real-sys"] +regex = ["dep:regex"] +tracing = ["dep:tracing"] +real-sys = ["dep:rustix"] + +[dependencies] +regex = { version = "1.10.2", optional = true } +tracing = { version = "0.1.40", default-features = false, optional = true } + +[target.'cfg(any(unix, target_os = "wasi", target_os = "redox"))'.dependencies] +rustix = { version = "1.0.5", default-features = false, features = ["fs", "std"], optional = true } + +[dev-dependencies] +tempfile = "3.9.0" + +[package.metadata.docs.rs] +all-features = true diff --git a/which/LICENSE.txt b/LICENSE.txt similarity index 100% rename from which/LICENSE.txt rename to LICENSE.txt diff --git a/which/RELEASE_STEPS.md b/RELEASE_STEPS.md similarity index 100% rename from which/RELEASE_STEPS.md rename to RELEASE_STEPS.md diff --git a/which/clippy.toml b/clippy.toml similarity index 100% rename from which/clippy.toml rename to clippy.toml diff --git a/gen-windows-bindings/Cargo.toml b/gen-windows-bindings/Cargo.toml deleted file mode 100644 index 958bd17..0000000 --- a/gen-windows-bindings/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "gen-windows-bindings" -version = "0.1.0" -edition = "2024" -license = "MIT" - -[dependencies] -windows-bindgen = "0.62" diff --git a/gen-windows-bindings/README.md b/gen-windows-bindings/README.md deleted file mode 100644 index 697a935..0000000 --- a/gen-windows-bindings/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# gen-windows-bindings - -This binary is used for generating bindings to Windows APIs. It is not intended for distribution. -The bindings output by this are committed to the repo. \ No newline at end of file diff --git a/gen-windows-bindings/src/main.rs b/gen-windows-bindings/src/main.rs deleted file mode 100644 index 8b95928..0000000 --- a/gen-windows-bindings/src/main.rs +++ /dev/null @@ -1,14 +0,0 @@ -fn main() { - windows_bindgen::bindgen([ - "--out", - concat!(env!("CARGO_MANIFEST_DIR"), "/../which/src/win_ffi.rs"), - "--flat", - "--sys", - "--no-deps", - "--filter", - "Windows.Win32.Storage.FileSystem.GetBinaryTypeW", - "--filter", - "Windows.Win32.Foundation.GetLastError", - ]) - .unwrap(); -} diff --git a/which/src/checker.rs b/src/checker.rs similarity index 100% rename from which/src/checker.rs rename to src/checker.rs diff --git a/which/src/error.rs b/src/error.rs similarity index 100% rename from which/src/error.rs rename to src/error.rs diff --git a/which/src/finder.rs b/src/finder.rs similarity index 99% rename from which/src/finder.rs rename to src/finder.rs index 3a34261..49bb7ef 100644 --- a/which/src/finder.rs +++ b/src/finder.rs @@ -2,7 +2,7 @@ use crate::checker::is_valid; use crate::helper::has_executable_extension; use crate::sys::Sys; use crate::sys::SysReadDirEntry; -use crate::{NonFatalErrorHandler, error::*}; +use crate::{error::*, NonFatalErrorHandler}; #[cfg(feature = "regex")] use regex::Regex; #[cfg(feature = "regex")] diff --git a/which/src/helper.rs b/src/helper.rs similarity index 100% rename from which/src/helper.rs rename to src/helper.rs diff --git a/which/src/lib.rs b/src/lib.rs similarity index 100% rename from which/src/lib.rs rename to src/lib.rs diff --git a/which/src/sys.rs b/src/sys.rs similarity index 100% rename from which/src/sys.rs rename to src/sys.rs diff --git a/src/win_ffi.rs b/src/win_ffi.rs new file mode 100644 index 0000000..fc0a65f --- /dev/null +++ b/src/win_ffi.rs @@ -0,0 +1,18 @@ +#[cfg(all(windows, target_arch = "x86"))] +#[link( + name = "kernel32.dll", + kind = "raw-dylib", + modifiers = "+verbatim", + import_name_type = "undecorated" +)] +extern "system" { + pub fn GetBinaryTypeW(app_name: *const u16, bin_type: *mut u32) -> i32; + pub fn GetLastError() -> u32; +} + +#[cfg(all(windows, not(target_arch = "x86")))] +#[link(name = "kernel32.dll", kind = "raw-dylib", modifiers = "+verbatim")] +extern "system" { + pub fn GetBinaryTypeW(app_name: *const u16, bin_type: *mut u32) -> i32; + pub fn GetLastError() -> u32; +} diff --git a/which/tests/basic.rs b/tests/basic.rs similarity index 98% rename from which/tests/basic.rs rename to tests/basic.rs index 3555bdd..3e82c73 100644 --- a/which/tests/basic.rs +++ b/tests/basic.rs @@ -175,18 +175,12 @@ mod real_sys { fn test_which_tilde() { let old_home = env::var_os("HOME"); let f = TestFixture::new_with_tilde_path(); - unsafe { - env::set_var("HOME", f.tempdir.path().as_os_str()); - } + env::set_var("HOME", f.tempdir.path().as_os_str()); assert_eq!(_which(&f, BIN_NAME).unwrap(), f.bins[0]); if let Some(old_home) = old_home { - unsafe { - env::set_var("HOME", old_home); - } + env::set_var("HOME", old_home); } else { - unsafe { - env::remove_var("HOME"); - } + env::remove_var("HOME"); } } @@ -841,7 +835,7 @@ mod in_memory { Ok(Box::new(entries.into_iter())) } // should use ErrorKind::NotADirectory once upgrading rust version - _ => Err(Error::other("Not a directory")), + _ => Err(Error::new(ErrorKind::Other, "Not a directory")), } } diff --git a/which/Cargo.lock b/which/Cargo.lock deleted file mode 100644 index d71b0f0..0000000 --- a/which/Cargo.lock +++ /dev/null @@ -1,272 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "bitflags" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "libc" -version = "0.2.182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "tempfile" -version = "3.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" -dependencies = [ - "fastrand", - "getrandom", - "once_cell", - "rustix", - "windows-sys", -] - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" - -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "which" -version = "9.0.0" -dependencies = [ - "regex", - "rustix", - "tempfile", - "tracing", - "windows-link", - "winsafe", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" diff --git a/which/Cargo.toml b/which/Cargo.toml deleted file mode 100644 index 857e5dd..0000000 --- a/which/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -name = "which" -version = "9.0.0" -edition = "2024" -rust-version = "1.85" -authors = ["Harry Fei , Jacob Kiesel "] -repository = "https://github.com/harryfei/which-rs.git" -documentation = "https://docs.rs/which/" -license = "MIT" -description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms." -readme = "../README.md" -categories = ["os", "filesystem"] -keywords = ["which", "which-rs", "unix", "command"] - -[features] -default = ["real-sys"] -regex = ["dep:regex"] -tracing = ["dep:tracing"] -real-sys = ["dep:rustix", "dep:windows-link"] - -[dependencies] -regex = { version = "1.10.2", optional = true } -tracing = { version = "0.1.40", default-features = false, optional = true } - -[target.'cfg(any(unix, target_os = "wasi", target_os = "redox"))'.dependencies] -rustix = { version = "1.0.5", default-features = false, features = ["fs", "std"], optional = true } - -[target.'cfg(windows)'.dependencies] -windows-link= { version = "0.2", optional = true } - -[dev-dependencies] -tempfile = "3.9.0" - -[package.metadata.docs.rs] -all-features = true diff --git a/which/src/win_ffi.rs b/which/src/win_ffi.rs deleted file mode 100644 index d8594de..0000000 --- a/which/src/win_ffi.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Bindings generated by `windows-bindgen` 0.62.1 - -#![allow( - non_snake_case, - non_upper_case_globals, - non_camel_case_types, - dead_code, - clippy::all -)] - -windows_link::link!("kernel32.dll" "system" fn GetBinaryTypeW(lpapplicationname : PCWSTR, lpbinarytype : *mut u32) -> BOOL); -windows_link::link!("kernel32.dll" "system" fn GetLastError() -> WIN32_ERROR); -pub type BOOL = i32; -pub type PCWSTR = *const u16; -pub type WIN32_ERROR = u32; From 0ab15529099f32cd5a8fdd836a81706e9cbf2fd5 Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sun, 8 Mar 2026 12:00:13 -0600 Subject: [PATCH 6/7] couple doc fixes --- CHANGELOG.md | 5 ++--- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d048d8..24eb522 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,10 @@ # CHANGELOG -## 9.0.0 +## 8.0.2 -- MSRV bumped to Rust 1.85.0 - Dependency on `home_env` removed, the implementation found in rust 1.85.0 for a home directory has been fixed. Thanks, [@madsmtm],(https://github.com/madsmtm) for this contribution to which! -- Dependency on `winsafe` swapped out for generated bindings to the two Windows functions that we actually need. +- Dependency on `winsafe` removed, code for Windows API is now handwritten. ## 8.0.1 diff --git a/Cargo.toml b/Cargo.toml index 4bfeac5..f42c772 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/harryfei/which-rs.git" documentation = "https://docs.rs/which/" license = "MIT" description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms." -readme = "../README.md" +readme = "README.md" categories = ["os", "filesystem"] keywords = ["which", "which-rs", "unix", "command"] From 53f34202ef67fbd040c07ebaa3f1416809f91fda Mon Sep 17 00:00:00 2001 From: Jacob Kiesel Date: Sun, 8 Mar 2026 12:02:10 -0600 Subject: [PATCH 7/7] no need to permit unicode 3.0 license --- deny.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/deny.toml b/deny.toml index f872b18..7fccced 100644 --- a/deny.toml +++ b/deny.toml @@ -91,7 +91,6 @@ ignore = [ allow = [ "MIT", "Apache-2.0", - "Unicode-3.0", ] # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the