From 811bf5de6d7f81d68c4feb5964347d00bbdfd36d Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sat, 20 Apr 2024 19:15:46 -0500 Subject: [PATCH] git: Always use OpenSSL on win32 By default, libssh2 uses Windows Cryptography Next Generation when targeting win32. The wincng backend does not support ED25519, which is a widely-used algorithm among git hosting services, and in some cases may be the only option on remotes in certain configurations. This change necessitates Windows users building jj to install openssl via vcpkg for the target triple x64-windows-static-md when building for MSVC, or otherwise have OpenSSL available at build time. This should also generally work when building for MinGW, though I did not try it. Fixes #3322 --- .github/workflows/release.yml | 2 +- CHANGELOG.md | 8 ++++++++ Cargo.lock | 2 ++ Cargo.toml | 1 + cli/Cargo.toml | 2 ++ lib/Cargo.toml | 4 +++- 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85661841a0f..be6e209aafe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,7 +46,7 @@ jobs: toolchain: stable target: ${{ matrix.target }} - name: Build release binary - run: cargo build --target ${{ matrix.target }} --verbose --release --features packaging,vendored-openssl + run: cargo build --target ${{ matrix.target }} --verbose --release --features packaging,openssl-on-win32,vendored-openssl - name: Build archive shell: bash run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ae03aa2f05..60025788c36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * The default template alias `builtin_log_root(change_id: ChangeId, commit_id: CommitId)` was replaced by `format_root_commit(root: Commit)`. +* When targeting Windows, libssh2 will use OpenSSL rather than wincng. This fixes + interacting with Git+SSH hosts using ED25519 keys, but Windows developers will + need to provide OpenSSL at build time. This is enabled by Cargo feature + `openssl-on-win32`. + ### New features * The list of conflicted paths is printed whenever the working copy changes. @@ -64,6 +69,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 literals. This means that `snapshot.max-new-file-size="1"` and `snapshot.max-new-file-size=1` are now equivalent. +* ED25519 host keys are now supported correctly when connecting to Git+SSH hosts + on Windows. + ## [0.16.0] - 2024-04-03 ### Deprecations diff --git a/Cargo.lock b/Cargo.lock index 9583441d988..880278d67be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1694,6 +1694,7 @@ dependencies = [ "jj-cli", "jj-lib", "libc", + "libssh2-sys", "maplit", "minus", "once_cell", @@ -1744,6 +1745,7 @@ dependencies = [ "insta", "itertools 0.12.1", "jj-lib-proc-macros", + "libssh2-sys", "maplit", "num_cpus", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index f4119936d9f..832e4893266 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,6 +60,7 @@ indoc = "2.0.4" insta = { version = "1.38.0", features = ["filters"] } itertools = "0.12.1" libc = { version = "0.2.153" } +libssh2-sys = { version = "0.3.0" } maplit = "1.0.2" minus = { version = "5.6.1", features = ["dynamic_output", "search"] } num_cpus = "1.16.0" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8d2b41c5147..eddd9f7d5eb 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -64,6 +64,7 @@ hex = { workspace = true } indexmap = { workspace = true } itertools = { workspace = true } jj-lib = { workspace = true } +libssh2-sys = { workspace = true } maplit = { workspace = true } minus = { workspace = true } once_cell = { workspace = true } @@ -104,6 +105,7 @@ jj-cli = { path = ".", features = ["test-fakes"], default-features = false } [features] default = ["watchman"] bench = ["dep:criterion"] +openssl-on-win32 = ["libssh2-sys/openssl-on-win32", "jj-lib/openssl-on-win32"] packaging = [] test-fakes = ["jj-lib/testing"] vendored-openssl = ["git2/vendored-openssl", "jj-lib/vendored-openssl"] diff --git a/lib/Cargo.toml b/lib/Cargo.toml index d7a68f6a130..19b6d348e80 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -49,6 +49,7 @@ hex = { workspace = true } ignore = { workspace = true } itertools = { workspace = true } jj-lib-proc-macros = { workspace = true } +libssh2-sys = { workspace = true } maplit = { workspace = true } once_cell = { workspace = true } pest = { workspace = true } @@ -92,6 +93,7 @@ tokio = { workspace = true, features = ["full"] } [features] default = [] -vendored-openssl = ["git2/vendored-openssl"] +openssl-on-win32 = ["libssh2-sys/openssl-on-win32"] +vendored-openssl = ["git2/vendored-openssl", "libssh2-sys/openssl-on-win32"] watchman = ["dep:tokio", "dep:watchman_client"] testing = []