mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
feat(xtask): consolidate CI workflows onto xtask helpers (#542)
- split the xtask crate into structured modules for - bindings - ci - dev - util - no-std - Adding commands for - ci-release/ci-debug - MUSL/no-std - per- binding language smoke tests - developer tasks (fmt, clippy, pre-commit, pre-push) - refresh Cargo manifests/locks, binding readmes, and shared FFI helpers so every binding reuses the same preparation steps - refactor GitHub Actions (release/debug, extensions, CodeQL, clippy, bindings) to call the new xtask commands - Use rust-cache in ci workflows (microsoft qdk also does this) - extend README with a contributor workflow section describing how xtask mirrors CI expectations - update pre-commit and pre-push hooks to use the xtask dev commands WORKAROUND: When dotnet is run from an xtask, codeql tracer intercepts it an routes to a nonexistent binary. Therefore in codeql workflow, xtask is not used for c# and instead dotnet is directly invoked. Tracked by #545 closes #475 Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
GitHub
parent
2b1434b3ac
commit
e68e852ee3
89
.github/workflows/codeql.yml
vendored
89
.github/workflows/codeql.yml
vendored
@@ -64,9 +64,24 @@ jobs:
|
|||||||
|
|
||||||
# Setup language-specific dependencies BEFORE CodeQL init for proper tracing setup
|
# Setup language-specific dependencies BEFORE CodeQL init for proper tracing setup
|
||||||
- name: Setup Rust
|
- name: Setup Rust
|
||||||
if: matrix.language == 'rust' || matrix.language == 'c-cpp'
|
|
||||||
uses: ./.github/actions/toolchains/rust
|
uses: ./.github/actions/toolchains/rust
|
||||||
|
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
|
||||||
|
- name: Fetch workspace dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch FFI crate dependencies
|
||||||
|
if: matrix.language == 'c-cpp' || matrix.language == 'go' || matrix.language == 'csharp'
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml
|
||||||
|
|
||||||
|
- name: Fetch Java crate dependencies
|
||||||
|
if: matrix.language == 'java-kotlin'
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/java/Cargo.toml
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
if: matrix.language == 'python'
|
if: matrix.language == 'python'
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
@@ -92,6 +107,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
global-json-file: ./bindings/csharp/global.json
|
global-json-file: ./bindings/csharp/global.json
|
||||||
|
|
||||||
|
- name: Invoke dotnet directly
|
||||||
|
if: matrix.language == 'csharp'
|
||||||
|
run: dotnet --info
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
if: matrix.language == 'javascript-typescript'
|
if: matrix.language == 'javascript-typescript'
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -132,79 +151,39 @@ jobs:
|
|||||||
cargo install wasm-pack
|
cargo install wasm-pack
|
||||||
|
|
||||||
# Manual build steps for different languages
|
# Manual build steps for different languages
|
||||||
- name: Build C/C++ FFI bindings
|
- name: Build C/C++ bindings via xtask
|
||||||
if: matrix.language == 'c-cpp'
|
if: matrix.language == 'c-cpp'
|
||||||
working-directory: ${{ matrix.working-directory }}
|
|
||||||
run: |
|
run: |
|
||||||
# Build FFI library in no_std mode for embedded/constrained environments
|
cargo xtask test-c --release --frozen
|
||||||
cargo build --release --locked --features "ast,coverage,regorus/opa-no-std" --no-default-features
|
cargo xtask test-cpp --release --frozen --skip-ffi
|
||||||
|
cargo xtask test-c-no-std --release --frozen --skip-ffi
|
||||||
|
|
||||||
# Build the Rust FFI library that provides C-compatible interface
|
- name: Build Java bindings via xtask
|
||||||
cargo build --release --locked
|
|
||||||
|
|
||||||
# Build C bindings using CMake
|
|
||||||
cd ../c
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
|
|
||||||
# Build C++ bindings using CMake
|
|
||||||
cd ../../cpp
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
|
|
||||||
- name: Build Java bindings
|
|
||||||
if: matrix.language == 'java-kotlin'
|
if: matrix.language == 'java-kotlin'
|
||||||
working-directory: ${{ matrix.working-directory }}
|
run: cargo xtask test-java --release --frozen
|
||||||
run: |
|
|
||||||
# Build the Rust JNI library that provides Java-compatible interface
|
|
||||||
cargo fetch
|
|
||||||
cargo build --release --locked
|
|
||||||
# Compile Java source and create JAR package with Maven
|
|
||||||
mvn package
|
|
||||||
|
|
||||||
- name: Build Go bindings
|
- name: Build Go bindings via xtask
|
||||||
if: matrix.language == 'go'
|
if: matrix.language == 'go'
|
||||||
working-directory: ${{ matrix.working-directory }}
|
run: cargo xtask test-go --release --frozen
|
||||||
run: |
|
|
||||||
# Build the FFI library that Go bindings depend on via CGO
|
|
||||||
cd ../ffi
|
|
||||||
cargo fetch
|
|
||||||
cargo build --release --locked
|
|
||||||
cd ../go
|
|
||||||
# Download Go dependencies
|
|
||||||
go mod tidy
|
|
||||||
# Set up environment for CGO linking to Rust FFI library
|
|
||||||
export CGO_ENABLED=1
|
|
||||||
export LD_LIBRARY_PATH="$(pwd)/../ffi/target/release:$LD_LIBRARY_PATH"
|
|
||||||
# Build Go packages with verbose output for CodeQL tracing
|
|
||||||
go build -v ./pkg/regorus
|
|
||||||
go build -v -o regorus_test .
|
|
||||||
|
|
||||||
- name: Build C# bindings
|
- name: Build C# bindings manually
|
||||||
if: matrix.language == 'csharp'
|
if: matrix.language == 'csharp'
|
||||||
working-directory: ${{ matrix.working-directory }}
|
working-directory: ${{ matrix.working-directory }}
|
||||||
run: |
|
run: |
|
||||||
|
# Temporary workaround: CodeQL's tracer replaces dotnet with a missing shim when cargo xtask test-csharp runs,
|
||||||
|
# so invoke dotnet directly here until the upstream fix lands.
|
||||||
|
# Ideal command once fixed: cargo xtask test-csharp --release
|
||||||
# Build the FFI library that C# bindings access via P/Invoke
|
# Build the FFI library that C# bindings access via P/Invoke
|
||||||
cd ../ffi
|
cd ../ffi
|
||||||
cargo fetch
|
|
||||||
cargo build --release --locked
|
cargo build --release --locked
|
||||||
cd ../csharp
|
cd ../csharp
|
||||||
# Restore NuGet packages and build .NET assemblies in release mode
|
# Restore NuGet packages and build .NET assemblies in release mode
|
||||||
# Build the main Regorus library project only (tests require packaged version)
|
|
||||||
dotnet restore Regorus/Regorus.csproj
|
dotnet restore Regorus/Regorus.csproj
|
||||||
dotnet build Regorus/Regorus.csproj --no-restore /p:Configuration=Release /p:IgnoreMissingArtifacts=true
|
dotnet build Regorus/Regorus.csproj --no-restore /p:Configuration=Release /p:IgnoreMissingArtifacts=true
|
||||||
|
|
||||||
- name: Build WASM bindings
|
- name: Build WASM bindings via xtask
|
||||||
if: matrix.language == 'javascript-typescript'
|
if: matrix.language == 'javascript-typescript'
|
||||||
working-directory: ${{ matrix.working-directory }}
|
run: cargo xtask build-wasm --release
|
||||||
run: |
|
|
||||||
# Build WebAssembly module with wasm-pack for Node.js target
|
|
||||||
cargo fetch
|
|
||||||
wasm-pack build --target nodejs --release
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v3
|
uses: github/codeql-action/analyze@v3
|
||||||
|
|||||||
25
.github/workflows/pr-extensions.yml
vendored
25
.github/workflows/pr-extensions.yml
vendored
@@ -21,18 +21,15 @@ jobs:
|
|||||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: ./.github/actions/toolchains/rust
|
uses: ./.github/actions/toolchains/rust
|
||||||
- name: Build only std
|
- name: Cache cargo
|
||||||
run: cargo build -r --example regorus --no-default-features --features "std,rego-extensions"
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
- name: Doc Tests
|
with:
|
||||||
run: cargo test -r --doc --features rego-extensions
|
shared-key: ${{ runner.os }}-regorus
|
||||||
- name: Run tests
|
- name: Fetch dependencies
|
||||||
run: cargo test -r --features rego-extensions
|
run: cargo fetch --locked
|
||||||
- name: Run example
|
- name: Run rego extensions CI suite
|
||||||
run: cargo run --example regorus --features rego-extensions -- eval -d examples/server/allowed_server.rego -i examples/server/input.json data.example
|
|
||||||
- name: Run tests (ACI)
|
|
||||||
run: cargo test -r --test aci --features rego-extensions
|
|
||||||
- name: Run tests (KATA)
|
|
||||||
run: cargo test -r --test kata --features rego-extensions
|
|
||||||
- name: Run tests (OPA Conformance)
|
|
||||||
run: >-
|
run: >-
|
||||||
cargo test -r --test opa --features opa-testutil,serde_json/arbitrary_precision,rego-extensions -- $(tr '\n' ' ' < tests/opa.passing)
|
cargo xtask ci-release --frozen --features rego-extensions
|
||||||
|
--skip-all-features-build --skip-no-default-features-tests
|
||||||
|
--skip-azure-policy --skip-azure-rbac
|
||||||
|
--opa-features "opa-testutil,serde_json/arbitrary_precision,rego-extensions"
|
||||||
|
|||||||
38
.github/workflows/pr.yml
vendored
38
.github/workflows/pr.yml
vendored
@@ -21,33 +21,11 @@ jobs:
|
|||||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: ./.github/actions/toolchains/rust
|
uses: ./.github/actions/toolchains/rust
|
||||||
- name: Format Check
|
- name: Cache cargo
|
||||||
run: cargo fmt --check
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
- name: Fetch
|
with:
|
||||||
run: cargo fetch
|
shared-key: ${{ runner.os }}-regorus
|
||||||
- name: Build (all features)
|
- name: Fetch dependencies
|
||||||
run: cargo build -r --all-features --frozen
|
run: cargo fetch --locked
|
||||||
- name: Build
|
- name: Run release CI suite
|
||||||
run: cargo build -r --frozen
|
run: cargo xtask ci-release --frozen
|
||||||
- name: Test no_std
|
|
||||||
run: cargo test -r --no-default-features --frozen
|
|
||||||
- name: Build only std
|
|
||||||
run: cargo build -r --example regorus --no-default-features --features "std" --frozen
|
|
||||||
- name: Doc Tests
|
|
||||||
run: cargo test -r --doc --frozen
|
|
||||||
- name: Run tests
|
|
||||||
run: cargo test -r --frozen
|
|
||||||
- name: Run example
|
|
||||||
run: cargo run --example regorus --frozen -- eval -d examples/server/allowed_server.rego -i examples/server/input.json data.example
|
|
||||||
- name: Run tests (ACI)
|
|
||||||
run: cargo test -r --test aci --frozen
|
|
||||||
- name: Run tests (KATA)
|
|
||||||
run: cargo test -r --test kata --frozen
|
|
||||||
- name: Run tests (OPA Conformance)
|
|
||||||
run: >-
|
|
||||||
cargo test -r --test opa --frozen --features opa-testutil,serde_json/arbitrary_precision -- $(tr '\n' ' ' < tests/opa.passing)
|
|
||||||
- name: Run tests (Azure Policy)
|
|
||||||
run: >-
|
|
||||||
cargo test --frozen --features azure_policy
|
|
||||||
- name: Run tests (Azure RBAC)
|
|
||||||
run: cargo test -r --frozen --features azure-rbac
|
|
||||||
|
|||||||
3
.github/workflows/publish-java.yml
vendored
3
.github/workflows/publish-java.yml
vendored
@@ -48,7 +48,8 @@ jobs:
|
|||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- if: ${{ matrix.build_cmd == 'zigbuild' }}
|
- if: ${{ matrix.build_cmd == 'zigbuild' }}
|
||||||
run: pip install cargo-zigbuild
|
run: pip install cargo-zigbuild
|
||||||
- run: cargo fetch
|
- run: cargo fetch --locked
|
||||||
|
- run: cargo fetch --locked --manifest-path bindings/java/Cargo.toml
|
||||||
- run: cargo ${{ matrix.build_cmd || 'build' }} --release --frozen --target ${{ matrix.target }}${{ matrix.glibc && format('.{0}', matrix.glibc) || '' }} --manifest-path ./bindings/java/Cargo.toml
|
- run: cargo ${{ matrix.build_cmd || 'build' }} --release --frozen --target ${{ matrix.target }}${{ matrix.glibc && format('.{0}', matrix.glibc) || '' }} --manifest-path ./bindings/java/Cargo.toml
|
||||||
- run: mkdir -p native/${{ matrix.target }}
|
- run: mkdir -p native/${{ matrix.target }}
|
||||||
- run: mv target/${{ matrix.target }}/release/*.${{ matrix.extension }} ./native/${{ matrix.target }}/
|
- run: mv target/${{ matrix.target }}/release/*.${{ matrix.extension }} ./native/${{ matrix.target }}/
|
||||||
|
|||||||
6
.github/workflows/publish-python.yml
vendored
6
.github/workflows/publish-python.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Python extension
|
- name: Build Python extension
|
||||||
run: |
|
run: |
|
||||||
cargo fetch
|
cargo fetch --locked
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
cargo clippy --all-targets --no-deps -- -Dwarnings
|
||||||
cargo build --release --target ${{ matrix.target }} --frozen
|
cargo build --release --target ${{ matrix.target }} --frozen
|
||||||
working-directory: bindings/python
|
working-directory: bindings/python
|
||||||
@@ -59,7 +59,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Python extension
|
- name: Build Python extension
|
||||||
run: |
|
run: |
|
||||||
cargo fetch
|
cargo fetch --locked
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
cargo clippy --all-targets --no-deps -- -Dwarnings
|
||||||
cargo build --release --target ${{ matrix.host.target }} --frozen
|
cargo build --release --target ${{ matrix.host.target }} --frozen
|
||||||
working-directory: bindings/python
|
working-directory: bindings/python
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Python extension
|
- name: Build Python extension
|
||||||
run: |
|
run: |
|
||||||
cargo fetch
|
cargo fetch --locked
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
cargo clippy --all-targets --no-deps -- -Dwarnings
|
||||||
cargo build --release --target ${{ matrix.host.target }} --frozen
|
cargo build --release --target ${{ matrix.host.target }} --frozen
|
||||||
working-directory: bindings/python
|
working-directory: bindings/python
|
||||||
|
|||||||
13
.github/workflows/rust-clippy.yml
vendored
13
.github/workflows/rust-clippy.yml
vendored
@@ -34,20 +34,19 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: ./.github/actions/toolchains/rust
|
uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
|
||||||
- name: Install required cargo
|
- name: Install required cargo
|
||||||
run: cargo install clippy-sarif sarif-fmt
|
run: cargo install clippy-sarif sarif-fmt
|
||||||
|
|
||||||
- name: Fetch
|
- name: Fetch
|
||||||
run: cargo fetch
|
run: cargo fetch --locked
|
||||||
|
|
||||||
- name: Run rust-clippy
|
- name: Run rust-clippy
|
||||||
run:
|
run: cargo xtask clippy --sarif rust-clippy-results.sarif
|
||||||
cargo clippy
|
|
||||||
--all-features
|
|
||||||
--frozen
|
|
||||||
--message-format=json | clippy-sarif | tee rust-clippy-results.sarif | sarif-fmt
|
|
||||||
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Upload analysis results to GitHub
|
- name: Upload analysis results to GitHub
|
||||||
|
|||||||
42
.github/workflows/test-c-cpp.yml
vendored
42
.github/workflows/test-c-cpp.yml
vendored
@@ -19,36 +19,24 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch FFI crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml
|
||||||
|
|
||||||
- name: Setup gcc, g++, cmake, ninja
|
- name: Setup gcc, g++, cmake, ninja
|
||||||
run: sudo apt update && sudo apt install -y gcc g++ cmake ninja-build
|
run: sudo apt update && sudo apt install -y gcc g++ cmake ninja-build
|
||||||
|
|
||||||
- name: Workaround to ensure that regorus.h is generated
|
- name: Test C binding via xtask
|
||||||
run: |
|
run: cargo xtask test-c --release --frozen
|
||||||
cargo fetch
|
|
||||||
cargo build -r --frozen
|
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|
||||||
- name: Test c binding
|
- name: Test C (no-std) binding via xtask
|
||||||
run: |
|
run: cargo xtask test-c-nostd --release --frozen --skip-ffi
|
||||||
mkdir bindings/c/build
|
|
||||||
cd bindings/c/build
|
|
||||||
cmake -G Ninja ..
|
|
||||||
ninja
|
|
||||||
./regorus_test
|
|
||||||
|
|
||||||
- name: Test c-nostd binding
|
- name: Test C++ binding via xtask
|
||||||
run: |
|
run: cargo xtask test-cpp --release --frozen --skip-ffi
|
||||||
mkdir bindings/c-nostd/build
|
|
||||||
cd bindings/c-nostd/build
|
|
||||||
cmake -G Ninja ..
|
|
||||||
ninja
|
|
||||||
./regorus_test
|
|
||||||
|
|
||||||
- name: Test cpp binding
|
|
||||||
run: |
|
|
||||||
mkdir bindings/cpp/build
|
|
||||||
cd bindings/cpp/build
|
|
||||||
cmake -G Ninja ..
|
|
||||||
ninja
|
|
||||||
./regorus_test
|
|
||||||
|
|||||||
93
.github/workflows/test-csharp.yml
vendored
93
.github/workflows/test-csharp.yml
vendored
@@ -11,7 +11,7 @@ on:
|
|||||||
- cron: "0 8 * * *"
|
- cron: "0 8 * * *"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
VersionSuffix: ${{ github.run_id }}
|
VersionSuffix: ${{ github.event_name == 'workflow_dispatch' && 'manualtrigger' || null }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-ffi:
|
build-ffi:
|
||||||
@@ -42,22 +42,18 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
- name: Fetch crates
|
- name: Fetch FFI crate dependencies
|
||||||
run: cargo fetch
|
run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml --target ${{ matrix.runtime.target }}
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|
||||||
- name: Check Regorus binding formatting
|
- name: Build Regorus FFI via xtask
|
||||||
run: cargo fmt --check
|
run: cargo xtask build-ffi --release --target ${{ matrix.runtime.target }}
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|
||||||
- name: Check Clippy linting for Regorus binding
|
|
||||||
run: cargo clippy --frozen -- -D warnings
|
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|
||||||
- name: Build Regorus binding
|
|
||||||
run: cargo build -r --target ${{ matrix.runtime.target }} --locked
|
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|
||||||
- name: Upload regorus ffi shared library
|
- name: Upload regorus ffi shared library
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
@@ -68,7 +64,7 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
build-nuget:
|
build-csharp:
|
||||||
name: 'Build Regorus nuget'
|
name: 'Build Regorus nuget'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: build-ffi
|
needs: build-ffi
|
||||||
@@ -77,12 +73,21 @@ jobs:
|
|||||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/toolchains/rust
|
||||||
- uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0
|
- uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0
|
||||||
with:
|
with:
|
||||||
global-json-file: ./bindings/csharp/global.json
|
global-json-file: ./bindings/csharp/global.json
|
||||||
|
|
||||||
- run: echo '${{ steps.stepid.outputs.dotnet-version }}'
|
- run: echo '${{ steps.stepid.outputs.dotnet-version }}'
|
||||||
|
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
- name: Download regorus ffi shared libraries
|
- name: Download regorus ffi shared libraries
|
||||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||||
with:
|
with:
|
||||||
@@ -93,14 +98,8 @@ jobs:
|
|||||||
- name: Display regorus ffi artifacts
|
- name: Display regorus ffi artifacts
|
||||||
run: ls -R ./bindings/csharp/Regorus/tmp
|
run: ls -R ./bindings/csharp/Regorus/tmp
|
||||||
|
|
||||||
# Note that we need to supply the target folder within the folder where artifacts are downloaded.
|
- name: Build Regorus nuget via xtask
|
||||||
- name: Build Regorus binding
|
run: cargo xtask build-csharp --release --clean --artifacts-dir ./bindings/csharp/Regorus/tmp/bindings/ffi/target --enforce-artifacts
|
||||||
run: dotnet build /p:Configuration=Release /p:RegorusFFIArtifactsDir=./tmp/bindings/ffi/target /p:VersionSuffix=${{ env.VersionSuffix }}
|
|
||||||
working-directory: ./bindings/csharp/Regorus
|
|
||||||
|
|
||||||
- name: Pack
|
|
||||||
run: dotnet pack /p:RegorusFFIArtifactsDir=./tmp/bindings/ffi/target /p:VersionSuffix=${{ env.VersionSuffix }}
|
|
||||||
working-directory: ./bindings/csharp/Regorus
|
|
||||||
|
|
||||||
- name: Upload Regorus nuget
|
- name: Upload Regorus nuget
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
@@ -112,7 +111,7 @@ jobs:
|
|||||||
|
|
||||||
test-nuget:
|
test-nuget:
|
||||||
name: 'Test Regorus Nuget: (${{ matrix.runtime.target }})'
|
name: 'Test Regorus Nuget: (${{ matrix.runtime.target }})'
|
||||||
needs: build-nuget
|
needs: build-csharp
|
||||||
runs-on: ${{ matrix.runtime.os }}
|
runs-on: ${{ matrix.runtime.os }}
|
||||||
strategy:
|
strategy:
|
||||||
# let us get failures from other jobs even if one fails
|
# let us get failures from other jobs even if one fails
|
||||||
@@ -131,46 +130,32 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
|
||||||
- uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0
|
- uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0
|
||||||
with:
|
with:
|
||||||
global-json-file: ./bindings/csharp/global.json
|
global-json-file: ./bindings/csharp/global.json
|
||||||
|
|
||||||
- run: echo '${{ steps.stepid.outputs.dotnet-version }}'
|
- run: echo '${{ steps.stepid.outputs.dotnet-version }}'
|
||||||
|
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
- name: Download regorus nuget
|
- name: Download regorus nuget
|
||||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: regorus-nuget
|
name: regorus-nuget
|
||||||
path: ./bindings/csharp/regorus-nuget/
|
path: ./bindings/csharp/Regorus/bin/Release
|
||||||
|
|
||||||
- name: Restore Regorus.Tests
|
- name: Display regorus nuget
|
||||||
run: dotnet restore /p:UseLocalRegorus=false /p:VersionSuffix=${{ env.VersionSuffix }} /p:RestoreAdditionalProjectSources=../regorus-nuget
|
run: ls -R ./bindings/csharp/Regorus/bin/Release
|
||||||
working-directory: ./bindings/csharp/Regorus.Tests
|
|
||||||
|
|
||||||
- name: Run Regorus.Tests
|
- name: Run C# tests via xtask
|
||||||
run: dotnet test --no-restore /p:UseLocalRegorus=false /p:VersionSuffix=${{ env.VersionSuffix }}
|
run: cargo xtask test-csharp --release --clean --nuget-dir bindings/csharp/Regorus/bin/Release
|
||||||
working-directory: ./bindings/csharp/Regorus.Tests
|
|
||||||
|
|
||||||
- name: Restore TestApp
|
|
||||||
run: dotnet restore /p:VersionSuffix=${{ env.VersionSuffix }} /p:RestoreAdditionalProjectSources=../regorus-nuget
|
|
||||||
working-directory: ./bindings/csharp/TestApp
|
|
||||||
|
|
||||||
- name: Build TestApp
|
|
||||||
run: dotnet build --no-restore
|
|
||||||
working-directory: ./bindings/csharp/TestApp
|
|
||||||
|
|
||||||
- name: Run TestApp
|
|
||||||
run: dotnet run --no-build --framework net8.0
|
|
||||||
working-directory: ./bindings/csharp/TestApp
|
|
||||||
|
|
||||||
- name: Restore TargetExampleApp
|
|
||||||
run: dotnet restore /p:VersionSuffix=${{ env.VersionSuffix }} /p:RestoreAdditionalProjectSources=../regorus-nuget
|
|
||||||
working-directory: ./bindings/csharp/TargetExampleApp
|
|
||||||
|
|
||||||
- name: Build TargetExampleApp
|
|
||||||
run: dotnet build --no-restore
|
|
||||||
working-directory: ./bindings/csharp/TargetExampleApp
|
|
||||||
|
|
||||||
- name: Run TargetExampleApp
|
|
||||||
run: dotnet run --no-build --framework net8.0
|
|
||||||
working-directory: ./bindings/csharp/TargetExampleApp
|
|
||||||
|
|||||||
16
.github/workflows/test-ffi.yml
vendored
16
.github/workflows/test-ffi.yml
vendored
@@ -18,11 +18,15 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch FFI crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml
|
||||||
|
|
||||||
- name: Test FFI
|
- name: Test FFI
|
||||||
run: |
|
run: cargo xtask test-ffi --release --frozen
|
||||||
cargo fetch
|
|
||||||
cargo build -r --frozen
|
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
|
||||||
cargo test --features contention_checks --frozen
|
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|||||||
20
.github/workflows/test-go.yml
vendored
20
.github/workflows/test-go.yml
vendored
@@ -18,19 +18,19 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch FFI crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml
|
||||||
|
|
||||||
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
||||||
with:
|
with:
|
||||||
architecture: x64
|
architecture: x64
|
||||||
|
|
||||||
- name: Build ffi
|
- name: Test Go binding via xtask
|
||||||
run: cargo build -r
|
run: cargo xtask test-go --release --frozen
|
||||||
working-directory: ./bindings/ffi
|
|
||||||
|
|
||||||
- name: Test go
|
|
||||||
run: |
|
|
||||||
go mod tidy
|
|
||||||
go build
|
|
||||||
LD_LIBRARY_PATH=../ffi/target/release ./regorus_test
|
|
||||||
working-directory: ./bindings/go
|
|
||||||
|
|||||||
30
.github/workflows/test-java.yml
vendored
30
.github/workflows/test-java.yml
vendored
@@ -23,25 +23,15 @@ jobs:
|
|||||||
java-version: 8
|
java-version: 8
|
||||||
distribution: "corretto"
|
distribution: "corretto"
|
||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
- name: Building binding
|
- name: Fetch Java crate dependencies
|
||||||
run: |
|
run: cargo fetch --locked --manifest-path bindings/java/Cargo.toml
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
|
||||||
cargo build --release --manifest-path bindings/java/Cargo.toml --locked
|
|
||||||
|
|
||||||
- name: Capture binding version
|
- name: Run Java smoke tests via xtask
|
||||||
run: |
|
run: cargo xtask test-java --release --frozen
|
||||||
version=$(cargo metadata --manifest-path bindings/java/Cargo.toml --format-version 1 \
|
|
||||||
| jq -r '.packages[] | select(.name == "regorus-java") | .version')
|
|
||||||
echo "REGORUS_JAVA_VERSION=$version" >> "$GITHUB_ENV"
|
|
||||||
|
|
||||||
- name: Build jar
|
|
||||||
run: mvn package
|
|
||||||
working-directory: ./bindings/java
|
|
||||||
|
|
||||||
- name: Test jar
|
|
||||||
run: |
|
|
||||||
jar="regorus-java-${REGORUS_JAVA_VERSION}.jar"
|
|
||||||
javac -cp "target/${jar}" Test.java
|
|
||||||
java -Djava.library.path=target/release -cp "target/${jar}:." Test
|
|
||||||
working-directory: ./bindings/java
|
|
||||||
|
|||||||
23
.github/workflows/test-musl.yml
vendored
23
.github/workflows/test-musl.yml
vendored
@@ -22,18 +22,15 @@ jobs:
|
|||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
with:
|
with:
|
||||||
targets: x86_64-unknown-linux-musl
|
targets: x86_64-unknown-linux-musl
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
- name: Fetch MUSL target dependencies
|
||||||
|
run: cargo fetch --locked --target x86_64-unknown-linux-musl
|
||||||
- name: Install musl-gcc
|
- name: Install musl-gcc
|
||||||
run: sudo apt update && sudo apt install -y musl-tools
|
run: sudo apt update && sudo apt install -y musl-tools
|
||||||
- name: Fetch
|
- name: Run MUSL suite via xtask
|
||||||
run: cargo fetch
|
run: cargo xtask test-musl --release --frozen --target x86_64-unknown-linux-musl
|
||||||
- name: Build (MUSL)
|
|
||||||
run: cargo build --verbose --all-targets --target x86_64-unknown-linux-musl --frozen
|
|
||||||
- name: Run tests (MUSL)
|
|
||||||
run: cargo test -r --verbose --target x86_64-unknown-linux-musl --frozen
|
|
||||||
- name: Run tests (MUSL ACI)
|
|
||||||
run: cargo test -r --test aci --target x86_64-unknown-linux-musl --frozen
|
|
||||||
- name: Run tests (KATA ACI)
|
|
||||||
run: cargo test -r --test kata --target x86_64-unknown-linux-musl --frozen
|
|
||||||
- name: Run tests (MUSL OPA Conformance)
|
|
||||||
run: >-
|
|
||||||
cargo test -r --test opa --frozen --features opa-testutil,serde_json/arbitrary_precision --target x86_64-unknown-linux-musl -- $(tr '\n' ' ' < tests/opa.passing)
|
|
||||||
|
|||||||
15
.github/workflows/test-no-std.yml
vendored
15
.github/workflows/test-no-std.yml
vendored
@@ -22,9 +22,14 @@ jobs:
|
|||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
with:
|
with:
|
||||||
targets: thumbv7m-none-eabi
|
targets: thumbv7m-none-eabi
|
||||||
- name: Fetch
|
- name: Cache cargo
|
||||||
run: cargo fetch
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
- name: Build
|
with:
|
||||||
run: cargo build -r --target thumbv7m-none-eabi --frozen
|
shared-key: ${{ runner.os }}-regorus
|
||||||
working-directory: ./tests/ensure_no_std
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
- name: Fetch ensure_no_std crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path tests/ensure_no_std/Cargo.toml --target thumbv7m-none-eabi
|
||||||
|
- name: Test no-std
|
||||||
|
run: cargo xtask test-no-std --release --frozen
|
||||||
|
|
||||||
|
|||||||
74
.github/workflows/test-python.yml
vendored
74
.github/workflows/test-python.yml
vendored
@@ -9,9 +9,6 @@ on:
|
|||||||
# Run at 8:00 AM every day
|
# Run at 8:00 AM every day
|
||||||
- cron: "0 8 * * *"
|
- cron: "0 8 * * *"
|
||||||
|
|
||||||
env:
|
|
||||||
PYTHON_VERSION: "3.10"
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
@@ -28,66 +25,65 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: ./.github/actions/toolchains/rust
|
- uses: ./.github/actions/toolchains/rust
|
||||||
|
with:
|
||||||
|
targets: ${{ matrix.host.target }}
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch Python crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/python/Cargo.toml --target ${{ matrix.host.target }}
|
||||||
|
|
||||||
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: "3.10"
|
||||||
architecture: x64
|
architecture: x64
|
||||||
|
|
||||||
- name: Build Python extension
|
- name: Install maturin
|
||||||
run: |
|
run: python -m pip install maturin==1.5.1
|
||||||
cargo fetch
|
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
|
||||||
cargo build --release --target ${{ matrix.host.target }} --frozen
|
|
||||||
working-directory: bindings/python
|
|
||||||
|
|
||||||
- name: Build Wheel
|
- name: Build Python wheel via xtask
|
||||||
uses: PyO3/maturin-action@63b75c597b83e247fbf4fb7719801cc4220ae9f3 # v1.43.0
|
run: cargo xtask build-python --release --target ${{ matrix.host.target }} --target-dir bindings/python/dist --frozen
|
||||||
with:
|
|
||||||
target: x86_64
|
|
||||||
args: --release --out dist --manifest-path bindings/python/Cargo.toml --offline --strip
|
|
||||||
sccache: 'true'
|
|
||||||
|
|
||||||
- name: Upload Wheel
|
- name: Upload wheel artefacts
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
with:
|
with:
|
||||||
name: regorus-wheel-${{ matrix.host.name }}
|
name: regorus-wheel-${{ matrix.host.name }}
|
||||||
path: dist/regorus-*.whl
|
path: bindings/python/dist/regorus-*.whl
|
||||||
|
|
||||||
test:
|
test:
|
||||||
|
needs: build
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
host: [ubuntu-24.04, ubuntu-22.04, windows-latest]
|
||||||
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
||||||
host:
|
runs-on: ${{ matrix.host }}
|
||||||
- name: ubuntu-24.04
|
|
||||||
wheel: regorus-0.5.0-cp310-abi3-manylinux_2_34_x86_64.whl
|
|
||||||
- name: ubuntu-22.04
|
|
||||||
wheel: regorus-0.5.0-cp310-abi3-manylinux_2_34_x86_64.whl
|
|
||||||
- name: windows-latest
|
|
||||||
wheel: regorus-0.5.0-cp310-abi3-win_amd64.whl
|
|
||||||
|
|
||||||
needs: build
|
|
||||||
runs-on: ${{ matrix.host.name }}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/toolchains/rust
|
||||||
- name: Download Regorus wheel
|
- name: Cache cargo
|
||||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
with:
|
with:
|
||||||
path: wheels
|
shared-key: ${{ runner.os }}-regorus
|
||||||
pattern: regorus-wheel-*
|
- name: Fetch dependencies
|
||||||
merge-multiple: true
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch Python crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/python/Cargo.toml
|
||||||
|
|
||||||
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
architecture: x64
|
architecture: x64
|
||||||
|
|
||||||
- name: Test Wheel
|
- name: Install maturin
|
||||||
run: |
|
run: python -m pip install maturin==1.5.1
|
||||||
pip3 install ../../wheels/${{ matrix.host.wheel }}
|
|
||||||
python3 test.py
|
- name: Run Python smoke tests via xtask
|
||||||
working-directory: bindings/python
|
run: cargo xtask test-python --release --python python
|
||||||
|
|||||||
18
.github/workflows/test-ruby.yml
vendored
18
.github/workflows/test-ruby.yml
vendored
@@ -27,10 +27,16 @@ jobs:
|
|||||||
cargo-cache: true
|
cargo-cache: true
|
||||||
working-directory: "bindings/ruby"
|
working-directory: "bindings/ruby"
|
||||||
|
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch Ruby crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/ruby/Cargo.toml
|
||||||
|
|
||||||
- name: Run ruby tests
|
- name: Run ruby tests
|
||||||
run: |
|
run: cargo xtask test-ruby --release --frozen
|
||||||
cd bindings/ruby
|
|
||||||
gem install bundler
|
|
||||||
bundle install
|
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
|
||||||
bundle exec rake
|
|
||||||
|
|||||||
19
.github/workflows/test-wasm.yml
vendored
19
.github/workflows/test-wasm.yml
vendored
@@ -20,6 +20,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: ./.github/actions/toolchains/rust
|
uses: ./.github/actions/toolchains/rust
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
|
with:
|
||||||
|
shared-key: ${{ runner.os }}-regorus
|
||||||
|
- name: Fetch dependencies
|
||||||
|
run: cargo fetch --locked
|
||||||
|
|
||||||
|
- name: Fetch WASM crate dependencies
|
||||||
|
run: cargo fetch --locked --manifest-path bindings/wasm/Cargo.toml
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
@@ -29,11 +38,5 @@ jobs:
|
|||||||
- name: Install wasmlpack
|
- name: Install wasmlpack
|
||||||
run: cargo install wasm-pack
|
run: cargo install wasm-pack
|
||||||
|
|
||||||
- name: Test wasm binding
|
- name: Test wasm binding via xtask
|
||||||
run: |
|
run: cargo xtask test-wasm --release --frozen --node node
|
||||||
cd bindings/wasm
|
|
||||||
cargo fetch
|
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
|
||||||
wasm-pack build --target nodejs --release
|
|
||||||
wasm-pack test --release --node
|
|
||||||
node test.js
|
|
||||||
|
|||||||
31
.github/workflows/tests-debug.yml
vendored
31
.github/workflows/tests-debug.yml
vendored
@@ -21,26 +21,11 @@ jobs:
|
|||||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: ./.github/actions/toolchains/rust
|
uses: ./.github/actions/toolchains/rust
|
||||||
- name: Fetch
|
- name: Cache cargo
|
||||||
run: cargo fetch
|
uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
|
||||||
- name: Build (all features)
|
with:
|
||||||
run: cargo build --all-features --frozen
|
shared-key: ${{ runner.os }}-regorus
|
||||||
- name: Build
|
- name: Fetch dependencies
|
||||||
run: cargo build --frozen
|
run: cargo fetch --locked
|
||||||
- name: Test no_std
|
- name: Run debug CI suite
|
||||||
run: cargo test --no-default-features --frozen
|
run: cargo xtask ci-debug --frozen
|
||||||
- name: Build only std
|
|
||||||
run: cargo build --example regorus --no-default-features --features "std" --frozen
|
|
||||||
- name: Doc Tests
|
|
||||||
run: cargo test --doc --frozen
|
|
||||||
- name: Run tests
|
|
||||||
run: cargo test --frozen
|
|
||||||
- name: Run tests (ACI)
|
|
||||||
run: cargo test --test aci --frozen
|
|
||||||
- name: Run tests (KATA)
|
|
||||||
run: cargo test --test kata --frozen
|
|
||||||
- name: Run tests (OPA Conformance)
|
|
||||||
run: >-
|
|
||||||
cargo test --test opa --frozen --features opa-testutil,serde_json/arbitrary_precision -- $(tr '\n' ' ' < tests/opa.passing)
|
|
||||||
- name: Run tests (Azure RBAC)
|
|
||||||
run: cargo test --frozen --features azure-rbac
|
|
||||||
|
|||||||
158
Cargo.lock
generated
158
Cargo.lock
generated
@@ -2,6 +2,12 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 4
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "adler2"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ahash"
|
name = "ahash"
|
||||||
version = "0.8.12"
|
version = "0.8.12"
|
||||||
@@ -176,6 +182,12 @@ version = "0.6.9"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "byteorder"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cast"
|
name = "cast"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
@@ -184,9 +196,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.52"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"shlex",
|
"shlex",
|
||||||
@@ -277,8 +289,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
|
checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -300,6 +312,15 @@ version = "0.8.7"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crc32fast"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "criterion"
|
name = "criterion"
|
||||||
version = "0.8.1"
|
version = "0.8.1"
|
||||||
@@ -392,8 +413,8 @@ version = "0.2.5"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
|
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -439,9 +460,19 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.7"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "flate2"
|
||||||
|
version = "1.1.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369"
|
||||||
|
dependencies = [
|
||||||
|
"crc32fast",
|
||||||
|
"miniz_oxide",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluent-uri"
|
name = "fluent-uri"
|
||||||
@@ -795,6 +826,16 @@ dependencies = [
|
|||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "miniz_oxide"
|
||||||
|
version = "0.8.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
|
||||||
|
dependencies = [
|
||||||
|
"adler2",
|
||||||
|
"simd-adler32",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "msvc_spectre_libs"
|
name = "msvc_spectre_libs"
|
||||||
version = "0.1.3"
|
version = "0.1.3"
|
||||||
@@ -1046,9 +1087,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.105"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@@ -1064,11 +1105,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.43"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1150,8 +1191,8 @@ version = "1.0.25"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
|
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1293,8 +1334,8 @@ version = "1.0.228"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1330,6 +1371,12 @@ version = "1.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "simd-adler32"
|
||||||
|
version = "0.3.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "siphasher"
|
name = "siphasher"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
@@ -1377,8 +1424,8 @@ version = "2.0.114"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
|
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1388,8 +1435,8 @@ version = "0.13.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
|
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1407,21 +1454,21 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1564,9 +1611,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
@@ -1590,7 +1637,7 @@ version = "0.2.108"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
|
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"wasm-bindgen-macro-support",
|
"wasm-bindgen-macro-support",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1601,8 +1648,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
|
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
@@ -1676,8 +1723,8 @@ version = "0.60.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
|
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1687,8 +1734,8 @@ version = "0.59.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
|
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1736,9 +1783,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "writeable"
|
name = "writeable"
|
||||||
@@ -1755,6 +1802,7 @@ dependencies = [
|
|||||||
"regex",
|
"regex",
|
||||||
"semver",
|
"semver",
|
||||||
"toml_edit",
|
"toml_edit",
|
||||||
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1774,8 +1822,8 @@ version = "0.8.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
|
checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
"synstructure",
|
"synstructure",
|
||||||
]
|
]
|
||||||
@@ -1795,8 +1843,8 @@ version = "0.8.33"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
|
checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1815,8 +1863,8 @@ version = "0.1.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
|
checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
"synstructure",
|
"synstructure",
|
||||||
]
|
]
|
||||||
@@ -1849,13 +1897,25 @@ version = "0.11.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
|
checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.105",
|
"proc-macro2 1.0.106",
|
||||||
"quote 1.0.43",
|
"quote 1.0.44",
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "zip"
|
||||||
version = "1.0.14"
|
version = "0.6.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
|
checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder",
|
||||||
|
"crc32fast",
|
||||||
|
"crossbeam-utils",
|
||||||
|
"flate2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zmij"
|
||||||
|
version = "1.0.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -274,6 +274,19 @@ Benchmark 1: opa eval -b tests/aci -d tests/aci/data.json -i tests/aci/input.jso
|
|||||||
Range (min … max): 43.8 ms … 46.7 ms 62 runs
|
Range (min … max): 43.8 ms … 46.7 ms 62 runs
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Contributor Workflow
|
||||||
|
|
||||||
|
Regorus uses a small companion CLI under the `xtask` package to keep CI and local development in sync.
|
||||||
|
The commands mirror our GitHub Actions jobs, making it easy to dry-run CI steps before sending a pull request.
|
||||||
|
|
||||||
|
- Run the full release pipeline with `cargo xtask ci-release` and the debug checks with `cargo xtask ci-debug`.
|
||||||
|
- Exercise language bindings through focused helpers such as `cargo xtask test-java --release --frozen` or `cargo xtask test-go`.
|
||||||
|
- Use `cargo xtask test-musl --release --frozen` for the cross-compilation matrix and `cargo xtask test-no-std` for embedded targets.
|
||||||
|
- Formatting (`cargo xtask fmt`) and linting (`cargo xtask clippy --sarif`) wrap the usual Cargo tooling while matching CI defaults.
|
||||||
|
|
||||||
|
The workflows in `.github/workflows` invoke the same commands, so keeping local runs green is usually enough to satisfy the checks enforced on `main`.
|
||||||
|
|
||||||
## OPA Conformance
|
## OPA Conformance
|
||||||
|
|
||||||
Regorus has been verified to be compliant with [OPA v1.2.0](https://github.com/open-policy-agent/opa/releases/tag/v1.2.0)
|
Regorus has been verified to be compliant with [OPA v1.2.0](https://github.com/open-policy-agent/opa/releases/tag/v1.2.0)
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ Once the workflow run completes, the generated Nuget can be downloaded by follow
|
|||||||
|
|
||||||
## Local
|
## Local
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
## Memory Usage Safeguards
|
## Memory Usage Safeguards
|
||||||
@@ -60,3 +61,10 @@ Regorus.MemoryLimits.SetThreadFlushThresholdOverride(null);
|
|||||||
```
|
```
|
||||||
|
|
||||||
See `bindings/csharp/Regorus.Tests/RegorusTests.cs` for scenario coverage and `bindings/csharp/TargetExampleApp/Program.cs` for end-to-end usage.
|
See `bindings/csharp/Regorus.Tests/RegorusTests.cs` for scenario coverage and `bindings/csharp/TargetExampleApp/Program.cs` for end-to-end usage.
|
||||||
|
=======
|
||||||
|
The `cargo xtask` runner provides helpers for local builds:
|
||||||
|
|
||||||
|
1. `cargo xtask ffi` builds the `bindings/ffi` crate for the host platform in debug mode. Add `--target <triple>` (repeatable) to cross-compile, or `--release` to produce optimised artefacts. Results land under `bindings/ffi/target/<triple>/<profile>`.
|
||||||
|
2. `cargo xtask nuget` reuses those artefacts to pack the C# library. It defaults to debug builds for the host but accepts `--target`, `--release`, `--artifacts-dir <path>` to reuse existing binaries, and `--enforce-artifacts` to require every officially supported platform.
|
||||||
|
3. `cargo xtask test-csharp` ensures a NuGet is available (rebuilding when required or when `--force-nuget` is passed) and then runs `Regorus.Tests`, `TestApp`, and `TargetExampleApp` against it. The command accepts the same build flags as `cargo xtask nuget`.
|
||||||
|
>>>>>>> 380a27c (feat(xtask): consolidate CI workflows onto xtask helpers)
|
||||||
|
|||||||
@@ -12,11 +12,6 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- If the environment variable is set (such as in a Github Action run), append the suffix to the version number -->
|
<!-- If the environment variable is set (such as in a Github Action run), append the suffix to the version number -->
|
||||||
<RegorusPackageVersionSuffix Condition="'$(VersionSuffix)' != ''">-$(VersionSuffix)</RegorusPackageVersionSuffix>
|
<RegorusPackageVersionSuffix Condition="'$(VersionSuffix)' != ''">-$(VersionSuffix)</RegorusPackageVersionSuffix>
|
||||||
<UseLocalRegorus Condition="'$(UseLocalRegorus)' == ''">true</UseLocalRegorus>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(UseLocalRegorus)' == 'true'">
|
|
||||||
<DefineConstants>$(DefineConstants);REGORUS_FFI_TEST_HOOKS</DefineConstants>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -27,13 +22,7 @@
|
|||||||
<PackageReference Include="MSTest" Version="3.8.2" />
|
<PackageReference Include="MSTest" Version="3.8.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(UseLocalRegorus)' == 'true'">
|
<ItemGroup>
|
||||||
<ProjectReference Include="../Regorus/Regorus.csproj">
|
|
||||||
<AdditionalProperties>EnableRegorusTestHooks=true</AdditionalProperties>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup Condition="'$(UseLocalRegorus)' != 'true'">
|
|
||||||
<PackageReference Include="Regorus" Version="0.8.0$(RegorusPackageVersionSuffix)" />
|
<PackageReference Include="Regorus" Version="0.8.0$(RegorusPackageVersionSuffix)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -13,6 +13,10 @@
|
|||||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<RegorusFFIArtifactsProfile Condition="'$(RegorusFFIArtifactsProfile)' == ''">release</RegorusFFIArtifactsProfile>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.Text.Json" Version="8.0.5" />
|
<PackageReference Include="System.Text.Json" Version="8.0.5" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -27,7 +31,7 @@
|
|||||||
by the publishing pipeline.
|
by the publishing pipeline.
|
||||||
|
|
||||||
For each target triple, `Pack` expects the regorus ffi shared library
|
For each target triple, `Pack` expects the regorus ffi shared library
|
||||||
to be found in $(RegorusFFIArtifactsDir)/<target-triple>/release.
|
to be found in $(RegorusFFIArtifactsDir)/<target-triple>/$(RegorusFFIArtifactsProfile).
|
||||||
|
|
||||||
If $(IgnoreMissingArtifacts) is not set, ensure that the binaries for officially supported platforms exists.
|
If $(IgnoreMissingArtifacts) is not set, ensure that the binaries for officially supported platforms exists.
|
||||||
-->
|
-->
|
||||||
@@ -35,27 +39,27 @@
|
|||||||
<Error Text="RegorusFFIArtifactsDir must be supplied." Condition="$(RegorusFFIArtifactsDir) == ''" />
|
<Error Text="RegorusFFIArtifactsDir must be supplied." Condition="$(RegorusFFIArtifactsDir) == ''" />
|
||||||
|
|
||||||
<!-- Ensure that the binaries for officially supported platforms exists. -->
|
<!-- Ensure that the binaries for officially supported platforms exists. -->
|
||||||
<Error Text="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/release/regorus_ffi.dll missing."
|
<Error Text="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/regorus_ffi.dll missing."
|
||||||
Condition="!Exists('$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/release/regorus_ffi.dll')" />
|
Condition="!Exists('$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/regorus_ffi.dll')" />
|
||||||
<Error Text="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/release/regorus_ffi.pdb missing."
|
<Error Text="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/regorus_ffi.pdb missing."
|
||||||
Condition="!Exists('$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/release/regorus_ffi.pdb')" />
|
Condition="!Exists('$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/regorus_ffi.pdb')" />
|
||||||
|
|
||||||
<Error Text="$(RegorusFFIArtifactsDir)/x86_64-unknown-linux-gnu/release/libregorus_ffi.so missing."
|
<Error Text="$(RegorusFFIArtifactsDir)/x86_64-unknown-linux-gnu/$(RegorusFFIArtifactsProfile)/libregorus_ffi.so missing."
|
||||||
Condition="!Exists('$(RegorusFFIArtifactsDir)/x86_64-unknown-linux-gnu/release/libregorus_ffi.so')" />
|
Condition="!Exists('$(RegorusFFIArtifactsDir)/x86_64-unknown-linux-gnu/$(RegorusFFIArtifactsProfile)/libregorus_ffi.so')" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="docs/README.md" Pack="true" PackagePath="/" />
|
<None Include="docs/README.md" Pack="true" PackagePath="/" />
|
||||||
|
|
||||||
<!-- Copy each binary to expected location within the package -->
|
<!-- Copy each binary to expected location within the package -->
|
||||||
<None Include="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/release/*.dll" Pack="true" PackagePath="runtimes/win-x64/native/" />
|
<None Include="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/*.dll" Pack="true" PackagePath="runtimes/win-x64/native/" />
|
||||||
<None Include="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/release/*.pdb" Pack="true" PackagePath="runtimes/win-x64/native/" />
|
<None Include="$(RegorusFFIArtifactsDir)/x86_64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/*.pdb" Pack="true" PackagePath="runtimes/win-x64/native/" />
|
||||||
|
|
||||||
<None Include="$(RegorusFFIArtifactsDir)/aarch64-pc-windows-msvc/release/*.dll" Pack="true" PackagePath="runtimes/win-arm64/native/" />
|
<None Include="$(RegorusFFIArtifactsDir)/aarch64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/*.dll" Pack="true" PackagePath="runtimes/win-arm64/native/" />
|
||||||
<None Include="$(RegorusFFIArtifactsDir)/aarch64-pc-windows-msvc/release/*.pdb" Pack="true" PackagePath="runtimes/win-arm64/native/" />
|
<None Include="$(RegorusFFIArtifactsDir)/aarch64-pc-windows-msvc/$(RegorusFFIArtifactsProfile)/*.pdb" Pack="true" PackagePath="runtimes/win-arm64/native/" />
|
||||||
|
|
||||||
<None Include="$(RegorusFFIArtifactsDir)/x86_64-unknown-linux-gnu/release/lib*.so" Pack="true" PackagePath="runtimes/linux-x64/native/" />
|
<None Include="$(RegorusFFIArtifactsDir)/x86_64-unknown-linux-gnu/$(RegorusFFIArtifactsProfile)/lib*.so" Pack="true" PackagePath="runtimes/linux-x64/native/" />
|
||||||
|
|
||||||
<None Include="$(RegorusFFIArtifactsDir)/aarch64-apple-darwin/release/lib*.dylib" Pack="true" PackagePath="runtimes/osx-arm64/native/" />
|
<None Include="$(RegorusFFIArtifactsDir)/aarch64-apple-darwin/$(RegorusFFIArtifactsProfile)/lib*.dylib" Pack="true" PackagePath="runtimes/osx-arm64/native/" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
36
bindings/ffi/Cargo.lock
generated
36
bindings/ffi/Cargo.lock
generated
@@ -172,9 +172,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.52"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"shlex",
|
"shlex",
|
||||||
@@ -329,9 +329,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.7"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluent-uri"
|
name = "fluent-uri"
|
||||||
@@ -827,18 +827,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.105"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.43"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -1158,18 +1158,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1300,9 +1300,9 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
@@ -1431,9 +1431,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "writeable"
|
name = "writeable"
|
||||||
@@ -1540,6 +1540,6 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "zmij"
|
||||||
version = "1.0.14"
|
version = "1.0.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
40
bindings/java/Cargo.lock
generated
40
bindings/java/Cargo.lock
generated
@@ -109,9 +109,9 @@ checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.52"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"shlex",
|
"shlex",
|
||||||
@@ -213,9 +213,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.7"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluent-uri"
|
name = "fluent-uri"
|
||||||
@@ -703,18 +703,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.105"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.43"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -848,7 +848,7 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.18",
|
||||||
"url",
|
"url",
|
||||||
"uuid",
|
"uuid",
|
||||||
]
|
]
|
||||||
@@ -1009,11 +1009,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl 2.0.17",
|
"thiserror-impl 2.0.18",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1029,9 +1029,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1125,9 +1125,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
@@ -1322,9 +1322,9 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "writeable"
|
name = "writeable"
|
||||||
@@ -1431,6 +1431,6 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "zmij"
|
||||||
version = "1.0.14"
|
version = "1.0.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
@@ -32,6 +32,13 @@ $ mvn package
|
|||||||
|
|
||||||
And you will have a JAR at `./target/regorus-java-0.1.5.jar`.
|
And you will have a JAR at `./target/regorus-java-0.1.5.jar`.
|
||||||
|
|
||||||
|
### Automation
|
||||||
|
|
||||||
|
The repository exposes helper commands for local workflows:
|
||||||
|
|
||||||
|
- `cargo xtask build-java` runs `mvn package` with quiet output helpers.
|
||||||
|
- `cargo xtask test-java` rebuilds the native library via the Maven exec plugin and executes the binding tests.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
You can use Regorus Java bindings as:
|
You can use Regorus Java bindings as:
|
||||||
|
|||||||
36
bindings/python/Cargo.lock
generated
36
bindings/python/Cargo.lock
generated
@@ -103,9 +103,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.52"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"shlex",
|
"shlex",
|
||||||
@@ -191,9 +191,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.7"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluent-uri"
|
name = "fluent-uri"
|
||||||
@@ -698,9 +698,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.105"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@@ -771,9 +771,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.43"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -1057,18 +1057,18 @@ checksum = "b1dd07eb858a2067e2f3c7155d54e929265c264e6f37efe3ee7a8d1b5a1dd0ba"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1158,9 +1158,9 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
@@ -1271,9 +1271,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "writeable"
|
name = "writeable"
|
||||||
@@ -1380,6 +1380,6 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "zmij"
|
||||||
version = "1.0.14"
|
version = "1.0.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ Regorus can be used in Python via `regorus` package. (It is not yet available in
|
|||||||
|
|
||||||
See [Repository](https://github.com/microsoft/regorus).
|
See [Repository](https://github.com/microsoft/regorus).
|
||||||
|
|
||||||
|
## Automation
|
||||||
|
|
||||||
|
Run `cargo xtask build-python` to produce wheels via maturin, or `cargo xtask test-python` to reinstall the package locally and execute the sample script and pytest suite.
|
||||||
|
|
||||||
To build this binding, see [building](https://github.com/microsoft/regorus/blob/main/bindings/python/building.md)
|
To build this binding, see [building](https://github.com/microsoft/regorus/blob/main/bindings/python/building.md)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|||||||
152
bindings/ruby/Cargo.lock
generated
152
bindings/ruby/Cargo.lock
generated
@@ -111,9 +111,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bumpalo"
|
name = "bumpalo"
|
||||||
version = "3.19.0"
|
version = "3.19.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
|
checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytecount"
|
name = "bytecount"
|
||||||
@@ -123,9 +123,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.47"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"shlex",
|
"shlex",
|
||||||
@@ -148,9 +148,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chrono"
|
name = "chrono"
|
||||||
version = "0.4.42"
|
version = "0.4.43"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
|
checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"iana-time-zone",
|
"iana-time-zone",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
@@ -188,9 +188,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "data-encoding"
|
name = "data-encoding"
|
||||||
version = "2.9.0"
|
version = "2.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
|
checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "displaydoc"
|
name = "displaydoc"
|
||||||
@@ -237,9 +237,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.5"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluent-uri"
|
name = "fluent-uri"
|
||||||
@@ -379,9 +379,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_properties"
|
name = "icu_properties"
|
||||||
version = "2.1.1"
|
version = "2.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
|
checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"icu_collections",
|
"icu_collections",
|
||||||
"icu_locale_core",
|
"icu_locale_core",
|
||||||
@@ -393,9 +393,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_properties_data"
|
name = "icu_properties_data"
|
||||||
version = "2.1.1"
|
version = "2.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
|
checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "icu_provider"
|
name = "icu_provider"
|
||||||
@@ -435,9 +435,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.12.1"
|
version = "2.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2"
|
checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown",
|
"hashbrown",
|
||||||
@@ -460,15 +460,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.15"
|
version = "1.0.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.82"
|
version = "0.3.85"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
|
checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
@@ -514,9 +514,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.177"
|
version = "0.2.180"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
|
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libloading"
|
name = "libloading"
|
||||||
@@ -545,9 +545,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.28"
|
version = "0.4.29"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
|
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "magnus"
|
name = "magnus"
|
||||||
@@ -580,7 +580,7 @@ checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mimalloc"
|
name = "mimalloc"
|
||||||
version = "2.1.2"
|
version = "2.2.6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"mimalloc-sys",
|
"mimalloc-sys",
|
||||||
]
|
]
|
||||||
@@ -775,18 +775,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.103"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.42"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -819,27 +819,27 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.9.3"
|
version = "0.9.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
|
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rb-sys"
|
name = "rb-sys"
|
||||||
version = "0.9.117"
|
version = "0.9.124"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f900d1ce4629a2ebffaf5de74bd8f9c1188d4c5ed406df02f97e22f77a006f44"
|
checksum = "c85c4188462601e2aa1469def389c17228566f82ea72f137ed096f21591bc489"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rb-sys-build",
|
"rb-sys-build",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rb-sys-build"
|
name = "rb-sys-build"
|
||||||
version = "0.9.117"
|
version = "0.9.124"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ef1e9c857028f631056bcd6d88cec390c751e343ce2223ddb26d23eb4a151d59"
|
checksum = "568068db4102230882e6d4ae8de6632e224ca75fe5970f6e026a04e91ed635d3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen",
|
"bindgen",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
@@ -950,7 +950,6 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
"smol_str",
|
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"url",
|
"url",
|
||||||
"uuid",
|
"uuid",
|
||||||
@@ -980,9 +979,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.20"
|
version = "1.0.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
|
checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
@@ -1034,15 +1033,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.145"
|
version = "1.0.149"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
|
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"memchr",
|
"memchr",
|
||||||
"ryu",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_core",
|
"serde_core",
|
||||||
|
"zmij",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1071,9 +1070,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shell-words"
|
name = "shell-words"
|
||||||
version = "1.1.0"
|
version = "1.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
|
checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shlex"
|
name = "shlex"
|
||||||
@@ -1093,15 +1092,6 @@ version = "1.15.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "smol_str"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"
|
|
||||||
dependencies = [
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "stable_deref_trait"
|
name = "stable_deref_trait"
|
||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
@@ -1110,9 +1100,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.111"
|
version = "2.0.114"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
|
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1138,18 +1128,18 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1180,9 +1170,9 @@ checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "url"
|
name = "url"
|
||||||
version = "2.5.7"
|
version = "2.5.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
|
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"form_urlencoded",
|
"form_urlencoded",
|
||||||
"idna",
|
"idna",
|
||||||
@@ -1198,9 +1188,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "uuid"
|
name = "uuid"
|
||||||
version = "1.18.1"
|
version = "1.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
|
checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
@@ -1233,18 +1223,18 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen"
|
name = "wasm-bindgen"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
|
checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@@ -1255,9 +1245,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro"
|
name = "wasm-bindgen-macro"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
|
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"wasm-bindgen-macro-support",
|
"wasm-bindgen-macro-support",
|
||||||
@@ -1265,9 +1255,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro-support"
|
name = "wasm-bindgen-macro-support"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
|
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -1278,9 +1268,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-shared"
|
name = "wasm-bindgen-shared"
|
||||||
version = "0.2.105"
|
version = "0.2.108"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
|
checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@@ -1346,9 +1336,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "writeable"
|
name = "writeable"
|
||||||
@@ -1381,18 +1371,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.8.28"
|
version = "0.8.33"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90"
|
checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zerocopy-derive",
|
"zerocopy-derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy-derive"
|
name = "zerocopy-derive"
|
||||||
version = "0.8.28"
|
version = "0.8.33"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26"
|
checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1452,3 +1442,9 @@ dependencies = [
|
|||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zmij"
|
||||||
|
version = "1.0.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
36
bindings/wasm/Cargo.lock
generated
36
bindings/wasm/Cargo.lock
generated
@@ -120,9 +120,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.52"
|
version = "1.2.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3"
|
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"shlex",
|
"shlex",
|
||||||
@@ -208,9 +208,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.7"
|
version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41"
|
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluent-uri"
|
name = "fluent-uri"
|
||||||
@@ -746,18 +746,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.105"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.43"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@@ -1051,18 +1051,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
|
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "2.0.17"
|
version = "2.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1162,9 +1162,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasip2"
|
name = "wasip2"
|
||||||
version = "1.0.1+wasi-0.2.4"
|
version = "1.0.2+wasi-0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
|
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
@@ -1356,9 +1356,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.51.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
|
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "writeable"
|
name = "writeable"
|
||||||
@@ -1465,6 +1465,6 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "zmij"
|
||||||
version = "1.0.14"
|
version = "1.0.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ See [Repository](https://github.com/microsoft/regorus).
|
|||||||
|
|
||||||
To build this binding, see [building.md](https://github.com/microsoft/regorus/blob/main/bindings/wasm/building.md)
|
To build this binding, see [building.md](https://github.com/microsoft/regorus/blob/main/bindings/wasm/building.md)
|
||||||
|
|
||||||
|
## Automation
|
||||||
|
|
||||||
|
Run `cargo xtask build-wasm` to invoke wasm-pack with sensible defaults, or `cargo xtask test-wasm` to rebuild the package and execute `node test.js`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|||||||
@@ -4,25 +4,4 @@
|
|||||||
|
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
|
|
||||||
if [ -f Cargo.toml ]; then
|
cargo xtask pre-commit
|
||||||
# Ensure that all targets can be built.
|
|
||||||
cargo build --all-targets
|
|
||||||
|
|
||||||
#Ensure that code is correctly formatted.
|
|
||||||
cargo fmt --check || (echo "Run cargo fmt to fix formatting" && exit 1)
|
|
||||||
|
|
||||||
# Ensure that clippy warnings are addressed.
|
|
||||||
cargo clippy --all-targets --no-deps -- -Dwarnings
|
|
||||||
|
|
||||||
# Ensure binding versions reflect the staged changes.
|
|
||||||
cargo xtask bindings --check
|
|
||||||
|
|
||||||
# Ensure that all modifications are included.
|
|
||||||
# TODO refine status checking.
|
|
||||||
if git status -s | grep -e "MM " -e "??" -e "AM " -e " M " > /dev/null; then
|
|
||||||
printf "\nUnstaged changes found:\n"
|
|
||||||
git status -s | grep -e "MM " -e "??" -e "AM " -e " M "
|
|
||||||
echo "Stage them and try again"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -4,37 +4,4 @@
|
|||||||
|
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
|
|
||||||
if [ -f Cargo.toml ]; then
|
cargo xtask pre-push
|
||||||
# Run precommit checks.
|
|
||||||
dir=$(dirname "${BASH_SOURCE[0]}")
|
|
||||||
"$dir/pre-commit"
|
|
||||||
|
|
||||||
# Ensure that the public API works.
|
|
||||||
cargo test --doc
|
|
||||||
|
|
||||||
# Ensure that no_std build succeeds.
|
|
||||||
# Build for a target that has no std available.
|
|
||||||
if command -v rustup > /dev/null; then
|
|
||||||
rustup target add thumbv7m-none-eabi
|
|
||||||
(cd tests/ensure_no_std; cargo build -r --target thumbv7m-none-eabi)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ensure that we can build with only std.
|
|
||||||
cargo build --example regorus --no-default-features --features std
|
|
||||||
|
|
||||||
# Ensure that we can build with all features.
|
|
||||||
cargo build --all-features
|
|
||||||
|
|
||||||
# Ensure that all tests pass.
|
|
||||||
cargo test
|
|
||||||
cargo test --test aci
|
|
||||||
cargo test --test kata
|
|
||||||
|
|
||||||
# Ensure that all tests pass with extensions
|
|
||||||
cargo test --features rego-extensions
|
|
||||||
cargo test --test aci --features rego-extensions
|
|
||||||
cargo test --test kata --features rego-extensions
|
|
||||||
|
|
||||||
# Ensure that OPA conformance tests don't regress.
|
|
||||||
cargo test --features opa-testutil,serde_json/arbitrary_precision,rego-extensions --test opa -- $(tr '\n' ' ' < tests/opa.passing)
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -10,3 +10,4 @@ clap = { version = "4.5", features = ["derive"] }
|
|||||||
regex = "1.11"
|
regex = "1.11"
|
||||||
toml_edit = "0.22"
|
toml_edit = "0.22"
|
||||||
semver = "1.0"
|
semver = "1.0"
|
||||||
|
zip = { version = "0.6", default-features = false, features = ["deflate"] }
|
||||||
|
|||||||
@@ -6,7 +6,14 @@ mod tasks;
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
|
|
||||||
use tasks::{BindingsCommand, UpdateDepsCommand};
|
use tasks::{
|
||||||
|
BindingsCommand, BuildAllBindingsCommand, BuildFfiCommand, BuildJavaCommand, BuildNugetCommand,
|
||||||
|
BuildPythonCommand, BuildWasmCommand, CiDebugCommand, CiReleaseCommand, ClippyCommand,
|
||||||
|
FmtCommand, PrecommitCommand, PrepushCommand, TestAllBindingsCommand, TestCCommand,
|
||||||
|
TestCNoStdCommand, TestCppCommand, TestCsharpCommand, TestFfiCommand, TestGoCommand,
|
||||||
|
TestJavaCommand, TestMuslCommand, TestNoStdCommand, TestPythonCommand, TestRubyCommand,
|
||||||
|
TestWasmCommand, UpdateDepsCommand,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[command(author, version, about, propagate_version = true)]
|
#[command(author, version, about, propagate_version = true)]
|
||||||
@@ -19,6 +26,59 @@ struct Cli {
|
|||||||
enum Commands {
|
enum Commands {
|
||||||
/// Bump binding manifests to match the main regorus crate version
|
/// Bump binding manifests to match the main regorus crate version
|
||||||
Bindings(BindingsCommand),
|
Bindings(BindingsCommand),
|
||||||
|
/// Build the regorus FFI crate for selected targets
|
||||||
|
#[command(name = "build-ffi", alias = "ffi")]
|
||||||
|
Ffi(BuildFfiCommand),
|
||||||
|
/// Run the release-focused CI workflow locally
|
||||||
|
CiRelease(CiReleaseCommand),
|
||||||
|
/// Run the debug-focused CI workflow locally
|
||||||
|
CiDebug(CiDebugCommand),
|
||||||
|
/// Format the workspace and all binding crates
|
||||||
|
Fmt(FmtCommand),
|
||||||
|
/// Run clippy across the workspace and all binding crates
|
||||||
|
Clippy(ClippyCommand),
|
||||||
|
/// Run the repository pre-commit validation sequence
|
||||||
|
PreCommit(PrecommitCommand),
|
||||||
|
/// Run the repository pre-push validation sequence
|
||||||
|
PrePush(PrepushCommand),
|
||||||
|
/// Build every binding artefact with opinionated defaults
|
||||||
|
BuildAllBindings(BuildAllBindingsCommand),
|
||||||
|
/// Build the Java bindings via Maven
|
||||||
|
BuildJava(BuildJavaCommand),
|
||||||
|
/// Execute the Java binding test suite
|
||||||
|
TestJava(TestJavaCommand),
|
||||||
|
/// Build the Python wheels via maturin
|
||||||
|
BuildPython(BuildPythonCommand),
|
||||||
|
/// Execute the Python binding tests
|
||||||
|
TestPython(TestPythonCommand),
|
||||||
|
/// Build the WASM bindings via wasm-pack
|
||||||
|
BuildWasm(BuildWasmCommand),
|
||||||
|
/// Execute the WASM binding smoke tests
|
||||||
|
TestWasm(TestWasmCommand),
|
||||||
|
/// Execute the FFI binding test suite
|
||||||
|
TestFfi(TestFfiCommand),
|
||||||
|
/// Execute the Go binding smoke tests
|
||||||
|
TestGo(TestGoCommand),
|
||||||
|
/// Execute all binding smoke tests
|
||||||
|
TestAllBindings(TestAllBindingsCommand),
|
||||||
|
/// Execute the MUSL cross-compilation test matrix
|
||||||
|
TestMusl(TestMuslCommand),
|
||||||
|
/// Build the ensure_no_std harness for the embedded target
|
||||||
|
TestNoStd(TestNoStdCommand),
|
||||||
|
/// Configure, build, and run the C binding sample
|
||||||
|
TestC(TestCCommand),
|
||||||
|
/// Configure, build, and run the C++ binding sample
|
||||||
|
TestCpp(TestCppCommand),
|
||||||
|
/// Configure, build, and run the no_std C binding sample
|
||||||
|
#[command(name = "test-c-no-std", alias = "test-c-nostd")]
|
||||||
|
TestCNoStd(TestCNoStdCommand),
|
||||||
|
/// Execute the Ruby binding smoke tests
|
||||||
|
TestRuby(TestRubyCommand),
|
||||||
|
/// Build and validate the C# binding via its NuGet package
|
||||||
|
TestCsharp(TestCsharpCommand),
|
||||||
|
/// Build the Regorus C# NuGet package from local artefacts
|
||||||
|
#[command(name = "build-csharp", alias = "build-nuget", alias = "nuget")]
|
||||||
|
BuildCsharp(BuildNugetCommand),
|
||||||
/// Update dependencies across all workspace Cargo.lock files
|
/// Update dependencies across all workspace Cargo.lock files
|
||||||
UpdateDeps(UpdateDepsCommand),
|
UpdateDeps(UpdateDepsCommand),
|
||||||
}
|
}
|
||||||
@@ -28,6 +88,31 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
match cli.command {
|
match cli.command {
|
||||||
Commands::Bindings(cmd) => cmd.run()?,
|
Commands::Bindings(cmd) => cmd.run()?,
|
||||||
|
Commands::Ffi(cmd) => cmd.run()?,
|
||||||
|
Commands::CiRelease(cmd) => cmd.run()?,
|
||||||
|
Commands::CiDebug(cmd) => cmd.run()?,
|
||||||
|
Commands::Fmt(cmd) => cmd.run()?,
|
||||||
|
Commands::Clippy(cmd) => cmd.run()?,
|
||||||
|
Commands::PreCommit(cmd) => cmd.run()?,
|
||||||
|
Commands::PrePush(cmd) => cmd.run()?,
|
||||||
|
Commands::BuildAllBindings(cmd) => cmd.run()?,
|
||||||
|
Commands::BuildJava(cmd) => cmd.run()?,
|
||||||
|
Commands::TestJava(cmd) => cmd.run()?,
|
||||||
|
Commands::BuildPython(cmd) => cmd.run()?,
|
||||||
|
Commands::TestPython(cmd) => cmd.run()?,
|
||||||
|
Commands::BuildWasm(cmd) => cmd.run()?,
|
||||||
|
Commands::TestWasm(cmd) => cmd.run()?,
|
||||||
|
Commands::TestFfi(cmd) => cmd.run()?,
|
||||||
|
Commands::TestGo(cmd) => cmd.run()?,
|
||||||
|
Commands::TestAllBindings(cmd) => cmd.run()?,
|
||||||
|
Commands::TestMusl(cmd) => cmd.run()?,
|
||||||
|
Commands::TestNoStd(cmd) => cmd.run()?,
|
||||||
|
Commands::TestC(cmd) => cmd.run()?,
|
||||||
|
Commands::TestCpp(cmd) => cmd.run()?,
|
||||||
|
Commands::TestCNoStd(cmd) => cmd.run()?,
|
||||||
|
Commands::TestRuby(cmd) => cmd.run()?,
|
||||||
|
Commands::TestCsharp(cmd) => cmd.run()?,
|
||||||
|
Commands::BuildCsharp(cmd) => cmd.run()?,
|
||||||
Commands::UpdateDeps(cmd) => cmd.run()?,
|
Commands::UpdateDeps(cmd) => cmd.run()?,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
142
xtask/src/tasks/bindings/all.rs
Normal file
142
xtask/src/tasks/bindings/all.rs
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use super::c::{TestCCommand, TestCNoStdCommand};
|
||||||
|
use super::cpp::TestCppCommand;
|
||||||
|
use super::csharp::{build_nuget_package, BuildNugetConfig, TestCsharpCommand};
|
||||||
|
use super::ffi;
|
||||||
|
use super::java::{BuildJavaCommand, TestJavaCommand};
|
||||||
|
use super::python::{BuildPythonCommand, TestPythonCommand};
|
||||||
|
use super::wasm::{BuildWasmCommand, TestWasmCommand};
|
||||||
|
use crate::tasks::util::workspace_root;
|
||||||
|
|
||||||
|
/// Builds every published binding with opinionated defaults.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct BuildAllBindingsCommand {
|
||||||
|
/// Optimise artefacts where supported (defaults to debug builds).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildAllBindingsCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let release = self.release;
|
||||||
|
|
||||||
|
let targets = ffi::resolve_targets(Vec::new())?;
|
||||||
|
ffi::build_targets(&workspace, &targets, release)?;
|
||||||
|
|
||||||
|
let ffi_dir = workspace.join("bindings/ffi/target");
|
||||||
|
let nuget_result = build_nuget_package(&BuildNugetConfig {
|
||||||
|
targets: Vec::new(),
|
||||||
|
release,
|
||||||
|
clean: false,
|
||||||
|
artifacts_dir: Some(ffi_dir.clone()),
|
||||||
|
enforce_artifacts: false,
|
||||||
|
})?;
|
||||||
|
|
||||||
|
if nuget_result.packages.is_empty() {
|
||||||
|
println!("NuGet packaging completed but no archives were produced.");
|
||||||
|
} else {
|
||||||
|
for package in &nuget_result.packages {
|
||||||
|
println!("NuGet package ready at {}", package.display());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildJavaCommand { skip_tests: true }.run()?;
|
||||||
|
BuildPythonCommand {
|
||||||
|
release,
|
||||||
|
target: None,
|
||||||
|
target_dir: None,
|
||||||
|
frozen: false,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
BuildWasmCommand {
|
||||||
|
release,
|
||||||
|
target: "nodejs".to_string(),
|
||||||
|
out_dir: None,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
|
||||||
|
println!("Completed building all bindings.");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Executes the smoke tests for all bindings in sequence.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestAllBindingsCommand {
|
||||||
|
/// Optimise artefacts where supported (defaults to debug builds).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Python executable leveraged by the binding tests.
|
||||||
|
#[arg(long, value_name = "EXE", default_value = "python3")]
|
||||||
|
pub python: String,
|
||||||
|
|
||||||
|
/// Node.js executable leveraged by the WASM test.
|
||||||
|
#[arg(long, value_name = "EXE", default_value = "node")]
|
||||||
|
pub node: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestAllBindingsCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
TestCCommand {
|
||||||
|
release: self.release,
|
||||||
|
frozen: false,
|
||||||
|
skip_ffi: false,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
TestCppCommand {
|
||||||
|
release: self.release,
|
||||||
|
frozen: false,
|
||||||
|
skip_ffi: true,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
TestCNoStdCommand {
|
||||||
|
release: self.release,
|
||||||
|
frozen: false,
|
||||||
|
skip_ffi: true,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
TestJavaCommand {
|
||||||
|
release: self.release,
|
||||||
|
frozen: false,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
|
||||||
|
TestPythonCommand {
|
||||||
|
release: self.release,
|
||||||
|
target: None,
|
||||||
|
python: self.python.clone(),
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
|
||||||
|
TestWasmCommand {
|
||||||
|
release: self.release,
|
||||||
|
target: "nodejs".to_string(),
|
||||||
|
out_dir: None,
|
||||||
|
node: self.node.clone(),
|
||||||
|
frozen: false,
|
||||||
|
skip_build: false,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
|
||||||
|
TestCsharpCommand {
|
||||||
|
targets: Vec::new(),
|
||||||
|
release: self.release,
|
||||||
|
clean: false,
|
||||||
|
artifacts_dir: None,
|
||||||
|
enforce_artifacts: false,
|
||||||
|
force_nuget: false,
|
||||||
|
nuget_dir: None,
|
||||||
|
}
|
||||||
|
.run()?;
|
||||||
|
|
||||||
|
println!("Completed testing all bindings.");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
134
xtask/src/tasks/bindings/c.rs
Normal file
134
xtask/src/tasks/bindings/c.rs
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::fs;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use crate::tasks::util::{run_cargo_step, run_command, workspace_root};
|
||||||
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestCCommand {
|
||||||
|
/// Build the FFI crate in release mode before exercising the binding.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Pass --frozen to the preparatory cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
|
||||||
|
/// Reuse previously built FFI artefacts instead of rebuilding.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_ffi: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestCNoStdCommand {
|
||||||
|
/// Build the FFI crate in release mode before exercising the binding.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Pass --frozen to the preparatory cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
|
||||||
|
/// Reuse previously built FFI artefacts instead of rebuilding.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_ffi: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestCCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
if !self.skip_ffi {
|
||||||
|
prepare_ffi_artifacts(self.release, self.frozen)?;
|
||||||
|
}
|
||||||
|
run_binding("bindings/c", "regorus_test", self.release)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestCNoStdCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
if !self.skip_ffi {
|
||||||
|
prepare_ffi_artifacts(self.release, self.frozen)?;
|
||||||
|
}
|
||||||
|
run_binding("bindings/c-nostd", "regorus_test", self.release)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn run_binding(relative_dir: &str, binary_name: &str, release: bool) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let source_dir = workspace.join(relative_dir);
|
||||||
|
let build_dir = source_dir.join("build");
|
||||||
|
fs::create_dir_all(&build_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to create build directory at {}",
|
||||||
|
build_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let build_type = if release { "Release" } else { "Debug" };
|
||||||
|
let mut configure = Command::new("cmake");
|
||||||
|
configure.arg("-S").arg(&source_dir);
|
||||||
|
configure.arg("-B").arg(&build_dir);
|
||||||
|
configure.arg(format!("-DCMAKE_BUILD_TYPE={build_type}"));
|
||||||
|
run_command(configure, &format!("cmake configure ({relative_dir})"))?;
|
||||||
|
|
||||||
|
let mut build = Command::new("cmake");
|
||||||
|
build.arg("--build").arg(&build_dir);
|
||||||
|
build.arg("--config").arg(build_type);
|
||||||
|
run_command(build, &format!("cmake build ({relative_dir})"))?;
|
||||||
|
|
||||||
|
let executable = locate_executable(&build_dir, binary_name)?;
|
||||||
|
let mut run = Command::new(&executable);
|
||||||
|
run.current_dir(&build_dir);
|
||||||
|
run_command(run, &format!("{binary_name} ({relative_dir})"))?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn locate_executable(build_dir: &Path, binary_name: &str) -> Result<PathBuf> {
|
||||||
|
let mut candidates = Vec::new();
|
||||||
|
if cfg!(windows) {
|
||||||
|
let exe = format!("{binary_name}.exe");
|
||||||
|
candidates.push(build_dir.join(&exe));
|
||||||
|
candidates.push(build_dir.join("Release").join(&exe));
|
||||||
|
candidates.push(build_dir.join("Debug").join(&exe));
|
||||||
|
} else {
|
||||||
|
candidates.push(build_dir.join(binary_name));
|
||||||
|
candidates.push(build_dir.join("Release").join(binary_name));
|
||||||
|
candidates.push(build_dir.join("Debug").join(binary_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
for candidate in candidates {
|
||||||
|
if candidate.exists() {
|
||||||
|
return Ok(candidate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(anyhow!(
|
||||||
|
"failed to locate built executable '{}' under {}",
|
||||||
|
binary_name,
|
||||||
|
build_dir.display()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn prepare_ffi_artifacts(release: bool, frozen: bool) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let ffi_dir = workspace.join("bindings/ffi");
|
||||||
|
|
||||||
|
let mut build_args = vec!["build", "--locked"];
|
||||||
|
if release {
|
||||||
|
build_args.push("--release");
|
||||||
|
}
|
||||||
|
if frozen {
|
||||||
|
build_args.push("--frozen");
|
||||||
|
}
|
||||||
|
let build_label = if release {
|
||||||
|
"cargo build --release (bindings/ffi)"
|
||||||
|
} else {
|
||||||
|
"cargo build (bindings/ffi)"
|
||||||
|
};
|
||||||
|
run_cargo_step(&ffi_dir, build_label, build_args)
|
||||||
|
}
|
||||||
31
xtask/src/tasks/bindings/cpp.rs
Normal file
31
xtask/src/tasks/bindings/cpp.rs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use super::c::{prepare_ffi_artifacts, run_binding};
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestCppCommand {
|
||||||
|
/// Build the FFI crate in release mode before exercising the binding.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Pass --frozen to the preparatory cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
|
||||||
|
/// Reuse previously built FFI artefacts instead of rebuilding.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_ffi: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestCppCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
if !self.skip_ffi {
|
||||||
|
prepare_ffi_artifacts(self.release, self.frozen)?;
|
||||||
|
}
|
||||||
|
run_binding("bindings/cpp", "regorus_test", self.release)
|
||||||
|
}
|
||||||
|
}
|
||||||
484
xtask/src/tasks/bindings/csharp.rs
Normal file
484
xtask/src/tasks/bindings/csharp.rs
Normal file
@@ -0,0 +1,484 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::fs::{self, File};
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use super::ffi;
|
||||||
|
use crate::tasks::util::{dotnet_host_arch, run_command, workspace_root};
|
||||||
|
use zip::read::ZipArchive;
|
||||||
|
|
||||||
|
/// Builds the Regorus C# NuGet package from local sources.
|
||||||
|
#[derive(Args, Clone)]
|
||||||
|
pub struct BuildNugetCommand {
|
||||||
|
/// Build the Rust FFI artefacts for the provided target triple (defaults to the host).
|
||||||
|
#[arg(long = "target", value_name = "TRIPLE")]
|
||||||
|
pub targets: Vec<String>,
|
||||||
|
|
||||||
|
/// Build the package in release mode (defaults to debug).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Remove existing build artefacts before compiling.
|
||||||
|
#[arg(long)]
|
||||||
|
pub clean: bool,
|
||||||
|
|
||||||
|
/// Override the directory that contains compiled regorus FFI artefacts.
|
||||||
|
#[arg(long, value_name = "PATH")]
|
||||||
|
pub artifacts_dir: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Require all platform artefacts to exist before packing.
|
||||||
|
#[arg(long)]
|
||||||
|
pub enforce_artifacts: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parsed build options shared across tasks that need a NuGet package.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct BuildNugetConfig {
|
||||||
|
pub targets: Vec<String>,
|
||||||
|
pub release: bool,
|
||||||
|
pub clean: bool,
|
||||||
|
pub artifacts_dir: Option<PathBuf>,
|
||||||
|
pub enforce_artifacts: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Result of a NuGet build, including generated artefacts.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct BuildNugetResult {
|
||||||
|
pub package_dir: PathBuf,
|
||||||
|
pub packages: Vec<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Builds (or rebuilds) the C# NuGet package with the supplied configuration.
|
||||||
|
pub fn build_nuget_package(config: &BuildNugetConfig) -> Result<BuildNugetResult> {
|
||||||
|
let workspace_root = workspace_root();
|
||||||
|
let configuration = if config.release { "Release" } else { "Debug" };
|
||||||
|
let profile = ffi::profile_dir(config.release);
|
||||||
|
|
||||||
|
let base_artifacts_dir = if let Some(dir) = &config.artifacts_dir {
|
||||||
|
if !config.targets.is_empty() {
|
||||||
|
println!("Skipping FFI build for specified targets because --artifacts-dir is set.");
|
||||||
|
}
|
||||||
|
dir.clone()
|
||||||
|
} else {
|
||||||
|
let targets = ffi::resolve_targets(config.targets.clone())?;
|
||||||
|
ffi::build_targets(&workspace_root, &targets, config.release)?;
|
||||||
|
|
||||||
|
workspace_root.join("bindings/ffi/target")
|
||||||
|
};
|
||||||
|
|
||||||
|
let artifacts_dir = base_artifacts_dir.canonicalize().with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to canonicalize FFI artefacts directory at {}",
|
||||||
|
base_artifacts_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let package_dir = invoke_dotnet_pack(
|
||||||
|
&workspace_root,
|
||||||
|
&artifacts_dir,
|
||||||
|
configuration,
|
||||||
|
&profile,
|
||||||
|
!config.enforce_artifacts,
|
||||||
|
config.clean,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let packages = find_packages(&package_dir)?;
|
||||||
|
|
||||||
|
Ok(BuildNugetResult {
|
||||||
|
package_dir,
|
||||||
|
packages,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns all NuGet packages currently present in the given directory.
|
||||||
|
pub fn find_packages(package_dir: &Path) -> Result<Vec<PathBuf>> {
|
||||||
|
if !package_dir.exists() {
|
||||||
|
return Ok(Vec::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut packages = Vec::new();
|
||||||
|
let entries = fs::read_dir(package_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to enumerate NuGet artefacts under {}",
|
||||||
|
package_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
for entry in entries {
|
||||||
|
let entry = entry?;
|
||||||
|
let path = entry.path();
|
||||||
|
if path
|
||||||
|
.extension()
|
||||||
|
.and_then(|ext| ext.to_str())
|
||||||
|
.map_or(false, |ext| ext.eq_ignore_ascii_case("nupkg"))
|
||||||
|
{
|
||||||
|
packages.push(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
packages.sort();
|
||||||
|
Ok(packages)
|
||||||
|
}
|
||||||
|
fn invoke_dotnet_pack(
|
||||||
|
root: &Path,
|
||||||
|
artifacts_dir: &Path,
|
||||||
|
configuration: &str,
|
||||||
|
profile: &str,
|
||||||
|
ignore_missing: bool,
|
||||||
|
clean: bool,
|
||||||
|
) -> Result<PathBuf> {
|
||||||
|
let project_dir = root.join("bindings/csharp/Regorus");
|
||||||
|
let artifacts_dir_str = artifacts_dir
|
||||||
|
.to_str()
|
||||||
|
.ok_or_else(|| anyhow!("artefact directory path contains invalid UTF-8"))?;
|
||||||
|
|
||||||
|
let profile_arg = format!("/p:RegorusFFIArtifactsProfile={}", profile);
|
||||||
|
let dir_arg = format!("/p:RegorusFFIArtifactsDir={}", artifacts_dir_str);
|
||||||
|
|
||||||
|
if clean {
|
||||||
|
clean_msbuild_project(&project_dir, configuration)?;
|
||||||
|
let artefact_root = project_dir.join("bin").join(configuration);
|
||||||
|
if artefact_root.exists() {
|
||||||
|
fs::remove_dir_all(&artefact_root).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to remove existing NuGet artefacts from {}",
|
||||||
|
artefact_root.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut restore = Command::new("dotnet");
|
||||||
|
restore.current_dir(&project_dir);
|
||||||
|
restore.arg("restore");
|
||||||
|
run_command(restore, "dotnet restore")?;
|
||||||
|
|
||||||
|
let mut build = Command::new("dotnet");
|
||||||
|
build.current_dir(&project_dir);
|
||||||
|
build.arg("build");
|
||||||
|
build.arg("--no-restore");
|
||||||
|
build.arg("-c");
|
||||||
|
build.arg(configuration);
|
||||||
|
build.arg("--verbosity");
|
||||||
|
build.arg("minimal");
|
||||||
|
build.arg(&dir_arg);
|
||||||
|
build.arg(&profile_arg);
|
||||||
|
if ignore_missing {
|
||||||
|
build.arg("/p:IgnoreMissingArtifacts=true");
|
||||||
|
}
|
||||||
|
run_command(build, "dotnet build")?;
|
||||||
|
|
||||||
|
let mut pack = Command::new("dotnet");
|
||||||
|
pack.current_dir(&project_dir);
|
||||||
|
pack.arg("pack");
|
||||||
|
pack.arg("--no-build");
|
||||||
|
pack.arg("-c");
|
||||||
|
pack.arg(configuration);
|
||||||
|
pack.arg(&dir_arg);
|
||||||
|
pack.arg(&profile_arg);
|
||||||
|
if ignore_missing {
|
||||||
|
pack.arg("/p:IgnoreMissingArtifacts=true");
|
||||||
|
}
|
||||||
|
run_command(pack, "dotnet pack")?;
|
||||||
|
|
||||||
|
Ok(project_dir.join("bin").join(configuration))
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildNugetCommand {
|
||||||
|
/// Entry point executed by the xtask harness.
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let config = self.to_config();
|
||||||
|
let result = build_nuget_package(&config)?;
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"NuGet package(s) available under {}",
|
||||||
|
result.package_dir.display()
|
||||||
|
);
|
||||||
|
|
||||||
|
if result.packages.is_empty() {
|
||||||
|
println!("No NuGet packages were produced; check earlier log output.");
|
||||||
|
} else {
|
||||||
|
print_package_listing(&result.packages)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_config(&self) -> BuildNugetConfig {
|
||||||
|
BuildNugetConfig {
|
||||||
|
targets: self.targets.clone(),
|
||||||
|
release: self.release,
|
||||||
|
clean: self.clean,
|
||||||
|
artifacts_dir: self.artifacts_dir.clone(),
|
||||||
|
enforce_artifacts: self.enforce_artifacts,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_package_listing(packages: &[PathBuf]) -> Result<()> {
|
||||||
|
for package in packages {
|
||||||
|
println!("Contents of {}:", package.display());
|
||||||
|
let file =
|
||||||
|
File::open(package).with_context(|| format!("failed to open {}", package.display()))?;
|
||||||
|
let mut archive = ZipArchive::new(file)
|
||||||
|
.with_context(|| format!("failed to read zip archive from {}", package.display()))?;
|
||||||
|
|
||||||
|
let mut entries = Vec::new();
|
||||||
|
for index in 0..archive.len() {
|
||||||
|
let file = archive.by_index(index).with_context(|| {
|
||||||
|
format!("failed to access entry {index} in {}", package.display())
|
||||||
|
})?;
|
||||||
|
entries.push(file.name().to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
entries.sort();
|
||||||
|
for entry in entries {
|
||||||
|
println!(" {}", entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Builds (if required) and tests the C# bindings against the packaged NuGet.
|
||||||
|
#[derive(Args, Clone)]
|
||||||
|
pub struct TestCsharpCommand {
|
||||||
|
/// Build the Rust FFI artefacts for the provided target triple (defaults to the host).
|
||||||
|
#[arg(long = "target", value_name = "TRIPLE")]
|
||||||
|
pub targets: Vec<String>,
|
||||||
|
|
||||||
|
/// Build and pack using the Release configuration (defaults to Debug).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Remove existing build artefacts before running the command.
|
||||||
|
#[arg(long)]
|
||||||
|
pub clean: bool,
|
||||||
|
|
||||||
|
/// Override the directory that contains compiled regorus FFI artefacts.
|
||||||
|
#[arg(long, value_name = "PATH")]
|
||||||
|
pub artifacts_dir: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Require all platform artefacts to exist before packing.
|
||||||
|
#[arg(long)]
|
||||||
|
pub enforce_artifacts: bool,
|
||||||
|
|
||||||
|
/// Always rebuild the NuGet package instead of reusing an existing archive.
|
||||||
|
#[arg(long)]
|
||||||
|
pub force_nuget: bool,
|
||||||
|
|
||||||
|
/// Restore and test using Regorus NuGet artefacts located at DIR. Defaults to bindings/csharp/Regorus/bin/<configuration>.
|
||||||
|
#[arg(long = "nuget-dir", value_name = "DIR")]
|
||||||
|
pub nuget_dir: Option<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestCsharpCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let configuration = if self.release { "Release" } else { "Debug" };
|
||||||
|
if self.nuget_dir.is_some() && self.force_nuget {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"--force-nuget cannot be combined with --nuget-dir; build outputs always land in the default directory"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut package_dir = if let Some(dir) = &self.nuget_dir {
|
||||||
|
let path = PathBuf::from(dir);
|
||||||
|
if path.is_absolute() {
|
||||||
|
path
|
||||||
|
} else {
|
||||||
|
workspace.join(path)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
workspace
|
||||||
|
.join("bindings/csharp/Regorus/bin")
|
||||||
|
.join(configuration)
|
||||||
|
};
|
||||||
|
|
||||||
|
let build_config = BuildNugetConfig {
|
||||||
|
targets: self.targets.clone(),
|
||||||
|
release: self.release,
|
||||||
|
clean: self.clean,
|
||||||
|
artifacts_dir: self.artifacts_dir.clone(),
|
||||||
|
enforce_artifacts: self.enforce_artifacts,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut packages = find_packages(&package_dir)?;
|
||||||
|
if self.force_nuget || (packages.is_empty() && self.nuget_dir.is_none()) {
|
||||||
|
println!(
|
||||||
|
"{} NuGet package(s); invoking build...",
|
||||||
|
if self.force_nuget {
|
||||||
|
"Forcing rebuild of"
|
||||||
|
} else {
|
||||||
|
"Missing"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
let build = build_nuget_package(&build_config)?;
|
||||||
|
package_dir = build.package_dir;
|
||||||
|
packages = build.packages;
|
||||||
|
} else {
|
||||||
|
println!(
|
||||||
|
"Reusing existing NuGet package(s) under {}.",
|
||||||
|
package_dir.display()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if packages.is_empty() {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"No NuGet packages are available under {}; supply --nuget-dir with a populated directory or omit it to let xtask build the package",
|
||||||
|
package_dir.display()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Using NuGet package(s):");
|
||||||
|
for package in &packages {
|
||||||
|
println!(" {}", package.display());
|
||||||
|
}
|
||||||
|
|
||||||
|
run_regorus_tests(&workspace, configuration, &package_dir, self.clean)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_regorus_tests(
|
||||||
|
workspace: &Path,
|
||||||
|
configuration: &str,
|
||||||
|
package_dir: &Path,
|
||||||
|
clean: bool,
|
||||||
|
) -> Result<()> {
|
||||||
|
let nuget_source = package_dir
|
||||||
|
.to_str()
|
||||||
|
.ok_or_else(|| anyhow!("NuGet directory path contains invalid UTF-8"))?;
|
||||||
|
let properties = vec![format!(
|
||||||
|
"/p:RestoreAdditionalProjectSources={}",
|
||||||
|
nuget_source
|
||||||
|
)];
|
||||||
|
let property_args: Vec<&str> = properties.iter().map(|value| value.as_str()).collect();
|
||||||
|
|
||||||
|
let regorus_tests = workspace.join("bindings/csharp/Regorus.Tests");
|
||||||
|
if clean {
|
||||||
|
clean_msbuild_project(®orus_tests, configuration)?;
|
||||||
|
}
|
||||||
|
restore_with_source(®orus_tests, &property_args, "Regorus.Tests")?;
|
||||||
|
|
||||||
|
let mut test = Command::new("dotnet");
|
||||||
|
test.current_dir(®orus_tests);
|
||||||
|
test.arg("test");
|
||||||
|
test.arg("--no-restore");
|
||||||
|
test.arg("-c");
|
||||||
|
test.arg(configuration);
|
||||||
|
test.arg("--arch");
|
||||||
|
test.arg(dotnet_host_arch());
|
||||||
|
run_command(test, "dotnet test (Regorus.Tests)")?;
|
||||||
|
|
||||||
|
let test_app = workspace.join("bindings/csharp/TestApp");
|
||||||
|
if clean {
|
||||||
|
clean_msbuild_project(&test_app, configuration)?;
|
||||||
|
}
|
||||||
|
restore_with_source(&test_app, &property_args, "TestApp")?;
|
||||||
|
let mut build = Command::new("dotnet");
|
||||||
|
build.current_dir(&test_app);
|
||||||
|
build.arg("build");
|
||||||
|
build.arg("--no-restore");
|
||||||
|
build.arg("-c");
|
||||||
|
build.arg(configuration);
|
||||||
|
build.arg("--arch");
|
||||||
|
build.arg(dotnet_host_arch());
|
||||||
|
run_command(build, "dotnet build (TestApp)")?;
|
||||||
|
|
||||||
|
let mut run = Command::new("dotnet");
|
||||||
|
run.current_dir(&test_app);
|
||||||
|
run.arg("run");
|
||||||
|
run.arg("--no-build");
|
||||||
|
run.arg("--framework");
|
||||||
|
run.arg("net8.0");
|
||||||
|
run.arg("-c");
|
||||||
|
run.arg(configuration);
|
||||||
|
run.arg("--arch");
|
||||||
|
run.arg(dotnet_host_arch());
|
||||||
|
run_command(run, "dotnet run (TestApp)")?;
|
||||||
|
|
||||||
|
let target_example = workspace.join("bindings/csharp/TargetExampleApp");
|
||||||
|
if clean {
|
||||||
|
clean_msbuild_project(&target_example, configuration)?;
|
||||||
|
}
|
||||||
|
restore_with_source(&target_example, &property_args, "TargetExampleApp")?;
|
||||||
|
let mut build_example = Command::new("dotnet");
|
||||||
|
build_example.current_dir(&target_example);
|
||||||
|
build_example.arg("build");
|
||||||
|
build_example.arg("--no-restore");
|
||||||
|
build_example.arg("-c");
|
||||||
|
build_example.arg(configuration);
|
||||||
|
build_example.arg("--arch");
|
||||||
|
build_example.arg(dotnet_host_arch());
|
||||||
|
run_command(build_example, "dotnet build (TargetExampleApp)")?;
|
||||||
|
|
||||||
|
let mut run_example = Command::new("dotnet");
|
||||||
|
run_example.current_dir(&target_example);
|
||||||
|
run_example.arg("run");
|
||||||
|
run_example.arg("--no-build");
|
||||||
|
run_example.arg("--framework");
|
||||||
|
run_example.arg("net8.0");
|
||||||
|
run_example.arg("-c");
|
||||||
|
run_example.arg(configuration);
|
||||||
|
run_example.arg("--arch");
|
||||||
|
run_example.arg(dotnet_host_arch());
|
||||||
|
run_command(run_example, "dotnet run (TargetExampleApp)")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn restore_with_source(project_dir: &Path, properties: &[&str], label: &str) -> Result<()> {
|
||||||
|
let mut restore = Command::new("dotnet");
|
||||||
|
restore.current_dir(project_dir);
|
||||||
|
restore.arg("restore");
|
||||||
|
restore.arg("--arch");
|
||||||
|
restore.arg(dotnet_host_arch());
|
||||||
|
for property in properties {
|
||||||
|
restore.arg(property);
|
||||||
|
}
|
||||||
|
run_command(restore, &format!("dotnet restore ({label})"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clean_msbuild_project(project_dir: &Path, configuration: &str) -> Result<()> {
|
||||||
|
if !project_dir.exists() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut clean = Command::new("dotnet");
|
||||||
|
clean.current_dir(project_dir);
|
||||||
|
clean.arg("clean");
|
||||||
|
clean.arg("-c");
|
||||||
|
clean.arg(configuration);
|
||||||
|
clean.arg("--verbosity");
|
||||||
|
clean.arg("minimal");
|
||||||
|
run_command(clean, "dotnet clean")?;
|
||||||
|
|
||||||
|
let bin_dir = project_dir.join("bin");
|
||||||
|
if bin_dir.exists() {
|
||||||
|
fs::remove_dir_all(&bin_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to remove bin directory at {} while cleaning",
|
||||||
|
bin_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let obj_dir = project_dir.join("obj");
|
||||||
|
if obj_dir.exists() {
|
||||||
|
fs::remove_dir_all(&obj_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to remove obj directory at {} while cleaning",
|
||||||
|
obj_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
172
xtask/src/tasks/bindings/ffi.rs
Normal file
172
xtask/src/tasks/bindings/ffi.rs
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, bail, Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{dedup, run_cargo_step, workspace_root};
|
||||||
|
|
||||||
|
/// Builds the regorus FFI crate for the selected targets.
|
||||||
|
#[derive(Args)]
|
||||||
|
pub struct BuildFfiCommand {
|
||||||
|
/// Target triples to compile (defaults to the current host when omitted).
|
||||||
|
#[arg(long = "target", value_name = "TRIPLE")]
|
||||||
|
targets: Vec<String>,
|
||||||
|
|
||||||
|
/// Build in release mode instead of debug.
|
||||||
|
#[arg(long)]
|
||||||
|
release: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildFfiCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace_root = workspace_root();
|
||||||
|
let targets = resolve_targets(self.targets.clone())?;
|
||||||
|
let profile = profile_dir(self.release);
|
||||||
|
|
||||||
|
build_targets(&workspace_root, &targets, self.release)?;
|
||||||
|
|
||||||
|
let base = workspace_root.join("bindings/ffi/target");
|
||||||
|
if targets.len() == 1 {
|
||||||
|
println!(
|
||||||
|
"Built FFI artefacts at {}",
|
||||||
|
artifact_path(&base, targets[0].as_str(), profile).display()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
println!("Built FFI artefacts:");
|
||||||
|
for triple in &targets {
|
||||||
|
println!(
|
||||||
|
" {} -> {}",
|
||||||
|
triple,
|
||||||
|
artifact_path(&base, triple, profile).display()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Resolves the list of target triples to compile, defaulting to the host.
|
||||||
|
pub fn resolve_targets(mut targets: Vec<String>) -> Result<Vec<String>> {
|
||||||
|
if targets.is_empty() {
|
||||||
|
targets.push(detect_host_triple()?);
|
||||||
|
}
|
||||||
|
|
||||||
|
dedup(&mut targets);
|
||||||
|
Ok(targets)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compiles the FFI crate for the supplied target triples.
|
||||||
|
pub fn build_targets(root: &Path, targets: &[String], release: bool) -> Result<()> {
|
||||||
|
for target in targets {
|
||||||
|
cargo_build(root, target, release)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the cargo profile directory associated with the release flag.
|
||||||
|
pub fn profile_dir(release: bool) -> &'static str {
|
||||||
|
if release {
|
||||||
|
"release"
|
||||||
|
} else {
|
||||||
|
"debug"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn detect_host_triple() -> Result<String> {
|
||||||
|
let output = Command::new("rustc")
|
||||||
|
.arg("-Vv")
|
||||||
|
.output()
|
||||||
|
.context("failed to invoke rustc")?;
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
bail!(
|
||||||
|
"rustc -Vv failed: {}",
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let stdout = String::from_utf8(output.stdout).context("rustc output was not valid UTF-8")?;
|
||||||
|
for line in stdout.lines() {
|
||||||
|
if let Some(rest) = line.strip_prefix("host: ") {
|
||||||
|
return Ok(rest.trim().to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(anyhow!("failed to detect host target triple"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cargo_build(root: &Path, target: &str, release: bool) -> Result<()> {
|
||||||
|
let dir = root.join("bindings/ffi");
|
||||||
|
let mut args = vec![
|
||||||
|
OsString::from("build"),
|
||||||
|
OsString::from("--locked"),
|
||||||
|
OsString::from("--target"),
|
||||||
|
OsString::from(target),
|
||||||
|
];
|
||||||
|
if release {
|
||||||
|
args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let title = format!("cargo build (ffi:{target})");
|
||||||
|
run_cargo_step(&dir, &title, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn artifact_path(base: &Path, target: &str, profile: &str) -> PathBuf {
|
||||||
|
base.join(target).join(profile)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Executes the FFI binding test suite.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestFfiCommand {
|
||||||
|
/// Build the FFI crate in release mode prior to testing.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Pass --frozen to all cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestFfiCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let ffi_dir = workspace.join("bindings/ffi");
|
||||||
|
|
||||||
|
let mut build_args = vec![OsString::from("build"), OsString::from("--locked")];
|
||||||
|
if self.release {
|
||||||
|
build_args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
if self.frozen {
|
||||||
|
build_args.push(OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
let build_label = if self.release {
|
||||||
|
"cargo build --release (bindings/ffi)"
|
||||||
|
} else {
|
||||||
|
"cargo build (bindings/ffi)"
|
||||||
|
};
|
||||||
|
run_cargo_step(&ffi_dir, build_label, build_args)?;
|
||||||
|
|
||||||
|
let mut test_args = vec![OsString::from("test"), OsString::from("--locked")];
|
||||||
|
if self.release {
|
||||||
|
test_args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
if self.frozen {
|
||||||
|
test_args.push(OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
test_args.push(OsString::from("--features"));
|
||||||
|
test_args.push(OsString::from("contention_checks"));
|
||||||
|
run_cargo_step(
|
||||||
|
&ffi_dir,
|
||||||
|
"cargo test --features contention_checks (bindings/ffi)",
|
||||||
|
test_args,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
74
xtask/src/tasks/bindings/go.rs
Normal file
74
xtask/src/tasks/bindings/go.rs
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use super::c::prepare_ffi_artifacts;
|
||||||
|
use crate::tasks::util::{add_library_search_path, run_command, workspace_root};
|
||||||
|
|
||||||
|
/// Builds the Go binding sample and runs its smoke test.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestGoCommand {
|
||||||
|
/// Build the FFI crate in release mode before exercising the Go sample.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Skip rebuilding the FFI artefacts and reuse existing outputs.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_ffi: bool,
|
||||||
|
|
||||||
|
/// Pass --frozen to the preparatory cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestGoCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let ffi_dir = workspace.join("bindings/ffi");
|
||||||
|
let go_dir = workspace.join("bindings/go");
|
||||||
|
let profile = if self.release { "release" } else { "debug" };
|
||||||
|
|
||||||
|
if !self.skip_ffi {
|
||||||
|
prepare_ffi_artifacts(self.release, self.frozen)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
run_go_command(&go_dir, ["mod", "tidy"], "go mod tidy (bindings/go)")?;
|
||||||
|
run_go_command(&go_dir, ["build"], "go build (bindings/go)")?;
|
||||||
|
|
||||||
|
let binary = go_test_binary(&go_dir);
|
||||||
|
if !binary.exists() {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"expected Go test binary at {} after build",
|
||||||
|
binary.display()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let lib_dir = ffi_dir.join("target").join(profile);
|
||||||
|
let mut run = Command::new(&binary);
|
||||||
|
run.current_dir(&go_dir);
|
||||||
|
add_library_search_path(&mut run, &lib_dir);
|
||||||
|
run_command(run, "regorus_test (bindings/go)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_go_command<const N: usize>(dir: &Path, args: [&str; N], label: &str) -> Result<()> {
|
||||||
|
let mut cmd = Command::new("go");
|
||||||
|
cmd.current_dir(dir);
|
||||||
|
for arg in args {
|
||||||
|
cmd.arg(arg);
|
||||||
|
}
|
||||||
|
run_command(cmd, label)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn go_test_binary(dir: &Path) -> PathBuf {
|
||||||
|
if cfg!(windows) {
|
||||||
|
dir.join("regorus_test.exe")
|
||||||
|
} else {
|
||||||
|
dir.join("regorus_test")
|
||||||
|
}
|
||||||
|
}
|
||||||
134
xtask/src/tasks/bindings/java.rs
Normal file
134
xtask/src/tasks/bindings/java.rs
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::fs;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{path_separator, run_cargo_step, run_command, workspace_root};
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct BuildJavaCommand {
|
||||||
|
/// Skip the Maven test phase while packaging.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_tests: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildJavaCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let java_dir = workspace.join("bindings/java");
|
||||||
|
|
||||||
|
run_command(self.into_command(&java_dir)?, "mvn package (bindings/java)")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_command(&self, java_dir: &Path) -> Result<Command> {
|
||||||
|
let mut mvn = Command::new("mvn");
|
||||||
|
mvn.current_dir(java_dir);
|
||||||
|
mvn.arg("--batch-mode");
|
||||||
|
mvn.arg("--no-transfer-progress");
|
||||||
|
mvn.arg("package");
|
||||||
|
if self.skip_tests {
|
||||||
|
mvn.arg("-DskipTests");
|
||||||
|
}
|
||||||
|
Ok(mvn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestJavaCommand {
|
||||||
|
/// Build the JNI artefacts in release mode before testing.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Propagate --frozen to cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestJavaCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let java_dir = workspace.join("bindings/java");
|
||||||
|
|
||||||
|
build_java_crate(&workspace, self.release, self.frozen)?;
|
||||||
|
run_command(
|
||||||
|
BuildJavaCommand { skip_tests: false }.into_command(&java_dir)?,
|
||||||
|
"mvn package (bindings/java)",
|
||||||
|
)?;
|
||||||
|
run_java_integration(&java_dir, self.release)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn build_java_crate(workspace: &Path, release: bool, frozen: bool) -> Result<()> {
|
||||||
|
let mut args = vec!["build"];
|
||||||
|
if release {
|
||||||
|
args.push("--release");
|
||||||
|
}
|
||||||
|
if frozen {
|
||||||
|
args.push("--frozen");
|
||||||
|
}
|
||||||
|
args.push("--manifest-path");
|
||||||
|
args.push("bindings/java/Cargo.toml");
|
||||||
|
args.push("--locked");
|
||||||
|
run_cargo_step(workspace, "cargo build (bindings/java)", args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_java_integration(java_dir: &Path, release: bool) -> Result<()> {
|
||||||
|
let jar = locate_java_jar(java_dir)?;
|
||||||
|
let separator = path_separator();
|
||||||
|
let classpath = format!("{}{}.", jar.display(), separator);
|
||||||
|
|
||||||
|
let mut javac = Command::new("javac");
|
||||||
|
javac.current_dir(java_dir);
|
||||||
|
javac.arg("-cp");
|
||||||
|
javac.arg(&classpath);
|
||||||
|
javac.arg("Test.java");
|
||||||
|
run_command(javac, "javac Test.java (bindings/java)")?;
|
||||||
|
|
||||||
|
let profile = if release { "release" } else { "debug" };
|
||||||
|
let lib_path = java_dir.join("target").join(profile);
|
||||||
|
let mut java = Command::new("java");
|
||||||
|
java.current_dir(java_dir);
|
||||||
|
java.arg(format!("-Djava.library.path={}", lib_path.display()));
|
||||||
|
java.arg("-cp");
|
||||||
|
java.arg(&classpath);
|
||||||
|
java.arg("Test");
|
||||||
|
run_command(java, "java Test (bindings/java)")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn locate_java_jar(java_dir: &Path) -> Result<PathBuf> {
|
||||||
|
let target_dir = java_dir.join("target");
|
||||||
|
let entries = fs::read_dir(&target_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to enumerate built JARs under {}",
|
||||||
|
target_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let mut candidates = Vec::new();
|
||||||
|
for entry in entries {
|
||||||
|
let entry = entry?;
|
||||||
|
let path = entry.path();
|
||||||
|
if !path.is_file() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let Some(file_name) = path.file_name().and_then(|name| name.to_str()) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
if !file_name.starts_with("regorus-java-") || !file_name.ends_with(".jar") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if file_name.contains("-sources") || file_name.contains("-javadoc") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
candidates.push(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
candidates.sort();
|
||||||
|
candidates
|
||||||
|
.pop()
|
||||||
|
.ok_or_else(|| anyhow!("no regorus-java jar found under {}", target_dir.display()))
|
||||||
|
}
|
||||||
26
xtask/src/tasks/bindings/mod.rs
Normal file
26
xtask/src/tasks/bindings/mod.rs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
pub mod all;
|
||||||
|
pub mod c;
|
||||||
|
pub mod cpp;
|
||||||
|
pub mod csharp;
|
||||||
|
pub mod ffi;
|
||||||
|
pub mod go;
|
||||||
|
pub mod java;
|
||||||
|
pub mod python;
|
||||||
|
pub mod ruby;
|
||||||
|
pub mod version;
|
||||||
|
pub mod wasm;
|
||||||
|
|
||||||
|
pub use all::{BuildAllBindingsCommand, TestAllBindingsCommand};
|
||||||
|
pub use c::{TestCCommand, TestCNoStdCommand};
|
||||||
|
pub use cpp::TestCppCommand;
|
||||||
|
pub use csharp::{BuildNugetCommand, TestCsharpCommand};
|
||||||
|
pub use ffi::{BuildFfiCommand, TestFfiCommand};
|
||||||
|
pub use go::TestGoCommand;
|
||||||
|
pub use java::{BuildJavaCommand, TestJavaCommand};
|
||||||
|
pub use python::{BuildPythonCommand, TestPythonCommand};
|
||||||
|
pub use ruby::TestRubyCommand;
|
||||||
|
pub use version::BindingsCommand;
|
||||||
|
pub use wasm::{BuildWasmCommand, TestWasmCommand};
|
||||||
283
xtask/src/tasks/bindings/python.rs
Normal file
283
xtask/src/tasks/bindings/python.rs
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::fs;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, bail, Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{path_separator, run_cargo_step, run_command, workspace_root};
|
||||||
|
|
||||||
|
const MIN_PYTHON_VERSION: (u32, u32) = (3, 10);
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct BuildPythonCommand {
|
||||||
|
/// Optimise the wheel artefacts (defaults to debug builds).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Cross-compile for the provided Rust target triple.
|
||||||
|
#[arg(long, value_name = "TRIPLE")]
|
||||||
|
pub target: Option<String>,
|
||||||
|
|
||||||
|
/// Override the directory that receives built wheel files.
|
||||||
|
#[arg(long, value_name = "PATH")]
|
||||||
|
pub target_dir: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Propagate --frozen to cargo invocations prior to packaging.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildPythonCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let python_dir = workspace.join("bindings/python");
|
||||||
|
|
||||||
|
build_python_crate(
|
||||||
|
&python_dir,
|
||||||
|
self.release,
|
||||||
|
self.target.as_deref(),
|
||||||
|
self.frozen,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let wheel_dir = self
|
||||||
|
.target_dir
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_else(|| python_dir.join("wheels"));
|
||||||
|
fs::create_dir_all(&wheel_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to create Python wheel directory at {}",
|
||||||
|
wheel_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let mut maturin = Command::new("maturin");
|
||||||
|
maturin.current_dir(&python_dir);
|
||||||
|
maturin.arg("build");
|
||||||
|
if self.release {
|
||||||
|
maturin.arg("--release");
|
||||||
|
}
|
||||||
|
if let Some(target) = &self.target {
|
||||||
|
maturin.arg("--target");
|
||||||
|
maturin.arg(target);
|
||||||
|
}
|
||||||
|
maturin.arg("--target-dir");
|
||||||
|
maturin.arg(&wheel_dir);
|
||||||
|
run_command(maturin, "maturin build (bindings/python)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestPythonCommand {
|
||||||
|
/// Optimise the extension module used for testing (defaults to debug builds).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Cross-compile for the provided Rust target triple.
|
||||||
|
#[arg(long, value_name = "TRIPLE")]
|
||||||
|
pub target: Option<String>,
|
||||||
|
|
||||||
|
/// Python interpreter used to run the sample and tests.
|
||||||
|
#[arg(long, value_name = "EXE", default_value = "python3")]
|
||||||
|
pub python: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestPythonCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let python_dir = workspace.join("bindings/python");
|
||||||
|
|
||||||
|
let (venv_python, venv_dir) = ensure_virtual_env(&python_dir, &self.python)?;
|
||||||
|
|
||||||
|
install_testing_dependencies(&venv_python)?;
|
||||||
|
|
||||||
|
install_local_package(&python_dir, self.release, self.target.as_deref(), &venv_dir)?;
|
||||||
|
|
||||||
|
let mut sample = Command::new(&venv_python);
|
||||||
|
sample.current_dir(&python_dir);
|
||||||
|
sample.arg("test.py");
|
||||||
|
let sample_label = format!("{} test.py (bindings/python)", venv_python.display());
|
||||||
|
run_command(sample, &sample_label)?;
|
||||||
|
|
||||||
|
let mut pytest = Command::new(&venv_python);
|
||||||
|
pytest.current_dir(&python_dir);
|
||||||
|
pytest.arg("-m");
|
||||||
|
pytest.arg("pytest");
|
||||||
|
pytest.arg("test_extensions.py");
|
||||||
|
let pytest_label = format!(
|
||||||
|
"{} -m pytest test_extensions.py (bindings/python)",
|
||||||
|
venv_python.display()
|
||||||
|
);
|
||||||
|
run_command(pytest, &pytest_label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn install_testing_dependencies(venv_python: &Path) -> Result<()> {
|
||||||
|
let mut install = Command::new(venv_python);
|
||||||
|
install.arg("-m");
|
||||||
|
install.arg("pip");
|
||||||
|
install.arg("install");
|
||||||
|
install.arg("pytest");
|
||||||
|
let label = format!(
|
||||||
|
"{} -m pip install pytest (bindings/python)",
|
||||||
|
venv_python.display()
|
||||||
|
);
|
||||||
|
run_command(install, &label)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn install_local_package(
|
||||||
|
python_dir: &Path,
|
||||||
|
release: bool,
|
||||||
|
target: Option<&str>,
|
||||||
|
venv_dir: &Path,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut maturin = Command::new("maturin");
|
||||||
|
maturin.current_dir(python_dir);
|
||||||
|
maturin.arg("develop");
|
||||||
|
if release {
|
||||||
|
maturin.arg("--release");
|
||||||
|
}
|
||||||
|
if let Some(target) = target {
|
||||||
|
maturin.arg("--target");
|
||||||
|
maturin.arg(target);
|
||||||
|
}
|
||||||
|
maturin.env("VIRTUAL_ENV", venv_dir);
|
||||||
|
let bin_dir = venv_bin_dir(venv_dir);
|
||||||
|
let mut path_value = bin_dir.clone().into_os_string();
|
||||||
|
if let Some(existing) = std::env::var_os("PATH") {
|
||||||
|
if !existing.is_empty() {
|
||||||
|
path_value.push(path_separator());
|
||||||
|
path_value.push(existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
maturin.env("PATH", path_value);
|
||||||
|
run_command(maturin, "maturin develop (bindings/python)")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_python_crate(
|
||||||
|
python_dir: &Path,
|
||||||
|
release: bool,
|
||||||
|
target: Option<&str>,
|
||||||
|
frozen: bool,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut args = Vec::new();
|
||||||
|
args.push(OsString::from("build"));
|
||||||
|
if release {
|
||||||
|
args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
if let Some(target) = target {
|
||||||
|
args.push(OsString::from("--target"));
|
||||||
|
args.push(OsString::from(target));
|
||||||
|
}
|
||||||
|
if frozen {
|
||||||
|
args.push(OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
args.push(OsString::from("--locked"));
|
||||||
|
run_cargo_step(python_dir, "cargo build (bindings/python)", args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ensure_virtual_env(python_dir: &Path, python: &str) -> Result<(PathBuf, PathBuf)> {
|
||||||
|
ensure_python_version(std::ffi::OsStr::new(python), python)?;
|
||||||
|
|
||||||
|
let venv_dir = python_dir.join(".venv");
|
||||||
|
if venv_dir.exists() {
|
||||||
|
let existing_python = venv_bin_dir(&venv_dir).join(venv_python_name());
|
||||||
|
if existing_python.exists()
|
||||||
|
&& ensure_python_version(
|
||||||
|
existing_python.as_os_str(),
|
||||||
|
&existing_python.display().to_string(),
|
||||||
|
)
|
||||||
|
.is_ok()
|
||||||
|
{
|
||||||
|
return Ok((existing_python, venv_dir));
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::remove_dir_all(&venv_dir).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to remove incompatible virtual environment at {}",
|
||||||
|
venv_dir.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut create = Command::new(python);
|
||||||
|
create.current_dir(python_dir);
|
||||||
|
create.arg("-m");
|
||||||
|
create.arg("venv");
|
||||||
|
create.arg(".venv");
|
||||||
|
let label = format!("{} -m venv .venv (bindings/python)", python);
|
||||||
|
run_command(create, &label)?;
|
||||||
|
|
||||||
|
let python_path = venv_bin_dir(&venv_dir).join(venv_python_name());
|
||||||
|
ensure_python_version(python_path.as_os_str(), &python_path.display().to_string())?;
|
||||||
|
|
||||||
|
Ok((python_path, venv_dir))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn venv_bin_dir(venv_dir: &Path) -> PathBuf {
|
||||||
|
if cfg!(windows) {
|
||||||
|
venv_dir.join("Scripts")
|
||||||
|
} else {
|
||||||
|
venv_dir.join("bin")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn venv_python_name() -> &'static str {
|
||||||
|
if cfg!(windows) {
|
||||||
|
"python.exe"
|
||||||
|
} else {
|
||||||
|
"python"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ensure_python_version(executable: &std::ffi::OsStr, label: &str) -> Result<()> {
|
||||||
|
let (major, minor) = query_python_version(executable, label)?;
|
||||||
|
if (major, minor) < MIN_PYTHON_VERSION {
|
||||||
|
bail!(
|
||||||
|
"Python interpreter {} reports version {}.{}; the bindings require Python >= {}.{}. Use --python to provide a compatible interpreter.",
|
||||||
|
label,
|
||||||
|
major,
|
||||||
|
minor,
|
||||||
|
MIN_PYTHON_VERSION.0,
|
||||||
|
MIN_PYTHON_VERSION.1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn query_python_version(executable: &std::ffi::OsStr, label: &str) -> Result<(u32, u32)> {
|
||||||
|
let output = Command::new(executable)
|
||||||
|
.arg("-c")
|
||||||
|
.arg("import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}')")
|
||||||
|
.output()
|
||||||
|
.with_context(|| format!("failed to query Python version from {}", label))?;
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
bail!(
|
||||||
|
"{} -c 'import sys; ...' exited with status {}",
|
||||||
|
label,
|
||||||
|
output.status
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let stdout = String::from_utf8(output.stdout)
|
||||||
|
.with_context(|| format!("failed to decode Python version output from {}", label))?;
|
||||||
|
let trimmed = stdout.trim();
|
||||||
|
let mut parts = trimmed.split('.');
|
||||||
|
let major = parts
|
||||||
|
.next()
|
||||||
|
.ok_or_else(|| anyhow!("missing major version in '{}'", trimmed))?
|
||||||
|
.parse::<u32>()
|
||||||
|
.with_context(|| format!("failed to parse major version from '{}'", trimmed))?;
|
||||||
|
let minor = parts
|
||||||
|
.next()
|
||||||
|
.ok_or_else(|| anyhow!("missing minor version in '{}'", trimmed))?
|
||||||
|
.parse::<u32>()
|
||||||
|
.with_context(|| format!("failed to parse minor version from '{}'", trimmed))?;
|
||||||
|
|
||||||
|
Ok((major, minor))
|
||||||
|
}
|
||||||
72
xtask/src/tasks/bindings/ruby.rs
Normal file
72
xtask/src/tasks/bindings/ruby.rs
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{run_cargo_step, run_command, workspace_root};
|
||||||
|
|
||||||
|
/// Runs the Ruby binding smoke tests.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestRubyCommand {
|
||||||
|
/// Skip installing the bundler gem before running tests.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_bundler_install: bool,
|
||||||
|
|
||||||
|
/// Skip the Rust clippy pass prior to executing the Ruby test suite.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_clippy: bool,
|
||||||
|
|
||||||
|
/// Propagate --frozen to cargo invocations ahead of the Ruby test suite.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestRubyCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let ruby_dir = workspace.join("bindings/ruby");
|
||||||
|
|
||||||
|
if !self.skip_bundler_install {
|
||||||
|
let mut gem = Command::new("gem");
|
||||||
|
gem.current_dir(&ruby_dir);
|
||||||
|
gem.arg("install");
|
||||||
|
gem.arg("bundler");
|
||||||
|
gem.arg("--user-install");
|
||||||
|
run_command(gem, "gem install bundler (bindings/ruby)")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut bundle_install = Command::new("bundle");
|
||||||
|
bundle_install.current_dir(&ruby_dir);
|
||||||
|
bundle_install.arg("install");
|
||||||
|
run_command(bundle_install, "bundle install (bindings/ruby)")?;
|
||||||
|
|
||||||
|
if !self.skip_clippy {
|
||||||
|
let mut clippy_args = vec![
|
||||||
|
OsString::from("clippy"),
|
||||||
|
OsString::from("--all-targets"),
|
||||||
|
OsString::from("--no-deps"),
|
||||||
|
];
|
||||||
|
if self.frozen {
|
||||||
|
clippy_args.insert(1, OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
clippy_args.push(OsString::from("--"));
|
||||||
|
clippy_args.push(OsString::from("-Dwarnings"));
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&ruby_dir,
|
||||||
|
"cargo clippy --all-targets --no-deps -- -Dwarnings (bindings/ruby)",
|
||||||
|
clippy_args,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut rake = Command::new("bundle");
|
||||||
|
rake.current_dir(&ruby_dir);
|
||||||
|
rake.arg("exec");
|
||||||
|
rake.arg("rake");
|
||||||
|
run_command(rake, "bundle exec rake (bindings/ruby)")
|
||||||
|
}
|
||||||
|
}
|
||||||
115
xtask/src/tasks/bindings/wasm.rs
Normal file
115
xtask/src/tasks/bindings/wasm.rs
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{run_command, workspace_root};
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct BuildWasmCommand {
|
||||||
|
/// Optimise the generated WASM artefacts (defaults to debug builds).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Target environment passed to wasm-pack (defaults to nodejs).
|
||||||
|
#[arg(long, value_name = "TARGET", default_value = "nodejs")]
|
||||||
|
pub target: String,
|
||||||
|
|
||||||
|
/// Override the directory that receives wasm-pack outputs.
|
||||||
|
#[arg(long, value_name = "PATH")]
|
||||||
|
pub out_dir: Option<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildWasmCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let wasm_dir = workspace.join("bindings/wasm");
|
||||||
|
build_wasm(
|
||||||
|
&wasm_dir,
|
||||||
|
self.release,
|
||||||
|
&self.target,
|
||||||
|
self.out_dir.as_deref(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestWasmCommand {
|
||||||
|
/// Optimise the generated WASM artefacts (defaults to debug builds).
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Target environment passed to wasm-pack (defaults to nodejs).
|
||||||
|
#[arg(long, value_name = "TARGET", default_value = "nodejs")]
|
||||||
|
pub target: String,
|
||||||
|
|
||||||
|
/// Override the directory that receives wasm-pack outputs.
|
||||||
|
#[arg(long, value_name = "PATH")]
|
||||||
|
pub out_dir: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Node.js executable used for the sample script.
|
||||||
|
#[arg(long, value_name = "EXE", default_value = "node")]
|
||||||
|
pub node: String,
|
||||||
|
|
||||||
|
/// Accepted for compatibility with CI; ignored because wasm-pack controls builds.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
|
||||||
|
/// Skip rebuilding the wasm artefacts before running the sample.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_build: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestWasmCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let wasm_dir = workspace.join("bindings/wasm");
|
||||||
|
|
||||||
|
if !self.skip_build {
|
||||||
|
build_wasm(
|
||||||
|
&wasm_dir,
|
||||||
|
self.release,
|
||||||
|
&self.target,
|
||||||
|
self.out_dir.as_deref(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
run_wasm_tests(&wasm_dir, self.release)?;
|
||||||
|
|
||||||
|
let mut node = Command::new(&self.node);
|
||||||
|
node.current_dir(&wasm_dir);
|
||||||
|
node.arg("test.js");
|
||||||
|
let label = format!("{} test.js (bindings/wasm)", self.node);
|
||||||
|
run_command(node, &label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_wasm(wasm_dir: &Path, release: bool, target: &str, out_dir: Option<&Path>) -> Result<()> {
|
||||||
|
let mut pack = Command::new("wasm-pack");
|
||||||
|
pack.current_dir(wasm_dir);
|
||||||
|
pack.arg("build");
|
||||||
|
pack.arg("--target");
|
||||||
|
pack.arg(target);
|
||||||
|
if release {
|
||||||
|
pack.arg("--release");
|
||||||
|
}
|
||||||
|
if let Some(out_dir) = out_dir {
|
||||||
|
pack.arg("--out-dir");
|
||||||
|
pack.arg(out_dir);
|
||||||
|
}
|
||||||
|
run_command(pack, "wasm-pack build (bindings/wasm)")
|
||||||
|
}
|
||||||
|
fn run_wasm_tests(wasm_dir: &Path, release: bool) -> Result<()> {
|
||||||
|
let mut test = Command::new("wasm-pack");
|
||||||
|
test.current_dir(wasm_dir);
|
||||||
|
test.arg("test");
|
||||||
|
test.arg("--node");
|
||||||
|
if release {
|
||||||
|
test.arg("--release");
|
||||||
|
}
|
||||||
|
run_command(test, "wasm-pack test --node (bindings/wasm)")
|
||||||
|
}
|
||||||
366
xtask/src/tasks/ci/mod.rs
Normal file
366
xtask/src/tasks/ci/mod.rs
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{
|
||||||
|
opa_passing_arguments, run_cargo_step as util_run_cargo_step, workspace_root,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub mod musl;
|
||||||
|
|
||||||
|
pub use musl::TestMuslCommand;
|
||||||
|
|
||||||
|
const DEFAULT_OPA_FEATURES: &str = "opa-testutil,serde_json/arbitrary_precision";
|
||||||
|
|
||||||
|
/// Mirrors the release-focused GitHub workflow locally.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct CiReleaseCommand {
|
||||||
|
/// Propagate --frozen to cargo invocations (match CI by passing --frozen).
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
|
||||||
|
/// Enable the supplied feature list across build and test steps (comma separated).
|
||||||
|
#[arg(long, value_delimiter = ',', value_name = "FEATURE")]
|
||||||
|
pub features: Vec<String>,
|
||||||
|
|
||||||
|
/// Override the feature set passed to the OPA tests.
|
||||||
|
#[arg(long, value_name = "FEATURES")]
|
||||||
|
pub opa_features: Option<String>,
|
||||||
|
|
||||||
|
/// Skip the `cargo build --all-features` phase.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_all_features_build: bool,
|
||||||
|
|
||||||
|
/// Skip the `cargo test --no-default-features` phase.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_no_default_features_tests: bool,
|
||||||
|
|
||||||
|
/// Skip the Azure Policy feature tests.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_azure_policy: bool,
|
||||||
|
|
||||||
|
/// Skip the Azure RBAC feature tests.
|
||||||
|
#[arg(long)]
|
||||||
|
pub skip_azure_rbac: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Mirrors the debug-focused GitHub workflow locally.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct CiDebugCommand {
|
||||||
|
/// Propagate --frozen to cargo invocations (match CI by passing --frozen).
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CiReleaseCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let opa_features = self
|
||||||
|
.opa_features
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_else(|| DEFAULT_OPA_FEATURES.to_string());
|
||||||
|
|
||||||
|
run_ci_suite(CiSuiteConfig {
|
||||||
|
release: true,
|
||||||
|
frozen: self.frozen,
|
||||||
|
include_fmt: true,
|
||||||
|
include_run_example: true,
|
||||||
|
include_azure_policy: !self.skip_azure_policy,
|
||||||
|
include_azure_rbac: !self.skip_azure_rbac,
|
||||||
|
include_all_features_build: !self.skip_all_features_build,
|
||||||
|
include_no_default_features_tests: !self.skip_no_default_features_tests,
|
||||||
|
base_features: self.features.clone(),
|
||||||
|
opa_features,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CiDebugCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
run_ci_suite(CiSuiteConfig {
|
||||||
|
release: false,
|
||||||
|
frozen: self.frozen,
|
||||||
|
include_fmt: false,
|
||||||
|
include_run_example: false,
|
||||||
|
include_azure_policy: false,
|
||||||
|
include_azure_rbac: true,
|
||||||
|
include_all_features_build: true,
|
||||||
|
include_no_default_features_tests: true,
|
||||||
|
base_features: Vec::new(),
|
||||||
|
opa_features: DEFAULT_OPA_FEATURES.to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CiSuiteConfig {
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
include_fmt: bool,
|
||||||
|
include_run_example: bool,
|
||||||
|
include_azure_policy: bool,
|
||||||
|
include_azure_rbac: bool,
|
||||||
|
include_all_features_build: bool,
|
||||||
|
include_no_default_features_tests: bool,
|
||||||
|
base_features: Vec<String>,
|
||||||
|
opa_features: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_ci_suite(config: CiSuiteConfig) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let joined_features = join_features(&config.base_features);
|
||||||
|
|
||||||
|
if config.include_fmt {
|
||||||
|
run_fmt(&workspace)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.include_all_features_build {
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"build",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
None,
|
||||||
|
&["--all-features"],
|
||||||
|
"cargo build --all-features (ci)",
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"build",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
joined_features.as_deref(),
|
||||||
|
&[],
|
||||||
|
"cargo build (ci)",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
if config.include_no_default_features_tests {
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"test",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
None,
|
||||||
|
&["--no-default-features"],
|
||||||
|
"cargo test --no-default-features (ci)",
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let example_features = example_features(&config.base_features);
|
||||||
|
let example_label = format!(
|
||||||
|
"cargo build --example regorus --no-default-features --features {} (ci)",
|
||||||
|
example_features
|
||||||
|
);
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"build",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
Some(&example_features),
|
||||||
|
&["--example", "regorus", "--no-default-features"],
|
||||||
|
&example_label,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"test",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
joined_features.as_deref(),
|
||||||
|
&["--doc"],
|
||||||
|
"cargo test --doc (ci)",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"test",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
joined_features.as_deref(),
|
||||||
|
&[],
|
||||||
|
"cargo test (ci)",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
if config.include_run_example {
|
||||||
|
run_example(
|
||||||
|
&workspace,
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
joined_features.as_deref(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
run_named_test(
|
||||||
|
&workspace,
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
joined_features.as_deref(),
|
||||||
|
"aci",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
run_named_test(
|
||||||
|
&workspace,
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
joined_features.as_deref(),
|
||||||
|
"kata",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
run_opa_tests(
|
||||||
|
&workspace,
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
&config.opa_features,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
if config.include_azure_policy {
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"test",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
None,
|
||||||
|
&["--features", "azure_policy"],
|
||||||
|
"cargo test --features azure_policy (ci)",
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.include_azure_rbac {
|
||||||
|
run_ci_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"test",
|
||||||
|
config.release,
|
||||||
|
config.frozen,
|
||||||
|
None,
|
||||||
|
&["--features", "azure-rbac"],
|
||||||
|
"cargo test --features azure-rbac (ci)",
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn join_features(features: &[String]) -> Option<String> {
|
||||||
|
if features.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(features.join(","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn example_features(base: &[String]) -> String {
|
||||||
|
let mut features = Vec::with_capacity(base.len() + 1);
|
||||||
|
features.push(String::from("std"));
|
||||||
|
features.extend(base.iter().cloned());
|
||||||
|
features.join(",")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_fmt(workspace: &Path) -> Result<()> {
|
||||||
|
util_run_cargo_step(
|
||||||
|
workspace,
|
||||||
|
"cargo xtask fmt --check",
|
||||||
|
["xtask", "fmt", "--check"],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_ci_cargo_step(
|
||||||
|
workspace: &Path,
|
||||||
|
subcommand: &str,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
features: Option<&str>,
|
||||||
|
extra: &[&str],
|
||||||
|
label: &str,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut args = base_cargo_args(subcommand, release, frozen, features);
|
||||||
|
for arg in extra {
|
||||||
|
args.push(OsString::from(*arg));
|
||||||
|
}
|
||||||
|
util_run_cargo_step(workspace, label, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_named_test(
|
||||||
|
workspace: &Path,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
features: Option<&str>,
|
||||||
|
name: &str,
|
||||||
|
) -> Result<()> {
|
||||||
|
let label = format!("cargo test --test {} (ci)", name);
|
||||||
|
run_ci_cargo_step(
|
||||||
|
workspace,
|
||||||
|
"test",
|
||||||
|
release,
|
||||||
|
frozen,
|
||||||
|
features,
|
||||||
|
&["--test", name],
|
||||||
|
&label,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_example(
|
||||||
|
workspace: &Path,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
features: Option<&str>,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut args = base_cargo_args("run", release, frozen, features);
|
||||||
|
args.extend(
|
||||||
|
[
|
||||||
|
"--example",
|
||||||
|
"regorus",
|
||||||
|
"--",
|
||||||
|
"eval",
|
||||||
|
"-d",
|
||||||
|
"examples/server/allowed_server.rego",
|
||||||
|
"-i",
|
||||||
|
"examples/server/input.json",
|
||||||
|
"data.example",
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.map(OsString::from),
|
||||||
|
);
|
||||||
|
|
||||||
|
util_run_cargo_step(workspace, "cargo run --example regorus (ci)", args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_opa_tests(workspace: &Path, release: bool, frozen: bool, features: &str) -> Result<()> {
|
||||||
|
let tests = opa_passing_arguments(workspace)?;
|
||||||
|
let mut args = base_cargo_args("test", release, frozen, Some(features));
|
||||||
|
args.push(OsString::from("--test"));
|
||||||
|
args.push(OsString::from("opa"));
|
||||||
|
args.push(OsString::from("--"));
|
||||||
|
for entry in tests {
|
||||||
|
args.push(OsString::from(entry));
|
||||||
|
}
|
||||||
|
|
||||||
|
let label = format!("cargo test --test opa --features {} (ci)", features);
|
||||||
|
util_run_cargo_step(workspace, &label, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn base_cargo_args(
|
||||||
|
subcommand: &str,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
features: Option<&str>,
|
||||||
|
) -> Vec<OsString> {
|
||||||
|
let mut args = vec![OsString::from(subcommand)];
|
||||||
|
if release {
|
||||||
|
args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
if frozen {
|
||||||
|
args.push(OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
if let Some(features) = features {
|
||||||
|
if !features.is_empty() {
|
||||||
|
args.push(OsString::from("--features"));
|
||||||
|
args.push(OsString::from(features));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args
|
||||||
|
}
|
||||||
150
xtask/src/tasks/ci/musl.rs
Normal file
150
xtask/src/tasks/ci/musl.rs
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::process::{Command, Stdio};
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{
|
||||||
|
opa_passing_arguments, run_cargo_step as util_run_cargo_step, workspace_root,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Exercises the MUSL build and test matrix used in CI.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestMuslCommand {
|
||||||
|
/// Target triple to compile and test against.
|
||||||
|
#[arg(long, default_value = "x86_64-unknown-linux-musl")]
|
||||||
|
pub target: String,
|
||||||
|
|
||||||
|
/// Compile artefacts in release mode.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Propagate --frozen to all cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
|
||||||
|
/// Feature list passed to the OPA conformance tests.
|
||||||
|
#[arg(long, default_value = "opa-testutil,serde_json/arbitrary_precision")]
|
||||||
|
pub opa_features: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestMuslCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
ensure_musl_gcc()?;
|
||||||
|
|
||||||
|
let workspace = workspace_root();
|
||||||
|
|
||||||
|
run_build_all_targets(&workspace, &self.target, self.release, self.frozen)?;
|
||||||
|
run_cargo_test(&workspace, &self.target, self.release, self.frozen, &[])?;
|
||||||
|
run_named_test(&workspace, &self.target, self.release, self.frozen, "aci")?;
|
||||||
|
run_named_test(&workspace, &self.target, self.release, self.frozen, "kata")?;
|
||||||
|
run_opa_tests(
|
||||||
|
&workspace,
|
||||||
|
&self.target,
|
||||||
|
self.release,
|
||||||
|
self.frozen,
|
||||||
|
&self.opa_features,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ensure_musl_gcc() -> Result<()> {
|
||||||
|
let status = Command::new("musl-gcc")
|
||||||
|
.arg("--version")
|
||||||
|
.stdout(Stdio::null())
|
||||||
|
.stderr(Stdio::null())
|
||||||
|
.status();
|
||||||
|
|
||||||
|
match status {
|
||||||
|
Ok(result) if result.success() => Ok(()),
|
||||||
|
_ => Err(anyhow!(
|
||||||
|
"musl-gcc is required but was not found in PATH. Install musl-tools to continue."
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn run_build_all_targets(
|
||||||
|
workspace: &Path,
|
||||||
|
target: &str,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut args = cargo_target_args("build", target, release, frozen);
|
||||||
|
args.push(OsString::from("--all-targets"));
|
||||||
|
util_run_cargo_step(workspace, "cargo build --all-targets (musl)", args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_cargo_test(
|
||||||
|
workspace: &Path,
|
||||||
|
target: &str,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
extra: &[&str],
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut args = cargo_target_args("test", target, release, frozen);
|
||||||
|
for arg in extra {
|
||||||
|
args.push(OsString::from(*arg));
|
||||||
|
}
|
||||||
|
let mut label = String::from("cargo test (musl)");
|
||||||
|
if release {
|
||||||
|
label.push_str(" --release");
|
||||||
|
}
|
||||||
|
if !extra.is_empty() {
|
||||||
|
label.push(' ');
|
||||||
|
label.push_str(&extra.join(" "));
|
||||||
|
}
|
||||||
|
util_run_cargo_step(workspace, &label, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_named_test(
|
||||||
|
workspace: &Path,
|
||||||
|
target: &str,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
name: &str,
|
||||||
|
) -> Result<()> {
|
||||||
|
run_cargo_test(workspace, target, release, frozen, &["--test", name])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_opa_tests(
|
||||||
|
workspace: &Path,
|
||||||
|
target: &str,
|
||||||
|
release: bool,
|
||||||
|
frozen: bool,
|
||||||
|
features: &str,
|
||||||
|
) -> Result<()> {
|
||||||
|
let tests = opa_passing_arguments(workspace)?;
|
||||||
|
let mut args = cargo_target_args("test", target, release, frozen);
|
||||||
|
args.push(OsString::from("--features"));
|
||||||
|
args.push(OsString::from(features));
|
||||||
|
args.push(OsString::from("--test"));
|
||||||
|
args.push(OsString::from("opa"));
|
||||||
|
args.push(OsString::from("--"));
|
||||||
|
for entry in tests {
|
||||||
|
args.push(OsString::from(entry));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut label = format!("cargo test --test opa --features {} (musl)", features);
|
||||||
|
if release {
|
||||||
|
label.push_str(" --release");
|
||||||
|
}
|
||||||
|
|
||||||
|
util_run_cargo_step(workspace, &label, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cargo_target_args(subcommand: &str, target: &str, release: bool, frozen: bool) -> Vec<OsString> {
|
||||||
|
let mut args = vec![OsString::from(subcommand)];
|
||||||
|
if release {
|
||||||
|
args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
if frozen {
|
||||||
|
args.push(OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
args.push(OsString::from("--locked"));
|
||||||
|
args.push(OsString::from("--target"));
|
||||||
|
args.push(OsString::from(target));
|
||||||
|
args
|
||||||
|
}
|
||||||
141
xtask/src/tasks/dev/clippy.rs
Normal file
141
xtask/src/tasks/dev/clippy.rs
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::fs::File;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::{Command, Stdio};
|
||||||
|
|
||||||
|
use anyhow::{Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{run_cargo_step, run_command, workspace_root};
|
||||||
|
|
||||||
|
const BINDING_MANIFESTS: &[&str] = &[
|
||||||
|
"bindings/ffi/Cargo.toml",
|
||||||
|
"bindings/java/Cargo.toml",
|
||||||
|
"bindings/python/Cargo.toml",
|
||||||
|
"bindings/wasm/Cargo.toml",
|
||||||
|
// TODO: Reenable this once Ruby binding is actively maintained
|
||||||
|
//"bindings/ruby/Cargo.toml",
|
||||||
|
];
|
||||||
|
|
||||||
|
/// Runs Clippy across the workspace and binding crates with CI-equivalent checks.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct ClippyCommand {
|
||||||
|
/// Emit SARIF output to the supplied path (relative to the workspace by default).
|
||||||
|
#[arg(long, value_name = "PATH")]
|
||||||
|
pub sarif: Option<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ClippyCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
|
||||||
|
match self.sarif.as_ref() {
|
||||||
|
Some(sarif) => run_clippy_with_sarif(&workspace, sarif)?,
|
||||||
|
None => {
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo clippy --all-targets --all-features -- -Dwarnings",
|
||||||
|
[
|
||||||
|
"clippy",
|
||||||
|
"--all-targets",
|
||||||
|
"--all-features",
|
||||||
|
"--",
|
||||||
|
"-Dwarnings",
|
||||||
|
],
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo clippy --no-default-features -- -Dwarnings",
|
||||||
|
["clippy", "--no-default-features", "--", "-Dwarnings"],
|
||||||
|
)?;
|
||||||
|
|
||||||
|
for manifest in BINDING_MANIFESTS {
|
||||||
|
let label =
|
||||||
|
format!("cargo clippy --manifest-path {manifest} --all-targets -- -Dwarnings");
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
&label,
|
||||||
|
[
|
||||||
|
"clippy",
|
||||||
|
"--manifest-path",
|
||||||
|
manifest,
|
||||||
|
"--all-targets",
|
||||||
|
"--",
|
||||||
|
"-Dwarnings",
|
||||||
|
],
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_clippy_with_sarif(workspace: &Path, sarif: &Path) -> Result<()> {
|
||||||
|
let sarif_path = if sarif.is_absolute() {
|
||||||
|
sarif.to_path_buf()
|
||||||
|
} else {
|
||||||
|
workspace.join(sarif)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(parent) = sarif_path.parent() {
|
||||||
|
std::fs::create_dir_all(parent)
|
||||||
|
.with_context(|| format!("failed to create SARIF directory at {}", parent.display()))?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let xtask_target = workspace.join("target").join("xtask");
|
||||||
|
std::fs::create_dir_all(&xtask_target).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to ensure xtask scratch directory at {}",
|
||||||
|
xtask_target.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
let json_path = xtask_target.join("clippy.json");
|
||||||
|
|
||||||
|
let json_file = File::create(&json_path).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to create intermediate clippy output at {}",
|
||||||
|
json_path.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let mut cargo = Command::new("cargo");
|
||||||
|
cargo.current_dir(workspace);
|
||||||
|
cargo.arg("clippy");
|
||||||
|
cargo.arg("--all-targets");
|
||||||
|
cargo.arg("--all-features");
|
||||||
|
cargo.arg("--message-format=json");
|
||||||
|
cargo.arg("--");
|
||||||
|
cargo.arg("-Dwarnings");
|
||||||
|
cargo.stdout(Stdio::from(json_file));
|
||||||
|
run_command(
|
||||||
|
cargo,
|
||||||
|
"cargo clippy --all-targets --all-features --message-format=json -- -Dwarnings",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let json_input = File::open(&json_path).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to reopen clippy JSON output at {}",
|
||||||
|
json_path.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
let sarif_file = File::create(&sarif_path)
|
||||||
|
.with_context(|| format!("failed to create SARIF output at {}", sarif_path.display()))?;
|
||||||
|
|
||||||
|
let mut sarif_cmd = Command::new("clippy-sarif");
|
||||||
|
sarif_cmd.stdin(Stdio::from(json_input));
|
||||||
|
sarif_cmd.stdout(Stdio::from(sarif_file));
|
||||||
|
run_command(sarif_cmd, "clippy-sarif")?;
|
||||||
|
|
||||||
|
let mut fmt = Command::new("sarif-fmt");
|
||||||
|
fmt.arg(&sarif_path);
|
||||||
|
run_command(fmt, "sarif-fmt")?;
|
||||||
|
|
||||||
|
println!("SARIF report written to {}", sarif_path.display());
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
56
xtask/src/tasks/dev/fmt.rs
Normal file
56
xtask/src/tasks/dev/fmt.rs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{run_cargo_step, workspace_root};
|
||||||
|
|
||||||
|
const BINDING_MANIFESTS: &[&str] = &[
|
||||||
|
"bindings/ffi/Cargo.toml",
|
||||||
|
"bindings/java/Cargo.toml",
|
||||||
|
"bindings/python/Cargo.toml",
|
||||||
|
"bindings/wasm/Cargo.toml",
|
||||||
|
"bindings/ruby/Cargo.toml",
|
||||||
|
];
|
||||||
|
|
||||||
|
/// Formats every Rust crate in the repository, including binding workspaces.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct FmtCommand {
|
||||||
|
/// Fail instead of writing edits when formatting differs
|
||||||
|
#[arg(long)]
|
||||||
|
check: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FmtCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
|
||||||
|
let mut fmt_args = vec!["fmt", "--all"];
|
||||||
|
if self.check {
|
||||||
|
fmt_args.extend(["--", "--check"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let fmt_label = if self.check {
|
||||||
|
"cargo fmt --all -- --check"
|
||||||
|
} else {
|
||||||
|
"cargo fmt --all"
|
||||||
|
};
|
||||||
|
|
||||||
|
run_cargo_step(&workspace, fmt_label, fmt_args)?;
|
||||||
|
|
||||||
|
for manifest in BINDING_MANIFESTS {
|
||||||
|
let mut args = vec!["fmt", "--manifest-path", *manifest];
|
||||||
|
let label = if self.check {
|
||||||
|
args.extend(["--", "--check"]);
|
||||||
|
format!("cargo fmt --manifest-path {manifest} -- --check")
|
||||||
|
} else {
|
||||||
|
format!("cargo fmt --manifest-path {manifest}")
|
||||||
|
};
|
||||||
|
|
||||||
|
run_cargo_step(&workspace, &label, args)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
12
xtask/src/tasks/dev/mod.rs
Normal file
12
xtask/src/tasks/dev/mod.rs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
pub mod clippy;
|
||||||
|
pub mod fmt;
|
||||||
|
pub mod precommit;
|
||||||
|
pub mod prepush;
|
||||||
|
|
||||||
|
pub use clippy::ClippyCommand;
|
||||||
|
pub use fmt::FmtCommand;
|
||||||
|
pub use precommit::PrecommitCommand;
|
||||||
|
pub use prepush::PrepushCommand;
|
||||||
90
xtask/src/tasks/dev/precommit.rs
Normal file
90
xtask/src/tasks/dev/precommit.rs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::collections::HashSet;
|
||||||
|
use std::io::Write;
|
||||||
|
use std::process::{Command, Stdio};
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{log_step, run_cargo_step, workspace_root};
|
||||||
|
|
||||||
|
/// Runs the repository's pre-commit validation sequence.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct PrecommitCommand;
|
||||||
|
|
||||||
|
impl PrecommitCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
|
||||||
|
log_step("cargo build --all-targets");
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo build --all-targets",
|
||||||
|
["build", "--all-targets"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-commit: cargo build --all-targets failed".to_string())?;
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo xtask fmt --check",
|
||||||
|
["xtask", "fmt", "--check"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-commit: cargo xtask fmt --check failed".to_string())?;
|
||||||
|
|
||||||
|
run_cargo_step(&workspace, "cargo xtask clippy", ["xtask", "clippy"])
|
||||||
|
.with_context(|| "pre-commit: cargo xtask clippy failed".to_string())?;
|
||||||
|
|
||||||
|
log_step("git status --short");
|
||||||
|
verify_clean_status(&workspace)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn verify_clean_status(root: &std::path::Path) -> Result<()> {
|
||||||
|
let mut git = Command::new("git");
|
||||||
|
git.current_dir(root);
|
||||||
|
git.arg("status");
|
||||||
|
git.arg("-s");
|
||||||
|
git.stdout(Stdio::piped());
|
||||||
|
|
||||||
|
let output = git
|
||||||
|
.output()
|
||||||
|
.with_context(|| format!("failed to inspect git status in {}", root.display()))?;
|
||||||
|
|
||||||
|
if !output.status.success() {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"git status -s exited with status {}",
|
||||||
|
output.status
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let stdout = String::from_utf8(output.stdout)
|
||||||
|
.with_context(|| "git status output was not UTF-8".to_string())?;
|
||||||
|
|
||||||
|
let interesting: HashSet<&str> = ["MM", "??", "AM", " M"].into_iter().collect();
|
||||||
|
let mut flagged = Vec::new();
|
||||||
|
for line in stdout.lines() {
|
||||||
|
if line.len() >= 2 {
|
||||||
|
let status = &line[..2];
|
||||||
|
if interesting.contains(status) {
|
||||||
|
flagged.push(line.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if flagged.is_empty() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut stderr = std::io::stderr();
|
||||||
|
writeln!(stderr, "\nUnstaged changes found:").ok();
|
||||||
|
for entry in &flagged {
|
||||||
|
writeln!(stderr, "{}", entry).ok();
|
||||||
|
}
|
||||||
|
writeln!(stderr, "Stage them and try again").ok();
|
||||||
|
|
||||||
|
Err(anyhow!("repository contains unstaged changes"))
|
||||||
|
}
|
||||||
149
xtask/src/tasks/dev/prepush.rs
Normal file
149
xtask/src/tasks/dev/prepush.rs
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::path::Path;
|
||||||
|
use std::process::{Command, Stdio};
|
||||||
|
|
||||||
|
use anyhow::{Context, Result};
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use super::precommit::PrecommitCommand;
|
||||||
|
use crate::tasks::util::{
|
||||||
|
log_step, opa_passing_arguments, run_cargo_step, run_command, workspace_root,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Runs the repository's pre-push validation sequence.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct PrepushCommand;
|
||||||
|
|
||||||
|
impl PrepushCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
|
||||||
|
log_step("pre-commit checks");
|
||||||
|
PrecommitCommand::default()
|
||||||
|
.run()
|
||||||
|
.with_context(|| "pre-push: pre-commit sequence failed".to_string())?;
|
||||||
|
|
||||||
|
run_cargo_step(&workspace, "cargo test --doc", ["test", "--doc"])
|
||||||
|
.with_context(|| "pre-push: cargo test --doc failed".to_string())?;
|
||||||
|
|
||||||
|
if rustup_available() {
|
||||||
|
log_step("rustup target add thumbv7m-none-eabi");
|
||||||
|
let mut rustup = Command::new("rustup");
|
||||||
|
rustup.arg("target");
|
||||||
|
rustup.arg("add");
|
||||||
|
rustup.arg("thumbv7m-none-eabi");
|
||||||
|
run_command(rustup, "rustup target add thumbv7m-none-eabi")
|
||||||
|
.with_context(|| "pre-push: rustup target add failed".to_string())?;
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo xtask test-no-std",
|
||||||
|
["xtask", "test-no-std"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-push: cargo xtask test-no-std failed".to_string())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo build --example regorus --no-default-features --features std",
|
||||||
|
[
|
||||||
|
"build",
|
||||||
|
"--example",
|
||||||
|
"regorus",
|
||||||
|
"--no-default-features",
|
||||||
|
"--features",
|
||||||
|
"std",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
.with_context(|| {
|
||||||
|
"pre-push: cargo build --example regorus --no-default-features --features std failed"
|
||||||
|
.to_string()
|
||||||
|
})?;
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo build --all-features",
|
||||||
|
["build", "--all-features"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-push: cargo build --all-features failed".to_string())?;
|
||||||
|
|
||||||
|
run_cargo_step(&workspace, "cargo test", ["test"])
|
||||||
|
.with_context(|| "pre-push: cargo test failed".to_string())?;
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo test --test aci",
|
||||||
|
["test", "--test", "aci"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-push: cargo test --test aci failed".to_string())?;
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo test --test kata",
|
||||||
|
["test", "--test", "kata"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-push: cargo test --test kata failed".to_string())?;
|
||||||
|
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo test --features rego-extensions",
|
||||||
|
["test", "--features", "rego-extensions"],
|
||||||
|
)
|
||||||
|
.with_context(|| "pre-push: cargo test --features rego-extensions failed".to_string())?;
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo test --test aci --features rego-extensions",
|
||||||
|
["test", "--test", "aci", "--features", "rego-extensions"],
|
||||||
|
)
|
||||||
|
.with_context(|| {
|
||||||
|
"pre-push: cargo test --test aci --features rego-extensions failed".to_string()
|
||||||
|
})?;
|
||||||
|
run_cargo_step(
|
||||||
|
&workspace,
|
||||||
|
"cargo test --test kata --features rego-extensions",
|
||||||
|
["test", "--test", "kata", "--features", "rego-extensions"],
|
||||||
|
)
|
||||||
|
.with_context(|| {
|
||||||
|
"pre-push: cargo test --test kata --features rego-extensions failed".to_string()
|
||||||
|
})?;
|
||||||
|
|
||||||
|
log_step("cargo test --features opa-testutil,serde_json/arbitrary_precision,rego-extensions --test opa");
|
||||||
|
run_opa_conformance(&workspace).with_context(|| {
|
||||||
|
"pre-push: cargo test --features opa-testutil,serde_json/arbitrary_precision,rego-extensions --test opa failed"
|
||||||
|
.to_string()
|
||||||
|
})?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_opa_conformance(root: &Path) -> Result<()> {
|
||||||
|
let tests = opa_passing_arguments(root)?;
|
||||||
|
let mut cmd = Command::new("cargo");
|
||||||
|
cmd.current_dir(root);
|
||||||
|
cmd.arg("test");
|
||||||
|
cmd.arg("--features");
|
||||||
|
cmd.arg("opa-testutil,serde_json/arbitrary_precision,rego-extensions");
|
||||||
|
cmd.arg("--test");
|
||||||
|
cmd.arg("opa");
|
||||||
|
cmd.arg("--");
|
||||||
|
for entry in tests {
|
||||||
|
cmd.arg(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
run_command(
|
||||||
|
cmd,
|
||||||
|
"cargo test --features opa-testutil,serde_json/arbitrary_precision,rego-extensions --test opa",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rustup_available() -> bool {
|
||||||
|
let mut probe = Command::new("rustup");
|
||||||
|
probe.arg("--version");
|
||||||
|
probe.stdout(Stdio::null());
|
||||||
|
probe.stderr(Stdio::null());
|
||||||
|
probe
|
||||||
|
.status()
|
||||||
|
.map(|status| status.success())
|
||||||
|
.unwrap_or(false)
|
||||||
|
}
|
||||||
@@ -2,7 +2,19 @@
|
|||||||
// Licensed under the MIT License.
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
pub mod bindings;
|
pub mod bindings;
|
||||||
|
pub mod ci;
|
||||||
|
pub mod dev;
|
||||||
|
pub mod no_std;
|
||||||
pub mod update_deps;
|
pub mod update_deps;
|
||||||
|
mod util;
|
||||||
|
|
||||||
pub use bindings::BindingsCommand;
|
pub use bindings::{
|
||||||
|
BindingsCommand, BuildAllBindingsCommand, BuildFfiCommand, BuildJavaCommand, BuildNugetCommand,
|
||||||
|
BuildPythonCommand, BuildWasmCommand, TestAllBindingsCommand, TestCCommand, TestCNoStdCommand,
|
||||||
|
TestCppCommand, TestCsharpCommand, TestFfiCommand, TestGoCommand, TestJavaCommand,
|
||||||
|
TestPythonCommand, TestRubyCommand, TestWasmCommand,
|
||||||
|
};
|
||||||
|
pub use ci::{CiDebugCommand, CiReleaseCommand, TestMuslCommand};
|
||||||
|
pub use dev::{ClippyCommand, FmtCommand, PrecommitCommand, PrepushCommand};
|
||||||
|
pub use no_std::TestNoStdCommand;
|
||||||
pub use update_deps::UpdateDepsCommand;
|
pub use update_deps::UpdateDepsCommand;
|
||||||
|
|||||||
46
xtask/src/tasks/no_std.rs
Normal file
46
xtask/src/tasks/no_std.rs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::OsString;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Args;
|
||||||
|
|
||||||
|
use crate::tasks::util::{run_cargo_step, workspace_root};
|
||||||
|
|
||||||
|
/// Builds the ensure_no_std harness for an embedded target.
|
||||||
|
#[derive(Args, Default)]
|
||||||
|
pub struct TestNoStdCommand {
|
||||||
|
/// Target triple to compile (defaults to thumbv7m-none-eabi).
|
||||||
|
#[arg(long, default_value = "thumbv7m-none-eabi")]
|
||||||
|
pub target: String,
|
||||||
|
|
||||||
|
/// Compile artefacts in release mode.
|
||||||
|
#[arg(long)]
|
||||||
|
pub release: bool,
|
||||||
|
|
||||||
|
/// Propagate --frozen to the cargo invocations.
|
||||||
|
#[arg(long)]
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestNoStdCommand {
|
||||||
|
pub fn run(&self) -> Result<()> {
|
||||||
|
let workspace = workspace_root();
|
||||||
|
let project_dir = workspace.join("tests/ensure_no_std");
|
||||||
|
|
||||||
|
let mut args = vec![
|
||||||
|
OsString::from("build"),
|
||||||
|
OsString::from("--target"),
|
||||||
|
OsString::from(&self.target),
|
||||||
|
];
|
||||||
|
if self.release {
|
||||||
|
args.push(OsString::from("--release"));
|
||||||
|
}
|
||||||
|
if self.frozen {
|
||||||
|
args.push(OsString::from("--frozen"));
|
||||||
|
}
|
||||||
|
run_cargo_step(&project_dir, "cargo build (tests/ensure_no_std)", args)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
151
xtask/src/tasks/util.rs
Normal file
151
xtask/src/tasks/util.rs
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
use std::ffi::{OsStr, OsString};
|
||||||
|
use std::fs;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use anyhow::{bail, Context, Result};
|
||||||
|
|
||||||
|
/// Returns the root of the workspace that hosts the xtask crate.
|
||||||
|
pub fn workspace_root() -> PathBuf {
|
||||||
|
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
||||||
|
.parent()
|
||||||
|
.expect("xtask resides in workspace root")
|
||||||
|
.to_path_buf()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Runs a command, surfaces the command line, and maps a failing exit status to an error.
|
||||||
|
pub fn run_command(mut command: Command, label: &str) -> Result<()> {
|
||||||
|
let display = format_command(&command);
|
||||||
|
println!("$ {}", display);
|
||||||
|
|
||||||
|
let status = command
|
||||||
|
.status()
|
||||||
|
.with_context(|| format!("failed to spawn {}", label))?;
|
||||||
|
if !status.success() {
|
||||||
|
bail!("{} failed with status {}", label, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Prints a simple section header to highlight the upcoming action.
|
||||||
|
pub fn log_step(title: &str) {
|
||||||
|
println!("\n=== {} ===", title);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Logs a section heading and executes a cargo subcommand.
|
||||||
|
pub fn run_cargo_step<I, S>(workspace: &Path, title: &str, args: I) -> Result<()>
|
||||||
|
where
|
||||||
|
I: IntoIterator<Item = S>,
|
||||||
|
S: AsRef<OsStr>,
|
||||||
|
{
|
||||||
|
run_cargo_in_step(workspace, title, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Logs a section heading and executes a cargo subcommand within the provided directory.
|
||||||
|
pub fn run_cargo_in_step<I, S>(directory: &Path, title: &str, args: I) -> Result<()>
|
||||||
|
where
|
||||||
|
I: IntoIterator<Item = S>,
|
||||||
|
S: AsRef<OsStr>,
|
||||||
|
{
|
||||||
|
let heading = format!("Running {}", title);
|
||||||
|
log_step(&heading);
|
||||||
|
let mut command = Command::new("cargo");
|
||||||
|
command.current_dir(directory);
|
||||||
|
command.args(args);
|
||||||
|
run_command(command, title)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Formats a command with its arguments for diagnostic output.
|
||||||
|
pub fn format_command(command: &Command) -> String {
|
||||||
|
let mut parts = Vec::new();
|
||||||
|
parts.push(command.get_program().to_string_lossy().into_owned());
|
||||||
|
for arg in command.get_args() {
|
||||||
|
parts.push(arg.to_string_lossy().into_owned());
|
||||||
|
}
|
||||||
|
parts.join(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deduplicates the provided vector while preserving the original order.
|
||||||
|
pub fn dedup(values: &mut Vec<String>) {
|
||||||
|
let mut unique = Vec::new();
|
||||||
|
for value in values.drain(..) {
|
||||||
|
if unique.iter().any(|existing| existing == &value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
unique.push(value);
|
||||||
|
}
|
||||||
|
*values = unique;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the platform-specific path list separator character.
|
||||||
|
pub fn path_separator() -> &'static str {
|
||||||
|
if cfg!(windows) {
|
||||||
|
";"
|
||||||
|
} else {
|
||||||
|
":"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the environment variable used for dynamic library lookup.
|
||||||
|
pub fn library_search_env_var() -> &'static str {
|
||||||
|
if cfg!(windows) {
|
||||||
|
"PATH"
|
||||||
|
} else if cfg!(target_os = "macos") {
|
||||||
|
"DYLD_LIBRARY_PATH"
|
||||||
|
} else {
|
||||||
|
"LD_LIBRARY_PATH"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ensures the provided directory is prepended to the requested environment variable.
|
||||||
|
pub fn prepend_env_path(command: &mut Command, key: &str, dir: &Path) {
|
||||||
|
let mut value = OsString::new();
|
||||||
|
value.push(dir);
|
||||||
|
|
||||||
|
if let Some(existing) = std::env::var_os(key) {
|
||||||
|
if !existing.is_empty() {
|
||||||
|
value.push(path_separator());
|
||||||
|
value.push(existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
command.env(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Prepends the supplied directory to the standard dynamic library search path.
|
||||||
|
pub fn add_library_search_path(command: &mut Command, dir: &Path) {
|
||||||
|
let key = library_search_env_var();
|
||||||
|
prepend_env_path(command, key, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the host architecture string expected by dotnet CLI switches.
|
||||||
|
pub fn dotnet_host_arch() -> &'static str {
|
||||||
|
match std::env::consts::ARCH {
|
||||||
|
"aarch64" => "arm64",
|
||||||
|
"x86_64" => "x64",
|
||||||
|
"arm" => "arm",
|
||||||
|
"x86" => "x86",
|
||||||
|
_ => "x64",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Loads the list of passing OPA tests from the repository.
|
||||||
|
pub fn opa_passing_arguments(root: &Path) -> Result<Vec<String>> {
|
||||||
|
let listing = root.join("tests/opa.passing");
|
||||||
|
let contents = fs::read_to_string(&listing).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"failed to read list of passing OPA tests from {}",
|
||||||
|
listing.display()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
Ok(contents
|
||||||
|
.split_whitespace()
|
||||||
|
.filter(|entry| !entry.is_empty())
|
||||||
|
.map(|entry| entry.to_string())
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user