Skip to content

Commit

Permalink
git: Always use OpenSSL on win32
Browse files Browse the repository at this point in the history
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
  • Loading branch information
HybridEidolon committed Apr 21, 2024
1 parent 77eaf67 commit c6a5c8e
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 1 deletion.
6 changes: 6 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ jobs:
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
choco install openssh --pre
# Windows builds need OpenSSL to fully support Git+SSH
- name: Setup openssl [windows]
if: ${{ matrix.os == 'windows-latest' }}
run: |
choco install openssl
- name: Install Rust
uses: dtolnay/rust-toolchain@1482605bfc5719782e1267fd0c0cc350fe7646b8
with:
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ 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.

### New features

* The list of conflicted paths is printed whenever the working copy changes.
Expand Down Expand Up @@ -64,6 +68,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
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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", features = ["openssl-on-win32"] }
maplit = "1.0.2"
minus = { version = "5.6.1", features = ["dynamic_output", "search"] }
num_cpus = "1.16.0"
Expand Down
18 changes: 17 additions & 1 deletion docs/windows.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,20 @@ Mode. If those conditions are not satisfied, `jj` will materialize symlinks as
ordinary files.

For colocated repositories, Git support must also be enabled using the
`git config` option `core.symlinks=true`.
`git config` option `core.symlinks=true`.

## Building jj on Windows

By default, `jj` will build with `libssh2` using OpenSSL as its cryptography
backend. This is because libssh2's wincng backend does not support the ED25519
algorithm, preventing Git+SSH remotes using ED25519 keys from working.

The easiest way to provide this is to install it via [vcpkg].

```bash
VCPKG_ROOT=path/to/your/vcpkg_installation
vcpkg install --triplet=x64-windows-static-md openssl
cargo build --release
```

[vcpkg]: https://vcpkg.io/
1 change: 1 addition & 0 deletions lib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand Down

0 comments on commit c6a5c8e

Please sign in to comment.