From 80f6128c09ce809b4e04d368a056a347cb0f5583 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Thu, 07 May 2026 23:11:27 +0000 Subject: [PATCH] feat(jrb): use native-tls on apple/windows-mingw Otherwise it is has some quirks. Also allows downstreams to have different features for rustls if not building with jrb. --- --- a/Cargo.lock +++ b/Cargo.lock @@ -831,6 +831,21 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] name = "form_urlencoded" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1356,7 +1371,7 @@ checksum = "39eb0623e15e4cb83c02ce6a959e48fadd1ae3b715b36b5acc01816e01388c82" dependencies = [ "bstr", - "hashbrown 0.16.1", + "hashbrown 0.15.5", ] [[package]] @@ -2125,6 +2140,22 @@ ] [[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] name = "hyper-util" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2934,6 +2965,23 @@ ] [[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] name = "nix" version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3017,12 +3065,50 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] +name = "openssl" +version = "0.10.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38c4372413cdaaf3cc79dd92d29d7d9f5ab09b51b10dded508fb90bb70b9222" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "openssl-probe" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] +name = "openssl-sys" +version = "0.9.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ce1245cd07fcc4cfdb438f7507b0c7e4f3849a69fd84d52374c66d83741bb6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3131,6 +3217,12 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3470,10 +3562,12 @@ "http-body-util", "hyper", "hyper-rustls", + "hyper-tls", "hyper-util", "js-sys", "log", "mime", + "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -3482,6 +3576,7 @@ "rustls-platform-verifier", "sync_wrapper", "tokio", + "tokio-native-tls", "tokio-rustls", "tower", "tower-http", @@ -4096,6 +4191,16 @@ ] [[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4333,6 +4438,12 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" --- a/Cargo.toml +++ b/Cargo.toml @@ -125,16 +125,12 @@ # Bundler tracing = "0.1.44" tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } -reqwest = { version = "0.13", features = [ +reqwest = { version = "0.13", default-features = false, features = [ "blocking", - "rustls", -], default-features = false } +] } zip = { version = "8", default-features = false, features = ["deflate"] } directories = "6.0.0" -gix = { version = "0.83.0", features = [ - "blocking-network-client", - "blocking-http-transport-reqwest-rust-tls", -] } +gix = { version = "0.83.0", features = ["blocking-network-client"] } camino = { version = "1.2.2", features = ["serde1"] } [workspace.lints.rust] --- a/crates/jrsonnet-pkg/Cargo.toml +++ b/crates/jrsonnet-pkg/Cargo.toml @@ -20,11 +20,21 @@ peg.workspace = true # Gix for git repos, reqwest + zip for github -gix.workspace = true -reqwest.workspace = true zip.workspace = true url.workspace = true camino.workspace = true # Global cache dir directories.workspace = true + +[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_vendor = "apple")))'.dependencies] +gix = { workspace = true, features = [ + "blocking-http-transport-reqwest-rust-tls", +] } +reqwest = { workspace = true, features = ["rustls"] } + +[target.'cfg(any(all(target_os = "windows", target_env = "gnu"), target_vendor = "apple"))'.dependencies] +gix = { workspace = true, features = [ + "blocking-http-transport-reqwest-native-tls", +] } +reqwest = { workspace = true, features = ["native-tls"] } --- a/crates/jrsonnet-pkg/src/install/github.rs +++ b/crates/jrsonnet-pkg/src/install/github.rs @@ -14,6 +14,7 @@ use super::{ Error, LocalExtraction, ResolveResult, Result, VendorSource, accessor::{AccessorEntry, ZipFileAccessor}, + make_symlink, }; use crate::{ install::{PKG_USER_AGENT, cache_dir}, @@ -84,24 +85,6 @@ Ok(ZipFileAccessor::new_prefixed( File::open(zip_path).map_err(|e| Error::Io(zip_path.to_owned(), e))?, )?) -} - -#[cfg(unix)] -fn make_symlink(target: &str, link: &Path) -> std::io::Result<()> { - std::os::unix::fs::symlink(target, link) -} - -#[cfg(windows)] -fn make_symlink(target: &str, link: &Path) -> std::io::Result<()> { - std::os::windows::fs::symlink_file(target, link) -} - -#[cfg(not(any(unix, windows)))] -fn make_symlink(_target: &str, _link: &Path) -> std::io::Result<()> { - Err(std::io::Error::new( - std::io::ErrorKind::Unsupported, - "symlinks are not supported on this platform", - )) } fn extract_subdir(archive: &ZipFileAccessor, subdir: &SubDir, dest: &Path) -> Result<()> { --- a/crates/jrsonnet-pkg/src/install/mod.rs +++ b/crates/jrsonnet-pkg/src/install/mod.rs @@ -120,6 +120,24 @@ Ok(plan) } +#[cfg(unix)] +fn make_symlink(target: &str, link: &Path) -> std::io::Result<()> { + std::os::unix::fs::symlink(target, link) +} + +#[cfg(windows)] +fn make_symlink(target: &str, link: &Path) -> std::io::Result<()> { + std::os::windows::fs::symlink_dir(target, link) +} + +#[cfg(not(any(unix, windows)))] +fn make_symlink(_target: &str, _link: &Path) -> std::io::Result<()> { + Err(std::io::Error::new( + std::io::ErrorKind::Unsupported, + "symlinks are not supported on this platform", + )) +} + fn is_up_to_date(dest: &Path, version: &str) -> bool { fs::read_to_string(dest.join(VERSION_FILE)).is_ok_and(|v| v.trim() == version) } @@ -182,8 +200,7 @@ fs::remove_file(&dest).map_err(|e| Error::Io(dest.clone(), e))?; } info!("symlink {path} -> {target}"); - std::os::unix::fs::symlink(target.as_std_path(), &dest) - .map_err(|e| Error::Io(dest.clone(), e))?; + make_symlink(target.as_str(), &dest).map_err(|e| Error::Io(dest.clone(), e))?; } } } -- gitstuff