Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,10 @@ jobs:

# Re-vendor all WIT files and ensure that they're all up-to-date by ensuring
# that there's no git changes.
- name: Install wkg
run: |
curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
cargo binstall --no-confirm wkg
- name: Re-vendor WIT
run: ./ci/vendor-wit.sh
- run: git diff --exit-code
Expand Down
173 changes: 87 additions & 86 deletions ci/vendor-wit.sh
Original file line number Diff line number Diff line change
@@ -1,96 +1,97 @@
#!/usr/bin/env bash

# Script to re-vendor the WIT files that Wasmtime uses as defined by a
# particular tag in upstream repositories.
# Script to re-vendor the WIT files that Wasmtime uses using wkg to fetch
# packages from the OCI registry.
#
# This script is executed on CI to ensure that everything is up-to-date.
set -ex

# The make_vendor function takes a base path (e.g., "wasi") and a list
# of packages in the format "name@tag". It constructs the full destination
# path, downloads the tarballs from GitHub, extracts the relevant files, and
# removes any unwanted directories.
make_vendor() {
local name=$1
local packages=$2
local path="crates/$name/wit/deps"

rm -rf $path
mkdir -p $path

for package in $packages; do
IFS='@' read -r repo tag subdir <<< "$package"
mkdir -p "$path/$repo"
cached_extracted_dir="$cache_dir/$repo-$tag"

if [[ ! -d $cached_extracted_dir ]]; then
mkdir -p $cached_extracted_dir
curl --retry 5 --retry-all-errors -sLO https://github.com/WebAssembly/wasi-$repo/archive/$tag.tar.gz
tar xzf $tag.tar.gz --strip-components=1 -C $cached_extracted_dir
rm $tag.tar.gz
rm -rf $cached_extracted_dir/${subdir:-"wit"}/deps*
fi

cp -r $cached_extracted_dir/${subdir:-"wit"}/* $path/$repo
done
}

# Temporary directory for downloads
cache_dir=$(mktemp -d)
trap "rm -rf $cache_dir" EXIT

# Helper to download the `WebAssembly/$repo` dir at the `$tag` (or rev)
# specified. The `wit/*.wit` files are placed in `$path`.
get_github() {
local repo=$1
local tag=$2
local path=$3

rm -rf "$path"
mkdir -p "$path"

cached_extracted_dir="$cache_dir/$repo-$tag"

if [[ ! -d $cached_extracted_dir ]]; then
mkdir -p $cached_extracted_dir
curl --retry 5 --retry-all-errors -sLO https://github.com/WebAssembly/$repo/archive/$tag.tar.gz
tar xzf $tag.tar.gz --strip-components=1 -C $cached_extracted_dir
rm $tag.tar.gz
rm -rf $cached_extracted_dir/wit/deps*
fi

cp -r $cached_extracted_dir/wit/* $path
}

make_vendor "wasi-io" "
[email protected]
"

make_vendor "wasi/src/p2" "
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
"

make_vendor "wasi-http" "
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
"

make_vendor "wasi-tls" "
[email protected]
[email protected]+505fc98
"

make_vendor "wasi-config" "[email protected]"

make_vendor "wasi-keyvalue" "keyvalue@219ea36"

make_vendor "wasi/src/p3" "
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
"

make_vendor "wasi-http/src/p3" "
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
[email protected]@wit-0.3.0-draft
"

rm -rf $cache_dir

# Separately (for now), vendor the `wasi-nn` WIT files since their retrieval is
# slightly different than above.
p2=0.2.6
p3=0.3.0-rc-2025-09-16

rm -rf crates/wasi-io/wit/deps
mkdir -p crates/wasi-io/wit/deps
wkg get --format wit --overwrite "wasi:io@$p2" -o "crates/wasi-io/wit/deps/io.wit"

rm -rf crates/wasi/src/p2/wit/deps
mkdir -p crates/wasi/src/p2/wit/deps
wkg get --format wit --overwrite "wasi:io@$p2" -o "crates/wasi/src/p2/wit/deps/io.wit"
wkg get --format wit --overwrite "wasi:clocks@$p2" -o "crates/wasi/src/p2/wit/deps/clocks.wit"
wkg get --format wit --overwrite "wasi:cli@$p2" -o "crates/wasi/src/p2/wit/deps/cli.wit"
wkg get --format wit --overwrite "wasi:filesystem@$p2" -o "crates/wasi/src/p2/wit/deps/filesystem.wit"
wkg get --format wit --overwrite "wasi:random@$p2" -o "crates/wasi/src/p2/wit/deps/random.wit"
wkg get --format wit --overwrite "wasi:sockets@$p2" -o "crates/wasi/src/p2/wit/deps/sockets.wit"

rm -rf crates/wasi-http/wit/deps
mkdir -p crates/wasi-http/wit/deps
wkg get --format wit --overwrite "wasi:io@$p2" -o "crates/wasi-http/wit/deps/io.wit"
wkg get --format wit --overwrite "wasi:clocks@$p2" -o "crates/wasi-http/wit/deps/clocks.wit"
wkg get --format wit --overwrite "wasi:cli@$p2" -o "crates/wasi-http/wit/deps/cli.wit"
wkg get --format wit --overwrite "wasi:filesystem@$p2" -o "crates/wasi-http/wit/deps/filesystem.wit"
wkg get --format wit --overwrite "wasi:random@$p2" -o "crates/wasi-http/wit/deps/random.wit"
wkg get --format wit --overwrite "wasi:sockets@$p2" -o "crates/wasi-http/wit/deps/sockets.wit"
wkg get --format wit --overwrite "wasi:http@$p2" -o "crates/wasi-http/wit/deps/http.wit"


rm -rf crates/wasi-tls/wit/deps
mkdir -p crates/wasi-tls/wit/deps
wkg get --format wit --overwrite "wasi:io@$p2" -o "crates/wasi-tls/wit/deps/io.wit"
get_github wasi-tls v0.2.0-draft+505fc98 crates/wasi-tls/wit/deps/tls

rm -rf crates/wasi-config/wit/deps
mkdir -p crates/wasi-config/wit/deps
get_github wasi-config v0.2.0-rc.1 crates/wasi-config/wit/deps/config

rm -rf crates/wasi-keyvalue/wit/deps
mkdir -p crates/wasi-keyvalue/wit/deps
get_github wasi-keyvalue 219ea36 crates/wasi-keyvalue/wit/deps/keyvalue

rm -rf crates/wasi/src/p3/wit/deps
mkdir -p crates/wasi/src/p3/wit/deps
wkg get --format wit --overwrite "wasi:clocks@$p3" -o "crates/wasi/src/p3/wit/deps/clocks.wit"
wkg get --format wit --overwrite "wasi:cli@$p3" -o "crates/wasi/src/p3/wit/deps/cli.wit"
wkg get --format wit --overwrite "wasi:filesystem@$p3" -o "crates/wasi/src/p3/wit/deps/filesystem.wit"
wkg get --format wit --overwrite "wasi:random@$p3" -o "crates/wasi/src/p3/wit/deps/random.wit"
wkg get --format wit --overwrite "wasi:sockets@$p3" -o "crates/wasi/src/p3/wit/deps/sockets.wit"

rm -rf crates/wasi-http/src/p3/wit/deps
mkdir -p crates/wasi-http/src/p3/wit/deps
wkg get --format wit --overwrite "wasi:clocks@$p3" -o "crates/wasi-http/src/p3/wit/deps/clocks.wit"
wkg get --format wit --overwrite "wasi:cli@$p3" -o "crates/wasi-http/src/p3/wit/deps/cli.wit"
wkg get --format wit --overwrite "wasi:filesystem@$p3" -o "crates/wasi-http/src/p3/wit/deps/filesystem.wit"
wkg get --format wit --overwrite "wasi:random@$p3" -o "crates/wasi-http/src/p3/wit/deps/random.wit"
wkg get --format wit --overwrite "wasi:sockets@$p3" -o "crates/wasi-http/src/p3/wit/deps/sockets.wit"
wkg get --format wit --overwrite "wasi:http@$p3" -o "crates/wasi-http/src/p3/wit/deps/http.wit"

# wasi-nn is fetched separately since it's not in the standard WASI registry
repo=https://raw.githubusercontent.com/WebAssembly/wasi-nn
revision=0.2.0-rc-2024-10-28
curl --retry 5 --retry-all-errors -L $repo/$revision/wasi-nn.witx -o crates/wasi-nn/witx/wasi-nn.witx
curl --retry 5 --retry-all-errors -L $repo/$revision/wit/wasi-nn.wit -o crates/wasi-nn/wit/wasi-nn.wit
curl --retry 5 --retry-all-errors -L "$repo/$revision/wasi-nn.witx" -o crates/wasi-nn/witx/wasi-nn.witx
curl --retry 5 --retry-all-errors -L "$repo/$revision/wit/wasi-nn.wit" -o crates/wasi-nn/wit/wasi-nn.wit
Loading