Files
sausage/userland/git/README.md
T
surma 4b27e9afd5 userland/git: git-compatible CLI on v2's gix code (T10)
Local workflow, smart-HTTP clone/fetch/push and public HTTPS clone/fetch match
native git in stdout and exit codes. Only WASI imports (wasi:http, exit-with-code).
2026-11-06 16:07:57 +00:00

77 lines
2.6 KiB
Markdown

# Git for WASI 0.2
This crate adapts the v2 Git plugin's local operations and HTTP transport.
It uses gix 0.90 and the patches in [`vendor/PATCHES.md`](vendor/PATCHES.md).
It does not use the plugin SDK, RPC dispatch, the vault, or SSH.
The host supplies credentials through standard `wasi:http`.
## Build
Run the build from `userland/` to include the workspace's cwd constructor:
```sh
CARGO_TARGET_DIR=/tmp/p1-git/target nix develop .. -c cargo build -p git --release
```
The following commands run from the repository root.
## Native/WASI comparison and import check
```sh
nix develop -c nu userland/git/test.nu /tmp/p1-git/target/wasm32-wasip2/release/git.wasm
```
The script checks that the component imports only WASI interfaces.
It creates separate native and WASI repositories under `/tmp/p1-git/`.
It fixes both identities and timestamps.
It compares stdout and exit codes without filtering command output.
Initialization and worktree listings compare exit codes only because their paths differ.
The script retains its fixtures for inspection.
`wasmtime run` needs `-S http`, including for local operations.
It also needs `-S cli-exit-with-code=y` to preserve Git's numeric exit codes.
The component uses WASI's `exit-with-code`, not a custom host import.
The world host must enable that optional WASI function.
The tests pass explicit `-C` paths.
## Local smart-HTTP test
Build the native fixture server:
```sh
CARGO_TARGET_DIR=/tmp/p1-git/server-target nix develop -c cargo build --manifest-path userland/git/tests/http-server/Cargo.toml
```
The server wraps native `git http-backend` without TLS.
It accepts a repository directory and a readiness file.
The readiness file receives the bound localhost port.
Start the server in a separate terminal:
```sh
mkdir -p /tmp/p1-git/http-repos
/tmp/p1-git/server-target/debug/git-test-http-server /tmp/p1-git/http-repos /tmp/p1-git/http-port
```
Use that port in the integration test:
```sh
nix develop -c nu userland/git/http-test.nu /tmp/p1-git/target/wasm32-wasip2/release/git.wasm /tmp/p1-git/http-repos http://127.0.0.1:PORT/repo.git
```
Use a fresh repository name for each test run.
The script checks anonymous clone, fetch, and push through WASI.
It checks the resulting object IDs with native Git.
## Anonymous HTTPS test
The host handles TLS, not the guest.
Test HTTPS separately against the small public Hello-World repository:
```sh
nix develop -c nu userland/git/public-https-test.nu /tmp/p1-git/target/wasm32-wasip2/release/git.wasm
```
This test clones the repository and fetches it again.
It does not need credentials.
HTTPS push requires the host's later credential injection.