From 5bc359e1584c6e92c0a4bb7b5b3b066824eb1561 Mon Sep 17 00:00:00 2001 From: Aditya Sharma Date: Tue, 28 Jul 2026 18:56:15 -0700 Subject: [PATCH 1/3] build: stabilize framework phase zero Pin framework consumers to the immutable BumpyClock GPUI fork and add compatibility, publication, testing, and release gates while crates.io publication remains deferred. --- .agents/skills/update-gpui/SKILL.md | 73 +- .cargo/config.toml | 3 + .claude/skills/update-gpui/SKILL.md | 78 +- .github/ISSUE_TEMPLATE/01_bug.md | 2 +- .github/workflows/ci.yml | 64 +- .github/workflows/release-docs.yml | 2 +- .github/workflows/release.yml | 16 +- .gitmodules | 3 - AGENTS.md | 6 +- Cargo.lock | 340 +- Cargo.toml | 26 +- LEARNINGS.md | 27 +- LICENSE-AUDIT.md | 29 + README.md | 29 +- RELEASING.md | 64 + TESTING.md | 71 + compatibility.toml | 116 + crates/app-manifest/Cargo.toml | 6 +- crates/app-manifest/LICENSE-APACHE | 191 + crates/app-manifest/README.md | 3 + crates/app-storage/Cargo.toml | 6 +- crates/app-storage/LICENSE-APACHE | 191 + crates/app-storage/README.md | 3 + crates/app/Cargo.toml | 5 +- crates/assets/Cargo.toml | 9 +- crates/assets/LICENSE-APACHE | 191 + crates/macros/Cargo.toml | 7 +- crates/macros/README.md | 3 + crates/ui/Cargo.toml | 3 +- crates/webview/Cargo.toml | 3 +- crates/webview/LICENSE-APACHE | 191 + docs/.vitepress/theme/index.ts | 2 +- docs/COMPATIBILITY.md | 105 +- docs/docs/getting-started.md | 19 +- docs/docs/index.md | 11 +- docs/docs/installation.md | 23 +- docs/learned/app-platform-plan.md | 2 +- docs/learned/gpui-submodule.md | 78 +- examples/system_monitor/Cargo.lock | 7314 --------------------------- typos.toml | 1 - vendor/gpui | 1 - xtask/Cargo.toml | 18 + xtask/src/main.rs | 2022 ++++++++ xtask/src/tests.rs | 625 +++ 44 files changed, 4215 insertions(+), 7767 deletions(-) delete mode 100644 .gitmodules create mode 100644 LICENSE-AUDIT.md create mode 100644 RELEASING.md create mode 100644 TESTING.md create mode 100644 compatibility.toml create mode 100644 crates/app-manifest/LICENSE-APACHE create mode 100644 crates/app-manifest/README.md create mode 100644 crates/app-storage/LICENSE-APACHE create mode 100644 crates/app-storage/README.md create mode 100644 crates/assets/LICENSE-APACHE create mode 100644 crates/macros/README.md create mode 100644 crates/webview/LICENSE-APACHE delete mode 100644 examples/system_monitor/Cargo.lock delete mode 160000 vendor/gpui create mode 100644 xtask/Cargo.toml create mode 100644 xtask/src/main.rs create mode 100644 xtask/src/tests.rs diff --git a/.agents/skills/update-gpui/SKILL.md b/.agents/skills/update-gpui/SKILL.md index 76e2d283..07ad9474 100644 --- a/.agents/skills/update-gpui/SKILL.md +++ b/.agents/skills/update-gpui/SKILL.md @@ -1,60 +1,59 @@ --- name: update-gpui -description: Update GPUI submodule to the latest commit. Use when asked to update, bump, or upgrade the gpui dependency. +description: Update all immutable GPUI Git pins and compatibility metadata. Use when asked to update, bump, or upgrade GPUI. user_invocable: true --- ## Instructions -Update the GPUI git submodule and all related Cargo.toml references to the latest commit on `origin/main`. +Update GPUI only from a reviewed, supplied full 40-character commit hash. Do +not select a moving ref. ### Steps -1. **Fetch latest from remote**: - ```bash - cd vendor/gpui && git fetch origin - ``` +1. Confirm target hash is exactly 40 lowercase hexadecimal characters and + record current hash and package versions from root `Cargo.toml`. -2. **Identify target commit**: Use the latest commit on `origin/main` (or a specific commit/branch if the user provides one via `$ARGUMENTS`). - ```bash - git log --oneline origin/main -5 - ``` +2. Update every `https://github.com/BumpyClock/gpui` dependency declaration in + committed manifests. Keep each declaration's package alias and features, and + set both its `rev` and exact `version = "=X.Y.Z"`. This currently includes + `gpui` (`package = "bumpyclock-gpui"`), `gpui_platform`, `gpui-macros` + (`package = "gpui_macros"`), and `sum-tree` (`package = "sum_tree"`). + Search all `Cargo.toml` files; do not leave a GPUI-family package on a + previous revision. -3. **Update submodule pointer**: - ```bash - git -C vendor/gpui checkout - ``` - -4. **Update `Cargo.toml`**: Find all `rev = "..."` entries pointing to the gpui git repo in the workspace `Cargo.toml` and update them to the new commit hash. The entries look like: - ```toml - gpui = { git = "https://github.com/BumpyClock/gpui", rev = "", ... } - gpui_platform = { git = "https://github.com/BumpyClock/gpui", rev = "", ... } - ``` - Update both `rev` values to the **full** commit hash. +3. Update `[gpui]` and every `[[gpui.packages]]` entry in + `compatibility.toml` with same revision and exact package versions. + Regenerate and verify derived document: -5. **Build and verify**: ```bash - cargo build + cargo xtask compatibility generate + cargo xtask compatibility check ``` -6. **If build fails**: Inspect errors and fix any breaking API changes in the codebase. Common issues: - - Borrow checker issues from upstream tree-sitter/API changes - - New/removed/renamed methods in gpui APIs - - Changed trait signatures +4. For coordinated source testing only, a sibling GPUI checkout may be wired + through an uncommitted `.cargo/config.toml` patch. Patch the actual packages + `bumpyclock-gpui`, `gpui_platform`, `gpui_macros`, and `sum_tree`; add + further resolved GPUI packages when needed. The committed manifest's + package identity must already match the checkout. Remove the override + before release checks. Never place it in a committed manifest or config. + +5. Build, test, and check release plan: -7. **Run clippy**: ```bash - cargo clippy -- --deny warnings + cargo test --workspace --all-targets --locked + cargo clippy --workspace --all-targets --locked -- -D warnings + cargo xtask publish-plan + cargo xtask release-check ``` -8. **Report summary**: Show old commit, new commit, what changed (list new commits), and whether build/clippy passed. +6. Report old/new revision, package versions, compatibility result, and + validation results. Version selection, tag creation, and publication need + separate owner authorization. ### Notes -- The submodule is at `vendor/gpui` and tracks `https://github.com/BumpyClock/gpui`. -- The `Cargo.toml` at the workspace root has `[workspace.dependencies]` entries for `gpui` and `gpui_platform` that pin to a specific `rev`. -- Always update both the submodule pointer AND the Cargo.toml rev in lockstep. -- **Always use `git + rev` dependencies, never path dependencies.** GPUI lives in its own repo; gpui-component consumes it as a git dependency. -- Use full 40-char commit hashes in `rev = "..."` for reproducibility. -- The submodule may need `git submodule update --init vendor/gpui` if not yet initialized. -- If `$ARGUMENTS` contains a specific commit hash or branch, use that instead of `origin/main`. +- Committed GPUI dependencies use only canonical Git URL, full immutable + revision, and exact version. +- Repository has no GPUI submodule. Local sibling source is a temporary, + uncommitted development override only. diff --git a/.cargo/config.toml b/.cargo/config.toml index 34415225..d61f3c27 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,5 @@ +[alias] +xtask = "run --locked --package xtask --" + [target.x86_64-pc-windows-msvc] rustflags = ["-C", "link-arg=/STACK:8000000"] diff --git a/.claude/skills/update-gpui/SKILL.md b/.claude/skills/update-gpui/SKILL.md index 4d37c57e..07ad9474 100644 --- a/.claude/skills/update-gpui/SKILL.md +++ b/.claude/skills/update-gpui/SKILL.md @@ -1,65 +1,59 @@ --- name: update-gpui -description: Update GPUI submodule to the latest commit. Use when asked to update, bump, or upgrade the gpui dependency. +description: Update all immutable GPUI Git pins and compatibility metadata. Use when asked to update, bump, or upgrade GPUI. user_invocable: true --- ## Instructions -Update the GPUI git submodule and all related Cargo.toml references to the latest commit on `origin/main`. +Update GPUI only from a reviewed, supplied full 40-character commit hash. Do +not select a moving ref. ### Steps -1. **Fetch latest from remote**: - ```bash - cd vendor/gpui && git fetch origin - ``` - -2. **Identify target commit**: Use the latest commit on `origin/main` (or a specific commit/branch if the user provides one via `$ARGUMENTS`). - ```bash - git log --oneline origin/main -5 - ``` +1. Confirm target hash is exactly 40 lowercase hexadecimal characters and + record current hash and package versions from root `Cargo.toml`. -3. **Update submodule pointer**: - ```bash - git -C vendor/gpui checkout - ``` +2. Update every `https://github.com/BumpyClock/gpui` dependency declaration in + committed manifests. Keep each declaration's package alias and features, and + set both its `rev` and exact `version = "=X.Y.Z"`. This currently includes + `gpui` (`package = "bumpyclock-gpui"`), `gpui_platform`, `gpui-macros` + (`package = "gpui_macros"`), and `sum-tree` (`package = "sum_tree"`). + Search all `Cargo.toml` files; do not leave a GPUI-family package on a + previous revision. -4. **Update `Cargo.toml`**: Find all `rev = "..."` entries pointing to the gpui git repo in the workspace `Cargo.toml` and update them to the new commit hash. The entries look like: - ```toml - gpui = { git = "https://github.com/BumpyClock/gpui", rev = "", ... } - gpui_platform = { git = "https://github.com/BumpyClock/gpui", rev = "", ... } - ``` - Update both `rev` values to the **full** commit hash. +3. Update `[gpui]` and every `[[gpui.packages]]` entry in + `compatibility.toml` with same revision and exact package versions. + Regenerate and verify derived document: -5. **Build and verify**: ```bash - cargo build + cargo xtask compatibility generate + cargo xtask compatibility check ``` -6. **If build fails**: Inspect errors and fix any breaking API changes in the codebase. Common issues: - - Borrow checker issues from upstream tree-sitter/API changes - - New/removed/renamed methods in gpui APIs - - Changed trait signatures +4. For coordinated source testing only, a sibling GPUI checkout may be wired + through an uncommitted `.cargo/config.toml` patch. Patch the actual packages + `bumpyclock-gpui`, `gpui_platform`, `gpui_macros`, and `sum_tree`; add + further resolved GPUI packages when needed. The committed manifest's + package identity must already match the checkout. Remove the override + before release checks. Never place it in a committed manifest or config. + +5. Build, test, and check release plan: -7. **Run clippy**: ```bash - cargo clippy -- --deny warnings + cargo test --workspace --all-targets --locked + cargo clippy --workspace --all-targets --locked -- -D warnings + cargo xtask publish-plan + cargo xtask release-check ``` -8. **Version + compatibility bookkeeping** (this skill is the ONLY place a gpui rev changes — see docs/learned/app-platform-plan.md D6): - - Bump `[workspace.package] version` in the root `Cargo.toml` (minor bump for a gpui rev change or breaking API change while pre-1.0; patch otherwise). Keep the `version = "X.Y.Z"` values inside `[workspace.dependencies]` for the path crates (`gpui-component`, `gpui-component-*`) in sync. - - Add a row to `docs/COMPATIBILITY.md` pairing the new workspace version with the new gpui rev. - - After the change lands on `main`, create the annotated tag: `git tag -a v -m "gpui-component v (gpui )"` and push it. Apps pin these tags — never bare revs. - -9. **Report summary**: Show old commit, new commit, what changed (list new commits), whether build/clippy passed, and the new workspace version + tag. +6. Report old/new revision, package versions, compatibility result, and + validation results. Version selection, tag creation, and publication need + separate owner authorization. ### Notes -- The submodule is at `vendor/gpui` and tracks `https://github.com/BumpyClock/gpui`. -- The `Cargo.toml` at the workspace root has `[workspace.dependencies]` entries for `gpui` and `gpui_platform` that pin to a specific `rev`. -- Always update both the submodule pointer AND the Cargo.toml rev in lockstep. -- **Always use `git + rev` dependencies, never path dependencies.** GPUI lives in its own repo; gpui-component consumes it as a git dependency. -- Use full 40-char commit hashes in `rev = "..."` for reproducibility. -- The submodule may need `git submodule update --init vendor/gpui` if not yet initialized. -- If `$ARGUMENTS` contains a specific commit hash or branch, use that instead of `origin/main`. +- Committed GPUI dependencies use only canonical Git URL, full immutable + revision, and exact version. +- Repository has no GPUI submodule. Local sibling source is a temporary, + uncommitted development override only. diff --git a/.github/ISSUE_TEMPLATE/01_bug.md b/.github/ISSUE_TEMPLATE/01_bug.md index 16eb3af9..425e0ac2 100644 --- a/.github/ISSUE_TEMPLATE/01_bug.md +++ b/.github/ISSUE_TEMPLATE/01_bug.md @@ -11,7 +11,7 @@ Use English with clear and concise description of the bug, if you just have a qu ## Environment -- GPUI: [e.g., v0.2.2] +- GPUI: [e.g., bumpyclock-gpui 0.1.0 / commit SHA] - GPUI Component: [e.g., v0.4.0] - Platform: [e.g., macOS 26, Windows 11, Ubuntu 20.04] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a9e2a75..91694936 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,8 +12,8 @@ concurrency: cancel-in-progress: true jobs: - test: - name: Test + compile: + name: Compile and lint strategy: fail-fast: false matrix: @@ -45,7 +45,7 @@ jobs: ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ - key: test-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }} + key: compile-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }} - name: Typo check if: ${{ matrix.run_on == 'macos-latest' }} run: | @@ -55,23 +55,47 @@ jobs: typos - name: Lint (macOS) if: ${{ matrix.run_on == 'macos-latest' }} - run: ./script/clippy + run: ./script/clippy --locked - name: Lint (Linux) if: ${{ matrix.run_on == 'ubuntu-latest' }} - run: ./script/clippy + run: ./script/clippy --locked - name: Lint (Windows) if: ${{ matrix.run_on == 'windows-latest' }} - run: ./script/clippy.ps1 - # Tests are intentionally NOT run in CI — they are run locally before - # merge (repo policy; see CLAUDE.md "Testing"). CI gates on lint (which - # compiles all targets), typos, machete, and the native launch smoke below. + run: ./script/clippy.ps1 --locked + + unit-and-headless: + name: Unit, doctest, and headless tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Install system dependencies + run: script/bootstrap + - name: Run maintained unit and headless tests + run: cargo test --workspace --all-targets --locked + - name: Run doctests + run: cargo test --workspace --doc --locked + + compatibility-and-packaging: + name: Compatibility and package manifests + needs: unit-and-headless + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Install system dependencies + run: script/bootstrap + - name: Show publication prerequisites + run: cargo xtask publish-plan + - name: Validate compatibility and package artifacts + run: cargo xtask release-check # Native launch smoke test for the app-platform conformance examples # (examples/app_shell single-window, examples/app_shell_background zero-window # background liveness). Each # example boots the real shell, opens its window(s), then `--smoke` requests a # clean quit and exits 0. See docs/learned/app-platform-plan.md §5 Phase 1 and - # §6 gate 7. Keep the matrix in sync with the `test` job above. + # §6 gate 7. Keep the matrix in sync with the `compile` job above. native-launch-smoke: name: Native launch smoke strategy: @@ -95,7 +119,7 @@ jobs: # include_identity!) cross-platform, even where we do not launch a # GPU-backed window below. - name: Build conformance examples - run: cargo build -p app_shell -p app_shell_background + run: cargo build --locked -p app_shell -p app_shell_background # Launch smoke runs on macOS only. Platform parity (CLAUDE.md) requires # documenting why the other two are gated off rather than silently skipped: # - macOS: GitHub arm64 runners provide a working Metal device; the @@ -104,18 +128,18 @@ jobs: # and no Vulkan device, so a native launch needs both xvfb and a # software driver (lavapipe) that is not guaranteed present. Gated off # to avoid flaky reds; enable once the runner image ships them: - # xvfb-run -a cargo run -p app_shell -- --smoke - # xvfb-run -a cargo run -p app_shell_background -- --smoke + # xvfb-run -a cargo run --locked -p app_shell -- --smoke + # xvfb-run -a cargo run --locked -p app_shell_background -- --smoke # - Windows: GPUI renders via DirectX; headless runners have no reliable # present surface. Gated off pending a WARP-backed offscreen path: - # cargo run -p app_shell -- --smoke - # cargo run -p app_shell_background -- --smoke + # cargo run --locked -p app_shell -- --smoke + # cargo run --locked -p app_shell_background -- --smoke - name: Native launch smoke (macOS) if: ${{ matrix.run_on == 'macos-latest' }} run: | - cargo run -p app_shell -- --asset-smoke - cargo run -p app_shell -- --smoke - cargo run -p app_shell_background -- --smoke + cargo run --locked -p app_shell -- --asset-smoke + cargo run --locked -p app_shell -- --smoke + cargo run --locked -p app_shell_background -- --smoke # This path opens no window, so it does not require a render surface. # Windows is included because GPUI's Windows `quit` path exits with status # zero; AppShell must preserve a transactional startup failure as nonzero. @@ -124,7 +148,7 @@ jobs: shell: bash run: | set +e - output="$(cargo run -p app_shell -- --fail-start 2>&1)" + output="$(cargo run --locked -p app_shell -- --fail-start 2>&1)" exit_code=$? set -e printf '%s\n' "$output" @@ -147,7 +171,7 @@ jobs: # native-error promotion, and exit explicitly. $ErrorActionPreference = 'Continue' $PSNativeCommandUseErrorActionPreference = $false - cargo run -p app_shell -- --fail-start *> app_shell_fail_start.log + cargo run --locked -p app_shell -- --fail-start *> app_shell_fail_start.log $exitCode = $LASTEXITCODE $output = Get-Content app_shell_fail_start.log -Raw Write-Output $output diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml index 85a46ac0..82977a9d 100644 --- a/.github/workflows/release-docs.yml +++ b/.github/workflows/release-docs.yml @@ -1,7 +1,7 @@ name: Release Docs on: workflow_run: - workflows: ["Release Crate"] + workflows: ["Release Gate"] types: - completed workflow_dispatch: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 157465c2..a59002be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,15 +1,19 @@ -name: "Release Crate" +name: "Release Gate" on: push: tags: - "v*" +permissions: + contents: read + jobs: - publish_crate: - name: Publish Crate + release_gate: + name: Validate registry release prerequisites runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - name: Release Crate - run: | - cargo publish --workspace --token ${{ secrets.CARGO_REGISTRY_TOKEN }} + - name: Show required publication order + run: cargo xtask publish-plan --require-registry + - name: Validate source, tests, and package artifacts + run: cargo xtask release-check --require-registry diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index fb4a796e..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "vendor/gpui"] - path = vendor/gpui - url = https://github.com/BumpyClock/gpui diff --git a/AGENTS.md b/AGENTS.md index 412d25b9..c5d8d15b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -171,8 +171,8 @@ The `Icon` element does not include SVG files by default. You need to: ## Dependencies -- GPUI: Git dependency from `https://github.com/BumpyClock/gpui` (our hard fork), pinned via `rev = ""` in workspace `Cargo.toml`. **Never use path dependencies for GPUI** — always use `git + rev`. The `vendor/gpui` submodule tracks the same repo/commit for local reference. -- To update GPUI: use the `/update-gpui` skill. This updates both the submodule pointer and Cargo.toml rev entries, then builds and fixes any breaking API changes. +- GPUI: Git dependency from `https://github.com/BumpyClock/gpui` (our hard fork), pinned by full immutable `rev` and exact `version` in workspace `Cargo.toml`. Dependency key and Rust import `gpui` map to Cargo package `bumpyclock-gpui`. Committed manifests must use only this Git source. For coordinated local development, use an uncommitted sibling-checkout patch described in `docs/learned/gpui-submodule.md`. +- To update GPUI: use the `/update-gpui` skill. It updates every GPUI-family Git revision and exact version, compatibility metadata/docs, then runs release validation. - Tree-sitter: For syntax highlighting - Ropey: Rope data structure for text, and `RopeExt` trait with more features. - Markdown rendering: `markdown` crate @@ -193,7 +193,7 @@ Uses `rust-i18n` crate. - Linux (x86_64) - Windows (x86_64) -CI runs full test suite on each platform. +CI compiles and lints three platforms; Ubuntu runs unit/headless tests and macOS has a native launch smoke. See `TESTING.md` for current coverage and limits. ## Skills Reference diff --git a/Cargo.lock b/Cargo.lock index d2cb4ecf..2829b535 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,7 +205,7 @@ name = "app_assets" version = "0.5.1" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui-component-assets", "gpui_platform", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "app_shell" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "gpui-component-app", @@ -226,7 +226,7 @@ dependencies = [ [[package]] name = "app_shell_background" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "gpui-component-app", @@ -981,6 +981,90 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bumpyclock-gpui" +version = "0.1.0" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" +dependencies = [ + "accesskit", + "anyhow", + "async-channel 2.5.0", + "async-task", + "backtrace", + "bindgen", + "bitflags 2.13.1", + "block", + "cbindgen", + "chrono", + "circular-buffer", + "cocoa 0.26.0", + "cocoa-foundation 0.2.0", + "collections", + "core-foundation 0.10.0", + "core-foundation-sys 0.8.7", + "core-graphics 0.24.0", + "core-text", + "core-video", + "ctor", + "derive_more", + "embed-resource", + "etagere", + "foreign-types", + "futures", + "futures-concurrency", + "getrandom 0.3.4", + "gpui_macros", + "gpui_shared_string", + "gpui_util", + "heapless", + "http_client", + "image", + "inventory", + "itertools 0.14.0", + "log", + "lyon", + "mach2", + "media", + "metal 0.29.0", + "num_cpus", + "objc", + "parking", + "parking_lot", + "pathfinder_geometry", + "pin-project", + "pollster 0.4.0", + "postage", + "profiling", + "rand 0.9.5", + "raw-window-handle", + "refineable", + "regex", + "resvg", + "scheduler", + "schemars", + "seahash", + "serde", + "serde_json", + "slotmap", + "smallvec", + "spin 0.10.1", + "stacksafe", + "strum", + "sum_tree", + "taffy", + "thiserror 2.0.18", + "ttf-parser", + "unicode-general-category", + "usvg", + "util_macros", + "uuid", + "waker-fn", + "web-time", + "windows 0.61.3", + "zed-font-kit", + "zed-scap", +] + [[package]] name = "bytecheck" version = "0.6.12" @@ -1068,9 +1152,9 @@ dependencies = [ [[package]] name = "calloop" -version = "0.14.4" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" dependencies = [ "bitflags 2.13.1", "polling", @@ -1312,7 +1396,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "gpui_util", "indexmap", @@ -1878,7 +1962,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "proc-macro2", "quote", @@ -1896,7 +1980,7 @@ name = "dialog_overlay" version = "0.5.1" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui-component-assets", "gpui_platform", @@ -1968,7 +2052,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2201,7 +2285,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2421,7 +2505,7 @@ name = "focus_trap" version = "0.5.0" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui_platform", ] @@ -3066,103 +3150,19 @@ dependencies = [ "bitflags 2.13.1", ] -[[package]] -name = "gpui" -version = "0.2.2" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" -dependencies = [ - "accesskit", - "anyhow", - "async-channel 2.5.0", - "async-task", - "backtrace", - "bindgen", - "bitflags 2.13.1", - "block", - "cbindgen", - "chrono", - "circular-buffer", - "cocoa 0.26.0", - "cocoa-foundation 0.2.0", - "collections", - "core-foundation 0.10.0", - "core-foundation-sys 0.8.7", - "core-graphics 0.24.0", - "core-text", - "core-video", - "ctor", - "derive_more", - "embed-resource", - "etagere", - "foreign-types", - "futures", - "futures-concurrency", - "getrandom 0.3.4", - "gpui_macros", - "gpui_shared_string", - "gpui_util", - "heapless", - "http_client", - "image", - "inventory", - "itertools 0.14.0", - "log", - "lyon", - "mach2", - "media", - "metal 0.29.0", - "num_cpus", - "objc", - "parking", - "parking_lot", - "pathfinder_geometry", - "pin-project", - "pollster 0.4.0", - "postage", - "profiling", - "rand 0.9.5", - "raw-window-handle", - "refineable", - "regex", - "resvg", - "scheduler", - "schemars", - "seahash", - "serde", - "serde_json", - "slotmap", - "smallvec", - "spin 0.10.1", - "stacksafe", - "strum", - "sum_tree", - "taffy", - "thiserror 2.0.18", - "ttf-parser", - "unicode-general-category", - "usvg", - "util_macros", - "uuid", - "waker-fn", - "web-time", - "windows 0.61.3", - "zed-font-kit", - "zed-scap", -] - [[package]] name = "gpui-component" -version = "0.6.0" +version = "0.7.0" dependencies = [ "aho-corasick", "anyhow", + "bumpyclock-gpui", "chrono", "core-text", "enum-iterator", "fuzzy-matcher", - "gpui", "gpui-component-macros", - "gpui-macros", + "gpui_macros", "html5ever 0.27.0", "indoc", "itertools 0.14.0", @@ -3185,6 +3185,7 @@ dependencies = [ "serde_repr", "smallvec", "smol", + "sum_tree", "tracing", "tree-sitter", "tree-sitter-bash", @@ -3222,16 +3223,15 @@ dependencies = [ "unicode-segmentation", "uuid", "windows 0.62.2", - "zed-sum-tree", ] [[package]] name = "gpui-component-app" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", + "bumpyclock-gpui", "fix-path-env", - "gpui", "gpui-component", "gpui-component-manifest", "gpui-component-storage", @@ -3246,16 +3246,17 @@ dependencies = [ [[package]] name = "gpui-component-assets" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", + "gpui_platform", "rust-embed", ] [[package]] name = "gpui-component-macros" -version = "0.6.0" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", @@ -3264,7 +3265,7 @@ dependencies = [ [[package]] name = "gpui-component-manifest" -version = "0.6.0" +version = "0.7.0" dependencies = [ "serde", "tempfile", @@ -3274,7 +3275,7 @@ dependencies = [ [[package]] name = "gpui-component-storage" -version = "0.6.0" +version = "0.7.0" dependencies = [ "dirs 6.0.0", "log", @@ -3290,12 +3291,12 @@ version = "0.5.1" dependencies = [ "anyhow", "autocorrect", + "bumpyclock-gpui", "chrono", "color-lsp", "csv", "dirs 6.0.0", "fake", - "gpui", "gpui-component", "gpui-component-app", "gpui-component-assets", @@ -3316,31 +3317,19 @@ dependencies = [ "unindent", ] -[[package]] -name = "gpui-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb02dd63a2859714ac7b6b476937617c3c744157af1b49f7c904023a79039be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "gpui-wry" -version = "0.5.0" +version = "0.7.0" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "lb-wry", ] [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "accesskit", "accesskit_unix", @@ -3348,6 +3337,7 @@ dependencies = [ "as-raw-xcb-connection", "ashpd", "bitflags 2.13.1", + "bumpyclock-gpui", "bytemuck", "calloop", "calloop-wayland-source", @@ -3355,7 +3345,6 @@ dependencies = [ "cosmic-text 0.17.2", "filedescriptor", "futures", - "gpui", "gpui_util", "gpui_wgpu", "http_client", @@ -3394,13 +3383,14 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "accesskit", "accesskit_macos", "anyhow", "async-task", "block", + "bumpyclock-gpui", "cbindgen", "cocoa 0.26.0", "collections", @@ -3415,7 +3405,6 @@ dependencies = [ "etagere", "foreign-types", "futures", - "gpui", "gpui_util", "image", "itertools 0.14.0", @@ -3441,7 +3430,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3452,10 +3441,10 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ + "bumpyclock-gpui", "console_error_panic_hook", - "gpui", "gpui_linux", "gpui_macos", "gpui_web", @@ -3465,7 +3454,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "schemars", "serde", @@ -3475,7 +3464,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", "log", @@ -3485,12 +3474,12 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", + "bumpyclock-gpui", "console_error_panic_hook", "futures", - "gpui", "gpui_wgpu", "http_client", "js-sys", @@ -3509,14 +3498,14 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", + "bumpyclock-gpui", "bytemuck", "collections", "cosmic-text 0.19.0", "etagere", - "gpui", "gpui_util", "itertools 0.14.0", "js-sys", @@ -3538,16 +3527,16 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "accesskit", "accesskit_windows", "anyhow", + "bumpyclock-gpui", "collections", "dunce", "etagere", "futures", - "gpui", "gpui_util", "image", "itertools 0.14.0", @@ -3742,7 +3731,7 @@ name = "hello_world" version = "0.5.1" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui_platform", ] @@ -3854,7 +3843,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", "async-compression", @@ -4199,7 +4188,7 @@ name = "input" version = "0.5.1" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui-component-assets", "gpui_platform", @@ -4868,7 +4857,7 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", "bindgen", @@ -5180,7 +5169,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5797,7 +5786,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "collections", "serde", @@ -6470,7 +6459,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -6835,7 +6824,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "derive_refineable", ] @@ -6889,9 +6878,9 @@ name = "reqwest_client" version = "0.5.1" dependencies = [ "anyhow", + "bumpyclock-gpui", "bytes", "futures", - "gpui", "log", "regex", "rustls", @@ -7151,7 +7140,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -7291,7 +7280,7 @@ dependencies = [ [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "async-task", "backtrace", @@ -7762,7 +7751,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7834,7 +7823,7 @@ dependencies = [ "cfg-if", "libc", "psm", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7949,7 +7938,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "heapless", "log", @@ -8182,8 +8171,8 @@ version = "0.5.0" dependencies = [ "anyhow", "battery", + "bumpyclock-gpui", "core-foundation 0.10.0", - "gpui", "gpui-component", "gpui-component-assets", "gpui_platform", @@ -8255,7 +8244,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix 1.1.4", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -9170,7 +9159,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -9334,7 +9323,7 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", "async-fs", @@ -9373,7 +9362,7 @@ dependencies = [ [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "perf", "quote", @@ -9799,7 +9788,7 @@ name = "webview" version = "0.5.0" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui-wry", "gpui_platform", @@ -10052,7 +10041,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -10066,7 +10055,7 @@ name = "window_title" version = "0.5.1" dependencies = [ "anyhow", - "gpui", + "bumpyclock-gpui", "gpui-component", "gpui-component-assets", "gpui_platform", @@ -10666,12 +10655,6 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "workspace-hack" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beffa227304dbaea3ad6a06ac674f9bc83a3dec3b7f63eeb442de37e7cb6bb01" - [[package]] name = "writeable" version = "0.6.3" @@ -10822,6 +10805,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" +[[package]] +name = "xtask" +version = "0.0.0" +dependencies = [ + "anyhow", + "serde", + "serde_json", + "tempfile", + "toml 0.9.12+spec-1.1.0", +] + [[package]] name = "y4m" version = "0.8.0" @@ -11059,18 +11053,6 @@ dependencies = [ "xcb", ] -[[package]] -name = "zed-sum-tree" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d490156d0d7311855564d6e1d6dccab992405a0c0e15e1c8ef18920c02177e35" -dependencies = [ - "arrayvec", - "log", - "rayon", - "workspace-hack", -] - [[package]] name = "zed-xim" version = "0.4.0-zed" @@ -11187,7 +11169,7 @@ dependencies = [ [[package]] name = "zlog" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "anyhow", "chrono", @@ -11204,7 +11186,7 @@ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "ztracing" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" dependencies = [ "tracing", "tracing-subscriber", @@ -11215,7 +11197,7 @@ dependencies = [ [[package]] name = "ztracing_macro" version = "0.1.0" -source = "git+https://github.com/BumpyClock/gpui?rev=1eeb173f71fad65c25cc8ea22319715703f05b5b#1eeb173f71fad65c25cc8ea22319715703f05b5b" +source = "git+https://github.com/BumpyClock/gpui?rev=d1a6019136eb9fb9386eaa047a7445c1032d8668#d1a6019136eb9fb9386eaa047a7445c1032d8668" [[package]] name = "zune-core" diff --git a/Cargo.toml b/Cargo.toml index b0bdb708..e31bebbf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,27 +20,31 @@ members = [ "examples/webview", "examples/system_monitor", "examples/focus_trap", + "xtask", ] resolver = "2" [workspace.package] publish = false edition = "2024" -version = "0.6.0" +version = "0.7.0" +rust-version = "1.90" +license = "Apache-2.0" +repository = "https://github.com/BumpyClock/gpui-component" [workspace.dependencies] -gpui-component = { path = "crates/ui", version = "0.6.0" } -gpui-component-app = { path = "crates/app", version = "0.6.0" } -gpui-component-manifest = { path = "crates/app-manifest", version = "0.6.0" } -gpui-component-storage = { path = "crates/app-storage", version = "0.6.0" } -gpui-component-macros = { path = "crates/macros", version = "0.6.0" } -gpui-component-assets = { path = "crates/assets", version = "0.6.0" } +gpui-component = { path = "crates/ui", version = "=0.7.0" } +gpui-component-app = { path = "crates/app", version = "=0.7.0" } +gpui-component-manifest = { path = "crates/app-manifest", version = "=0.7.0" } +gpui-component-storage = { path = "crates/app-storage", version = "=0.7.0" } +gpui-component-macros = { path = "crates/macros", version = "=0.7.0" } +gpui-component-assets = { path = "crates/assets", version = "=0.7.0" } story = { path = "crates/story" } -gpui = { git = "https://github.com/BumpyClock/gpui", rev = "1eeb173f71fad65c25cc8ea22319715703f05b5b", features = ["font-kit"] } -gpui_platform = { git = "https://github.com/BumpyClock/gpui", rev = "1eeb173f71fad65c25cc8ea22319715703f05b5b", features = ["font-kit"] } -gpui-macros = "0.2.2" -sum-tree = { version = "0.2.0", package = "zed-sum-tree" } +gpui = { package = "bumpyclock-gpui", version = "=0.1.0", git = "https://github.com/BumpyClock/gpui", rev = "d1a6019136eb9fb9386eaa047a7445c1032d8668", features = ["font-kit"] } +gpui_platform = { version = "=0.1.0", git = "https://github.com/BumpyClock/gpui", rev = "d1a6019136eb9fb9386eaa047a7445c1032d8668", features = ["font-kit"] } +gpui-macros = { package = "gpui_macros", version = "=0.1.0", git = "https://github.com/BumpyClock/gpui", rev = "d1a6019136eb9fb9386eaa047a7445c1032d8668" } +sum-tree = { package = "sum_tree", version = "=0.1.0", git = "https://github.com/BumpyClock/gpui", rev = "d1a6019136eb9fb9386eaa047a7445c1032d8668" } # reqwest = { version = "0.12.15-zed", package = "zed-reqwest" } reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "c15662463bda39148ba154100dd44d3fba5873a4", default-features = false, features = [ "charset", diff --git a/LEARNINGS.md b/LEARNINGS.md index cd4f1a86..9eee32b4 100644 --- a/LEARNINGS.md +++ b/LEARNINGS.md @@ -80,13 +80,16 @@ Outcome: no end-frame collapse; open state stays stable. Next time: avoid `bounce` for reveal/size/opacity; it is forward-then-reverse. ## 2026-02-10 -Context: vendoring GPUI for local patching. -What worked: -- Add `vendor/gpui` git submodule pinned to current `gpui` rev. -- Keep workspace dependency as git+rev; direct path dependency failed due Zed workspace dependency inheritance. -- Document patch workflow in `docs/learned/gpui-submodule.md`. -Outcome: local GPUI source available for edits/review without breaking build. -Next time: after GPUI patch commit, bump both `Cargo.toml` rev and submodule SHA together. +Context: historical GPUI source vendoring for local patching. +Superseded: Phase 0 removed the GPUI submodule. This entry preserves rationale, +not an operational workflow. +What worked then: +- Keep workspace dependencies as Git plus immutable revision; direct committed + source overrides failed due GPUI workspace dependency inheritance. +Current rule: committed manifests use canonical Git URL, full revision, and +exact package versions. A sibling checkout may be used only through an +uncommitted Cargo patch; update compatibility metadata and generated docs with +the revision. ## 2026-02-10 Context: spring/overshoot easing support. @@ -103,10 +106,12 @@ Outcome: no spring/damping/frequency tokens; only cubic-bezier and duration sets Next time: when adding springs, pick local defaults or extend tokens explicitly. ## 2026-02-10 -Context: trying to patch GPUI from local submodule during app build. -What worked: path override does not work here because `gpui` uses workspace-inherited deps. -Outcome: proper flow is commit/push submodule changes, then bump `Cargo.toml` `gpui` `rev` to the new commit. -Next time: skip `[patch]` path attempts for this repo; use git `rev` updates only. +Context: historical attempt to patch GPUI source during app build. +Superseded: this observation predates Phase 0 sibling-checkout workflow and is +not an instruction to create or update a submodule. +Outcome: a temporary, uncommitted Cargo patch may be used for coordinated local +testing. Before release validation, remove it and use committed canonical Git +revision with exact package versions. ## 2026-02-11 Context: implementing GPUI transform foundation for spring-style motion. diff --git a/LICENSE-AUDIT.md b/LICENSE-AUDIT.md new file mode 100644 index 00000000..b046cbc0 --- /dev/null +++ b/LICENSE-AUDIT.md @@ -0,0 +1,29 @@ +# License Audit + +Date: 2026-07-28 + +This is an engineering inventory, not legal advice. + +## Confirmed metadata + +- Root and publishable framework manifests declare Apache-2.0. +- `LICENSE-APACHE` retains Longbridge copyright and attribution. +- GPUI is a separate BumpyClock fork with its own provenance and publication + work; its notices must remain with its source and package artifacts. + +## Assets requiring owner review + +- `crates/assets/assets/icons/` contains SVGs identified as Lucide assets. +- The repository has no tracked Lucide license text, version record, source + acquisition record, or package notice for those SVGs. +- `crates/assets/README.md` still links to the historical Longbridge repository. + +Before publishing a framework package that includes these assets, an owner must +confirm each asset's source, version, redistribution terms, and required notice. +Add only the resulting verified notice and attribution; do not change the +project license or infer asset permissions from SVG class names. + +## Publication gate + +Crates.io publication remains blocked until the asset review above and the GPUI +engine package identity/ownership checks in `compatibility.toml` are resolved. diff --git a/README.md b/README.md index 20e108fa..df203c09 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This is a BumpyClock fork of the original gpui-component by longbridge. Goal is # GPUI Component -[![Build Status](https://github.com/BumpyClock/gpui-component/actions/workflows/ci.yml/badge.svg)](https://github.com/BumpyClock/gpui-component/actions/workflows/ci.yml) [![Docs](https://docs.rs/gpui-component/badge.svg)](https://docs.rs/gpui-component/) [![Crates.io](https://img.shields.io/crates/v/gpui-component.svg)](https://crates.io/crates/gpui-component) +[![Build Status](https://github.com/BumpyClock/gpui-component/actions/workflows/ci.yml/badge.svg)](https://github.com/BumpyClock/gpui-component/actions/workflows/ci.yml) UI components for building fantastic desktop applications using [GPUI](https://gpui.rs). @@ -29,14 +29,22 @@ UI components for building fantastic desktop applications using [GPUI](https://g - **Syntax Highlighting**: Syntax highlighting for editor and markdown components using Tree Sitter. -## Usage +## Installation + +The current framework stack is not ready for crates.io consumption. Use one +immutable framework release and let it select its pinned GPUI revision. Do not +add an independent `gpui` dependency or select a GPUI commit yourself. ```toml -gpui = "0.2.2" -gpui-component = "0.5.1" -gpui-component-assets = "0.5.1" +gpui-component = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } +gpui-component-assets = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } ``` +`v0.6.0` is the latest immutable framework tag. The current `0.7.0` source +tree is unreleased. See [compatibility status](docs/COMPATIBILITY.md) and the +[release guide](RELEASING.md) before preparing a release. See +[testing and CI](TESTING.md) for validation levels and native-runtime limits. + ### AppShell (experimental) Native applications can use `gpui-component-app` to centralize identity, paths, @@ -66,8 +74,17 @@ current limitations. ### Manual GPUI bootstrap +For hosts that need direct GPUI types, depend on `gpui-component-app` at the +same framework tag and use its re-exports. This prevents a second GPUI type +identity from entering the application. + +```toml +gpui-component-app = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } +``` + ```rs -use gpui::*; +use gpui_component_app::gpui::*; +use gpui_component_app::gpui_platform; use gpui_component::{button::*, *}; pub struct HelloWorld; diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 00000000..a8f1a03a --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,64 @@ +# Releasing GPUI Component + +This repository currently supports Git consumption only. Framework crates must +not be published until every exact GPUI fork package in `compatibility.toml` is +published and source-equivalent to the pinned GPUI commit. + +See [testing and CI](TESTING.md) for the maintained test inventory and native +runtime limits that release validation does not erase. + +## Prepare a release + +1. Choose the next version without changing an existing tag or published crate. + A GPUI revision or public compatibility change requires a pre-1.0 minor bump. +2. Merge GPUI first. Record its final 40-character commit and exact engine + package versions in this repository's manifests and `compatibility.toml`. +3. Regenerate and verify compatibility documentation: + + ```bash + cargo xtask compatibility generate + cargo xtask compatibility check + ``` + +4. Review publication order and source/package artifacts: + + ```bash + cargo xtask publish-plan + cargo xtask release-check + ``` + +5. After engine packages are available on crates.io, require registry evidence: + + ```bash + cargo xtask publish-plan --require-registry + cargo xtask release-check --require-registry + ``` + +`--require-registry` is expected to fail before the GPUI engine publication +prerequisites exist. Do not weaken it or replace it with a Git dependency. + +## Publish order + +Use `cargo xtask publish-plan --require-registry` as the source of truth. It +derives the dependency order from manifests. Publish foundational GPUI packages, +then GPUI platform/facade packages, followed by framework support packages and +finally public framework facade packages. + +An owner with verified crates.io access performs the authorized publication only +after the release gate passes. This repository's tag workflow validates releases; +it does not publish crates automatically. + +## Local coordinated development + +Use an uncommitted sibling-checkout patch as described in +[`docs/learned/gpui-submodule.md`](docs/learned/gpui-submodule.md). Never commit +a local path, branch, pull-request revision, or mutable GPUI tag as a release +dependency. + +## Finalize + +Create an immutable framework tag only after all gates pass. Release notes must +record the framework version, full GPUI commit, exact engine registry package +versions, support evidence, and any remaining native-runtime limitations. + +Never replace a published crate version or move a release tag. diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 00000000..a999ceb9 --- /dev/null +++ b/TESTING.md @@ -0,0 +1,71 @@ +# Testing and CI + +CI reports validation by level. A compile-only job is not a runtime test. + +## Unit and doctest + +Command: + +```bash +cargo test --workspace --all-targets --locked +cargo test --workspace --doc --locked +``` + +Maintained unit targets include GPUI Component builders, layout and text logic, +theme and asset handling; AppShell commands, lifecycle, settings, storage, and +window planning; application-manifest parsing, versioning, and doctor behavior; +the request client; and compatibility-tool tests. + +## Headless integration + +The same command runs deterministic integration targets without a native +presentation surface, including: + +- `crates/app/tests/headless.rs` for AppShell lifecycle behavior; +- `crates/app-manifest/tests/downstream.rs` for downstream manifest use; +- `crates/app-storage/tests/process_lock.rs` for cross-process storage locking. + +`process_lock` has two `#[ignore]` child-role tests. They are intentionally not +standalone targets: its driver starts them explicitly with `--ignored --exact`. +They are covered when the integration driver runs. + +The doctest lane includes the `gpui-component-assets` `Assets` example. Its +manifest declares the required GPUI platform dependency for doctest builds. + +## Native smoke + +`native-launch-smoke` builds AppShell conformance examples on macOS, Windows, +and Linux. It opens a real window and executes smoke paths on macOS only: + +```bash +cargo run -p app_shell -- --asset-smoke +cargo run -p app_shell -- --smoke +cargo run -p app_shell_background -- --smoke +``` + +Windows runs only the no-window transactional-start failure smoke. Native +DirectX presentation remains blocked by the hosted runner's lack of a reliable +present surface. Linux native smoke remains blocked by the lack of a stable +display plus Vulkan software-renderer setup; Stage 1 needs an `xvfb` and +lavapipe-capable runner. Linux and Windows native-runtime evidence must remain +`not-verified` until those blockers are resolved. + +## Packaging and compatibility + +```bash +cargo xtask compatibility check +cargo xtask publish-plan +cargo xtask release-check +``` + +`release-check` validates source build, unit/headless tests, package file lists, +and normalized manifests. `--require-registry` additionally requires published +exact GPUI engine packages; its failure is expected until those prerequisites +exist. + +## Compile-only + +The `Compile and lint` CI matrix runs Clippy on macOS, Windows, and Linux. It +compiles all targets and features but does not establish native event-loop, +window, or renderer behavior. Platform evidence and support maturity live in +the generated [compatibility matrix](docs/COMPATIBILITY.md). diff --git a/compatibility.toml b/compatibility.toml new file mode 100644 index 00000000..e5b28557 --- /dev/null +++ b/compatibility.toml @@ -0,0 +1,116 @@ +schema = 1 + +[framework] +name = "gpui-component" +version = "0.7.0" +repository = "https://github.com/BumpyClock/gpui-component" +rust_msrv = "1.90" +pinned_toolchain = "1.95.0" +audit_toolchain = "1.97.1" +previous_release = "0.6.0" +previous_release_gpui_rev = "2a03ae6e789b77e98f9d9bd5489758a082313c75" + +[gpui] +repository = "https://github.com/BumpyClock/gpui" +rev = "d1a6019136eb9fb9386eaa047a7445c1032d8668" +zed_repository = "https://github.com/zed-industries/zed" +zed_upstream_base = "2c4e44704c37ee87e59ac84e3e17388178b28545" + +[[gpui.packages]] +dependency = "gpui" +registry_package = "bumpyclock-gpui" +version = "0.1.0" +crate_path = "crates/gpui" +public_api = true +features = ["font-kit"] +registry_status = "selected-unpublished" +registry_note = "bumpyclock-gpui 0.1.0 is the owner-selected facade identity but is not reserved or published on crates.io" + +[[gpui.packages]] +dependency = "gpui_platform" +registry_package = "gpui_platform" +version = "0.1.0" +crate_path = "crates/gpui_platform" +public_api = true +features = ["font-kit"] +registry_status = "unavailable" +registry_note = "no owner-authorized BumpyClock/gpui publication identity is established" + +[[gpui.packages]] +dependency = "gpui-macros" +registry_package = "gpui_macros" +version = "0.1.0" +crate_path = "crates/gpui_macros" +public_api = true +features = [] +registry_status = "conflict" +registry_note = "gpui-macros 0.1.0 exists on crates.io but is an external, source-conflicting identity; latest is 0.2.2" + +[[gpui.packages]] +dependency = "sum-tree" +registry_package = "sum_tree" +version = "0.1.0" +crate_path = "crates/sum_tree" +public_api = true +features = [] +registry_status = "unavailable" +registry_note = "sum_tree 0.1.0 has no owner-authorized crates.io identity; zed-sum-tree 0.2.0 is a different engine source" + +[release] +crates_io_ready = false +blockers = [ + "owner must approve remaining crates.io identities for BumpyClock/gpui packages", + "BumpyClock control of existing Longbridge crates.io identities gpui-component, gpui-component-assets, gpui-component-macros, and gpui-wry is unverified", + "exact engine versions must be published before framework packages", + "gpui-component-app remains private because fix-path-env is a Git-only normal dependency with no registry release", + "GPUI root patches for async-task, calloop, and windows-capture are not inherited by Git consumers or packaged manifests", + "Lucide-derived bundled icon source, version, license, and notice require owner review before framework publication", +] + +[[platforms]] +name = "macOS" +target = "aarch64-apple-darwin" +build = "verified" +unit = "verified" +headless = "verified" +native_runtime = "verified" +renderer = "not-verified" +package = "not-verified" +maturity = "preview" +notes = "Locked workspace build, unit suite, AppShell headless harness, and native AppShell launch/quit smokes passed locally on macOS; renderer presentation was not separately verified." + +[[platforms]] +name = "Windows" +target = "x86_64-pc-windows-msvc" +build = "not-verified" +unit = "not-verified" +headless = "not-verified" +native_runtime = "not-verified" +renderer = "not-verified" +package = "not-verified" +maturity = "experimental" +notes = "Earlier CI compiled Windows, but the uncommitted 0.7 compatibility line has not run there; no native DirectX present surface is exercised." + +[[platforms]] +name = "Linux X11" +target = "x86_64-unknown-linux-gnu" +build = "not-verified" +unit = "not-verified" +headless = "not-verified" +native_runtime = "not-verified" +renderer = "not-verified" +package = "not-verified" +maturity = "experimental" +notes = "X11 implementation and earlier compile evidence exist, but the uncommitted 0.7 line has not run on Linux; CI has no stable display and Vulkan presentation evidence." + +[[platforms]] +name = "Linux Wayland" +target = "x86_64-unknown-linux-gnu" +build = "not-verified" +unit = "not-verified" +headless = "not-verified" +native_runtime = "not-verified" +renderer = "not-verified" +package = "not-verified" +maturity = "experimental" +notes = "Wayland implementation exists, but the uncommitted 0.7 line has not run on Linux and prior CI did not isolate or exercise a Wayland session." diff --git a/crates/app-manifest/Cargo.toml b/crates/app-manifest/Cargo.toml index 6b9f7cf1..70798e27 100644 --- a/crates/app-manifest/Cargo.toml +++ b/crates/app-manifest/Cargo.toml @@ -3,7 +3,11 @@ name = "gpui-component-manifest" description = "App identity schema, validation, and build-time codegen for gpui-component apps. No GPUI dependency; usable from build scripts and packaging tools." version.workspace = true edition.workspace = true -publish.workspace = true +publish = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +readme = "README.md" [dependencies] serde.workspace = true diff --git a/crates/app-manifest/LICENSE-APACHE b/crates/app-manifest/LICENSE-APACHE new file mode 100644 index 00000000..3cc771d2 --- /dev/null +++ b/crates/app-manifest/LICENSE-APACHE @@ -0,0 +1,191 @@ +Copyright 2024 - 2025 Longbridge + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/crates/app-manifest/README.md b/crates/app-manifest/README.md new file mode 100644 index 00000000..8162a13e --- /dev/null +++ b/crates/app-manifest/README.md @@ -0,0 +1,3 @@ +# gpui-component-manifest + +Application identity schema, validation, and build-time code generation for GPUI Component apps. diff --git a/crates/app-storage/Cargo.toml b/crates/app-storage/Cargo.toml index 563f3b1b..f37dc2e1 100644 --- a/crates/app-storage/Cargo.toml +++ b/crates/app-storage/Cargo.toml @@ -3,7 +3,11 @@ name = "gpui-component-storage" description = "Foundation storage layer for gpui-component apps: platform paths, atomic writes, schema-versioned envelopes, debounced stores. No GPUI dependency." version.workspace = true edition.workspace = true -publish.workspace = true +publish = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +readme = "README.md" [dependencies] dirs.workspace = true diff --git a/crates/app-storage/LICENSE-APACHE b/crates/app-storage/LICENSE-APACHE new file mode 100644 index 00000000..3cc771d2 --- /dev/null +++ b/crates/app-storage/LICENSE-APACHE @@ -0,0 +1,191 @@ +Copyright 2024 - 2025 Longbridge + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/crates/app-storage/README.md b/crates/app-storage/README.md new file mode 100644 index 00000000..814b80c5 --- /dev/null +++ b/crates/app-storage/README.md @@ -0,0 +1,3 @@ +# gpui-component-storage + +Storage, platform-path, and schema-versioning primitives for GPUI Component apps. diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 0fb6bea5..e16ac20a 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -3,7 +3,10 @@ name = "gpui-component-app" description = "Application shell for gpui-component apps: AppShell builder, lifecycle events, identity, settings, windows, theme, menus." version.workspace = true edition.workspace = true -publish.workspace = true +publish = false +rust-version.workspace = true +license.workspace = true +repository.workspace = true [dependencies] anyhow.workspace = true diff --git a/crates/assets/Cargo.toml b/crates/assets/Cargo.toml index dc7275e6..fa87b898 100644 --- a/crates/assets/Cargo.toml +++ b/crates/assets/Cargo.toml @@ -9,12 +9,13 @@ repository = "https://github.com/BumpyClock/gpui-component" readme = "README.md" edition.workspace = true publish = true -version = "0.6.0" - -[lib] -doctest = false +version.workspace = true +rust-version.workspace = true [dependencies] anyhow.workspace = true gpui.workspace = true rust-embed = { version = "8.7.2", features = ["interpolate-folder-path"] } + +[dev-dependencies] +gpui_platform.workspace = true diff --git a/crates/assets/LICENSE-APACHE b/crates/assets/LICENSE-APACHE new file mode 100644 index 00000000..3cc771d2 --- /dev/null +++ b/crates/assets/LICENSE-APACHE @@ -0,0 +1,191 @@ +Copyright 2024 - 2025 Longbridge + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/crates/macros/Cargo.toml b/crates/macros/Cargo.toml index 561b7abe..2f93a9f0 100644 --- a/crates/macros/Cargo.toml +++ b/crates/macros/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "gpui-component-macros" description = "Macros for GPUI Component." -version = "0.6.0" +version.workspace = true +rust-version.workspace = true license = "Apache-2.0" +repository.workspace = true +documentation = "https://docs.rs/gpui-component-macros" +homepage = "https://BumpyClock.github.io/gpui-component" +readme = "README.md" publish = true edition.workspace = true diff --git a/crates/macros/README.md b/crates/macros/README.md new file mode 100644 index 00000000..11fd86a3 --- /dev/null +++ b/crates/macros/README.md @@ -0,0 +1,3 @@ +# gpui-component-macros + +Procedural macros used by `gpui-component`. diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml index 271f880b..b65b7b4e 100644 --- a/crates/ui/Cargo.toml +++ b/crates/ui/Cargo.toml @@ -7,7 +7,8 @@ documentation = "https://docs.rs/gpui-component" homepage = "https://BumpyClock.github.io/gpui-component" repository = "https://github.com/BumpyClock/gpui-component" readme = "../../README.md" -version = "0.6.0" +version.workspace = true +rust-version.workspace = true publish = true edition.workspace = true diff --git a/crates/webview/Cargo.toml b/crates/webview/Cargo.toml index 3facf244..2fba4ad8 100644 --- a/crates/webview/Cargo.toml +++ b/crates/webview/Cargo.toml @@ -9,7 +9,8 @@ repository = "https://github.com/BumpyClock/gpui-component/tree/main/crates/webv readme = "README.md" edition.workspace = true publish = true -version = "0.5.0" +version.workspace = true +rust-version.workspace = true [features] inspector = ["wry/devtools"] diff --git a/crates/webview/LICENSE-APACHE b/crates/webview/LICENSE-APACHE new file mode 100644 index 00000000..3cc771d2 --- /dev/null +++ b/crates/webview/LICENSE-APACHE @@ -0,0 +1,191 @@ +Copyright 2024 - 2025 Longbridge + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 897b5c49..29b1f882 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -18,7 +18,7 @@ export default { // ... app.component("GitHubStar", GitHubStar); - app.config.globalProperties.GPUI_VERSION = "0.2.2"; + app.config.globalProperties.GPUI_VERSION = "0.1.0"; app.config.globalProperties.VERSION = config.package.version; }, } satisfies Theme; diff --git a/docs/COMPATIBILITY.md b/docs/COMPATIBILITY.md index ef1adeeb..c83e7f49 100644 --- a/docs/COMPATIBILITY.md +++ b/docs/COMPATIBILITY.md @@ -1,79 +1,62 @@ --- title: "Compatibility Matrix" -summary: "GPUI revision pairing and AppShell platform evidence." +summary: "Generated framework, GPUI, registry, and platform compatibility evidence." +read_when: "updating GPUI pins, packaging crates, or preparing a release" --- + -# Compatibility Matrix +# Compatibility -Single source of truth for which gpui fork revision each gpui-component release is -built and tested against. Maintained by the `/update-gpui` skill — every gpui bump -updates this table, the workspace version, and the release tag together. +- Framework: `gpui-component` `0.7.0` +- Framework repository: `https://github.com/BumpyClock/gpui-component` +- Declared Rust MSRV: `1.90` (not exercised by this audit) +- Repository-pinned toolchain: `1.95.0` (not installed in this environment) +- Audit host toolchain: `1.97.1` +- GPUI repository: `https://github.com/BumpyClock/gpui` +- GPUI commit: `d1a6019136eb9fb9386eaa047a7445c1032d8668` +- Zed upstream: `https://github.com/zed-industries/zed` +- Zed upstream base: `2c4e44704c37ee87e59ac84e3e17388178b28545` -Consumers (agent-term, ansible, Andromeda, and future apps) should: +## Engine packages -- pin one tag of this workspace's crates (`gpui-component`, `gpui-component-app`, - `gpui-component-storage`, `gpui-component-manifest` release together at the - workspace version); -- declare gpui/gpui_platform (where needed directly) at the **same rev** listed here, - centralized in `[workspace.dependencies]`; -- run a CI lint over `cargo metadata` rejecting more than one resolved - source/rev for `gpui`, `gpui_platform`, or `gpui-component` - (see docs/learned/app-platform-plan.md, D6). +| Dependency | Registry package | Exact version | Features | Public API | Registry status | Note | +|---|---|---:|---|:---:|---|---| +| `gpui` | `bumpyclock-gpui` | `=0.1.0` | `font-kit` | yes | selected-unpublished | bumpyclock-gpui 0.1.0 is the owner-selected facade identity but is not reserved or published on crates.io | +| `gpui_platform` | `gpui_platform` | `=0.1.0` | `font-kit` | yes | unavailable | no owner-authorized BumpyClock/gpui publication identity is established | +| `gpui-macros` | `gpui_macros` | `=0.1.0` | none | yes | conflict | gpui-macros 0.1.0 exists on crates.io but is an external, source-conflicting identity; latest is 0.2.2 | +| `sum-tree` | `sum_tree` | `=0.1.0` | none | yes | unavailable | sum_tree 0.1.0 has no owner-authorized crates.io identity; zed-sum-tree 0.2.0 is a different engine source | -| gpui-component version (tag) | gpui fork rev | Date | Notes | -|---|---|---|---| -| 0.5.1 (`v0.5.1`) | `4332ea7deae4838c12bad6ea64292ca22a33cf98` | 2026-07-16 | First tracked pairing; app-platform crates (storage, manifest) introduced. | -| 0.6.0 (`v0.6.0`) | `2a03ae6e789b77e98f9d9bd5489758a082313c75` | 2026-07-17 | MainThreadPoster; AppProxy wake-on-send. | +## Consumption modes -## AppShell platform support +**Git source.** Select an immutable `gpui-component` tag or commit. Its source manifest uses the exact GPUI Git revision and the matching exact registry version. Do not select a separate GPUI revision. -`gpui-component-app` is experimental/pre-1.0. “Supported” means the shell has an -implementation and named evidence; it does not mean every downstream product -feature has migrated. +**crates.io.** Once registry readiness is true, select the published framework version. Cargo's normalized package manifests omit the Git location and resolve the same exact engine versions from crates.io. Git and registry sources must represent identical engine source and public behavior. -| Capability | macOS | Windows | Linux | -|---|---|---|---| -| Identity, paths, settings, lifecycle | Native conformance smoke + headless coverage | Compiled; non-window transactional-start smoke | Compiled; headless path available | -| Standard menu surface | Native global application menu | In-window `AppMenuBar`; app places it in chrome | In-window `AppMenuBar`; app places it in chrome | -| Settings shortcut | `cmd-,` | `ctrl-,` | `ctrl-,` | -| Regular/forced/passive activation mapping | Native smoke invokes `Forced`; focus outcome remains manual | Compiled; backend currently ignores force boolean | Compiled; backend currently ignores force boolean | -| Managed normal-window `app_id` | Covered by `WindowManager` conformance | Covered by `WindowManager` conformance | Covered by `WindowManager` conformance | -| Native tray | Unsupported | Unsupported | Unsupported | -| URL-scheme registration | Unsupported | Unsupported | Unsupported | -| Packaging/updater/signing | Not generated by AppShell | Not generated by AppShell | Not generated by AppShell | +## Platform evidence -CI builds `app_shell` and `app_shell_background` on all three operating systems. -Windowed native launch currently runs on macOS: +| Platform | Target | Build | Unit | Headless | Native runtime | Renderer presentation | Package artifact | Maturity | +|---|---|---|---|---|---|---|---|---| +| macOS | `aarch64-apple-darwin` | verified | verified | verified | verified | not-verified | not-verified | preview | +| Windows | `x86_64-pc-windows-msvc` | not-verified | not-verified | not-verified | not-verified | not-verified | not-verified | experimental | +| Linux X11 | `x86_64-unknown-linux-gnu` | not-verified | not-verified | not-verified | not-verified | not-verified | not-verified | experimental | +| Linux Wayland | `x86_64-unknown-linux-gnu` | not-verified | not-verified | not-verified | not-verified | not-verified | not-verified | experimental | -```bash -cargo run -p app_shell -- --smoke -cargo run -p app_shell_background -- --smoke -``` +- **macOS:** Locked workspace build, unit suite, AppShell headless harness, and native AppShell launch/quit smokes passed locally on macOS; renderer presentation was not separately verified. +- **Windows:** Earlier CI compiled Windows, but the uncommitted 0.7 compatibility line has not run there; no native DirectX present surface is exercised. +- **Linux X11:** X11 implementation and earlier compile evidence exist, but the uncommitted 0.7 line has not run on Linux; CI has no stable display and Vulkan presentation evidence. +- **Linux Wayland:** Wayland implementation exists, but the uncommitted 0.7 line has not run on Linux and prior CI did not isolate or exercise a Wayland session. -The no-window transactional-start failure path runs on macOS and Windows. CI -requires its in-transaction marker and exact exit status `2`, preventing an -earlier platform-construction failure from passing as startup evidence. +## crates.io readiness -Windows GitHub runners have no reliable DirectX present surface. Manual validation -uses the same commands in an interactive desktop session. +**Blocked.** Framework publication must not start yet. -Linux GPUI rendering requires a display and Vulkan device. Manual validation uses: +Blockers: -```bash -xvfb-run -a cargo run -p app_shell -- --smoke -xvfb-run -a cargo run -p app_shell_background -- --smoke -``` +- owner must approve remaining crates.io identities for BumpyClock/gpui packages +- BumpyClock control of existing Longbridge crates.io identities gpui-component, gpui-component-assets, gpui-component-macros, and gpui-wry is unverified +- exact engine versions must be published before framework packages +- gpui-component-app remains private because fix-path-env is a Git-only normal dependency with no registry release +- GPUI root patches for async-task, calloop, and windows-capture are not inherited by Git consumers or packaged manifests +- Lucide-derived bundled icon source, version, license, and notice require owner review before framework publication -This remains `compiled-not-natively-validated` in CI until the runner supplies a -stable software Vulkan path such as lavapipe. Platform-specific behavior must keep -that label rather than being promoted from compilation alone. - -## Release discipline - -1. gpui fork commits that gpui-component adopts get an annotated tag in the fork repo - (`gpui-vYYYY.MM.DD-`). -2. This workspace shares one `[workspace.package] version`; bumping it (via - `/update-gpui` or a release) creates the matching annotated tag `v` here. -3. A gpui rev bump or breaking API change ⇒ minor bump while pre-1.0. -4. Release-candidate CI builds the three app repos against the proposed rev before the - tag is blessed (plan §6 gate 8). +Historical evidence: immutable `v0.6.0` pinned GPUI `2a03ae6e789b77e98f9d9bd5489758a082313c75`. Current `0.7.0` metadata defines a new compatibility line; it does not reinterpret that tag. diff --git a/docs/docs/getting-started.md b/docs/docs/getting-started.md index b17ba500..c2a8cdc5 100644 --- a/docs/docs/getting-started.md +++ b/docs/docs/getting-started.md @@ -9,16 +9,17 @@ order: -2 ## Installation -Add dependencies to your `Cargo.toml`: +Use the same immutable framework tag for every framework package. The framework +owns GPUI selection, so this application does not declare GPUI directly. -```toml-vue +```toml [dependencies] -gpui-component-app = "{{ VERSION }}" -gpui-component-assets = "{{ VERSION }}" +gpui-component-app = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } +gpui-component-assets = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } serde = { version = "1", features = ["derive"] } [build-dependencies] -gpui-component-manifest = "{{ VERSION }}" +gpui-component-manifest = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } [package.metadata.gpui-app] app_id = "com.example.hello" @@ -26,11 +27,9 @@ display_name = "Hello" categories = ["Development"] ``` -:::tip -`gpui-component-app` is experimental/pre-1.0. Until it is published as a stable -release, pin AppShell, manifest, assets, and any direct GPUI dependencies to one -repository revision. See [Building an Application](./app-shell.md). -::: +`v0.6.0` is the latest immutable framework tag. The current `0.7.0` source +tree is not released, and registry consumption is blocked until exact GPUI fork +packages are published. See [Compatibility](../COMPATIBILITY.md). ## Quick Start diff --git a/docs/docs/index.md b/docs/docs/index.md index 9c568a7a..698f228f 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -28,15 +28,18 @@ GPUI Component is a comprehensive UI component library for building fantastic de For a native application, start with the experimental AppShell layer: -```toml-vue +```toml [dependencies] -gpui-component-app = "{{ VERSION }}" -gpui-component-assets = "{{ VERSION }}" +gpui-component-app = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } +gpui-component-assets = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } [build-dependencies] -gpui-component-manifest = "{{ VERSION }}" +gpui-component-manifest = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } ``` +The framework tag selects its GPUI revision. Do not add a separate GPUI +dependency; see [Installation](./installation.md) for release status. + Declare `[package.metadata.gpui-app]` and the two-line identity `build.rs` described in [Building an Application](./app-shell.md), then create the window: diff --git a/docs/docs/installation.md b/docs/docs/installation.md index 60c1f88f..3e5c1090 100644 --- a/docs/docs/installation.md +++ b/docs/docs/installation.md @@ -6,7 +6,12 @@ order: -1 # Installation -Before you start to build your application with `gpui-component`, you need to install the library. +Use one immutable GPUI Component release. The framework source selects its +matching GPUI revision; applications must not select GPUI independently. + +The latest framework tag is `v0.6.0`. The `0.7.0` source tree is not released, +and crates.io publication remains blocked on GPUI fork packages. See the +[compatibility matrix](../COMPATIBILITY.md) for current evidence and blockers. ## System Requirements @@ -35,14 +40,20 @@ Run `./script/bootstrap` to install system dependencies. ## Rust and Cargo -We use Rust programming language to build the `gpui-component` library. Make sure you have Rust and Cargo installed on your system. +Make sure Rust and Cargo are installed. - Rust 1.90 or later - Cargo (comes with Rust) -To install the `gpui-component` library, you can use Cargo, the Rust package manager. Add the following line to your `Cargo.toml` file under the `[dependencies]` section: +Add GPUI Component from its immutable framework tag: -```toml-vue -gpui = "{{ GPUI_VERSION }}" -gpui-component = "{{ VERSION }}" +```toml +[dependencies] +gpui-component = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } +gpui-component-assets = { git = "https://github.com/BumpyClock/gpui-component", tag = "v0.6.0" } ``` + +For AppShell, add `gpui-component-app` and +`gpui-component-manifest` from the same tag as shown in +[Getting Started](./getting-started.md). Do not add `gpui`, +`gpui_platform`, or a GPUI Git revision directly. diff --git a/docs/learned/app-platform-plan.md b/docs/learned/app-platform-plan.md index f84f3034..0e9b6074 100644 --- a/docs/learned/app-platform-plan.md +++ b/docs/learned/app-platform-plan.md @@ -109,7 +109,7 @@ Cross-cutting problems: 4. **Nobody has window-bounds persistence**; layout persistence solved once (agent-term), settings solved well once (ansible). 5. gpui fork has unused app primitives the library never wraps — but some are **stubs**: review verified URL-scheme registration is unimplemented on Windows - (`vendor/gpui/crates/gpui_windows/src/platform.rs:842`) and Linux + ([`BumpyClock/gpui@d1a6019136eb9fb9386eaa047a7445c1032d8668`](https://github.com/BumpyClock/gpui/blob/d1a6019136eb9fb9386eaa047a7445c1032d8668/crates/gpui_windows/src/platform.rs#L842)) and Linux (`gpui_linux/src/platform.rs:685`), and X11 overlay click-through is a silent no-op (`x11/window.rs:1619`). "Exists in the fork" ≠ "works on 3 OSes". diff --git a/docs/learned/gpui-submodule.md b/docs/learned/gpui-submodule.md index 407710fa..022f26a2 100644 --- a/docs/learned/gpui-submodule.md +++ b/docs/learned/gpui-submodule.md @@ -1,40 +1,42 @@ --- -title: "GPUI Submodule Workflow" -summary: "Notes on keeping the GPUI submodule and workspace git dependency revision in sync." -read_when: "updating GPUI, touching vendor/gpui, or changing workspace GPUI dependency pins" +title: "Local GPUI Override Workflow" +summary: "Use an uncommitted Cargo patch for coordinated framework and GPUI development." +read_when: "testing framework changes against a sibling GPUI checkout or changing workspace GPUI dependency pins" --- -# GPUI Submodule Workflow - -Date: 2026-02-10 - -## Why - -- Keep GPUI source local for patching/review. -- Keep workspace build stable with upstream Zed workspace dependency model. - -## Current Setup - -- Submodule path: `vendor/gpui` -- Submodule remote: `https://github.com/BumpyClock/zed` -- Workspace `gpui` dependency stays git+rev in `Cargo.toml`. - -## Patch Flow - -1. Edit GPUI in submodule: - - `cd vendor/gpui` - - create branch - - patch + commit - - push to `BumpyClock/zed` -2. Bump gpui rev in workspace: - - copy new GPUI commit SHA - - update `Cargo.toml` `workspace.dependencies.gpui.rev` -3. Pin submodule to same SHA: - - `git -C vendor/gpui checkout ` -4. Verify: - - `cargo check -p gpui-component` - - optional: `cargo test -p gpui-component --lib` - -## Important Note - -- Direct path dependency to `vendor/gpui/crates/gpui` fails because `gpui` inherits many `workspace.dependencies` from Zed workspace. -- Keep git dependency + local submodule in sync instead of path override. +# Local GPUI Override Workflow + +The committed framework always uses the immutable GPUI Git revision in the +workspace manifest. The repository does not vendor GPUI and has no GPUI +submodule. + +For coordinated development, clone GPUI beside this repository and create an +uncommitted `.cargo/config.toml` override: + +```toml +[patch."https://github.com/BumpyClock/gpui"] +bumpyclock-gpui = { path = "../gpui/crates/gpui" } +gpui_platform = { path = "../gpui/crates/gpui_platform" } +gpui_macros = { path = "../gpui/crates/gpui_macros" } +sum_tree = { path = "../gpui/crates/sum_tree" } +``` + +Patch keys are Cargo package identities, not dependency aliases or Rust import +names. The framework manifest must already declare +`gpui = { package = "bumpyclock-gpui", ... }`; a patch cannot bridge an old +`gpui` package identity to the renamed package. During an identity transition, +test in a disposable framework snapshot and wait for the canonical GPUI commit +before changing the committed pin. + +Add every GPUI package resolved by the framework to the patch table. Keep this +developer-specific override out of commits. Before release work, remove it and +verify the committed Git dependency: + +```bash +cargo xtask compatibility check +cargo xtask release-check +``` + +After the GPUI change merges, update the framework's full GPUI revision and +exact registry versions together, regenerate compatibility documentation, then +repeat the checks above. Engine packages must be published before framework +packages; the committed override never represents a release dependency. diff --git a/examples/system_monitor/Cargo.lock b/examples/system_monitor/Cargo.lock deleted file mode 100644 index 4a11081f..00000000 --- a/examples/system_monitor/Cargo.lock +++ /dev/null @@ -1,7314 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", - "zeroize", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "const-random", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "ar_archive_writer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" -dependencies = [ - "object", -] - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "as-slice" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "ash-window" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52bca67b61cb81e5553babde81b8211f713cb6db79766f80168f3e5f40ea6c82" -dependencies = [ - "ash", - "raw-window-handle", - "raw-window-metal", -] - -[[package]] -name = "ashpd" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "serde", - "serde_repr", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "zbus", -] - -[[package]] -name = "ashpd" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0986d5b4f0802160191ad75f8d33ada000558757db3defb70299ca95d9fcbd" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "serde", - "serde_repr", - "url", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-compression" -version = "0.4.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" -dependencies = [ - "compression-codecs", - "compression-core", - "futures-core", - "futures-io", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand 2.3.0", - "futures-lite 2.6.1", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite 2.6.1", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.6.1", - "parking", - "polling", - "rustix 1.1.2", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.1", - "futures-lite 2.6.1", - "rustix 1.1.2", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "async-signal" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.1.2", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite 2.6.1", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-tar" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1937db2d56578aa3919b9bdb0e5100693fd7d1c0f145c53eb81fbb03e217550" -dependencies = [ - "async-std", - "filetime", - "libc", - "pin-project", - "redox_syscall 0.2.16", - "xattr", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "async_zip" -version = "0.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c50d65ce1b0e0cb65a785ff615f78860d7754290647d3b983208daa4f85e6" -dependencies = [ - "async-compression", - "crc32fast", - "futures-lite 2.6.1", - "pin-project", - "thiserror 2.0.17", -] - -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "av-scenechange" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" -dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey", - "rayon", - "thiserror 2.0.17", - "v_frame", - "y4m", -] - -[[package]] -name = "av1-grain" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 8.0.0", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "base62" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adf9755786e27479693dedd3271691a92b5e242ab139cacb9fb8e7fb5381111" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bindgen" -version = "0.71.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" -dependencies = [ - "bitflags 2.10.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.111", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bit_field" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" - -[[package]] -name = "bitstream-io" -version = "4.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" -dependencies = [ - "core2", -] - -[[package]] -name = "blade-graphics" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4deb8f595ce7f00dee3543ebf6fd9a20ea86fc421ab79600dac30876250bdae" -dependencies = [ - "ash", - "ash-window", - "bitflags 2.10.0", - "bytemuck", - "codespan-reporting", - "glow", - "gpu-alloc", - "gpu-alloc-ash", - "hidden-trait", - "js-sys", - "khronos-egl", - "libloading", - "log", - "mint", - "naga", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", - "objc2-quartz-core", - "objc2-ui-kit", - "once_cell", - "raw-window-handle", - "slab", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "blade-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27142319e2f4c264581067eaccb9f80acccdde60d8b4bf57cc50cd3152f109ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "blade-util" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6be3a82c001ba7a17b6f8e413ede5d1004e6047213f8efaf0ffc15b5c4904c" -dependencies = [ - "blade-graphics", - "bytemuck", - "log", - "profiling", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel 2.5.0", - "async-task", - "futures-io", - "futures-lite 2.6.1", - "piper", -] - -[[package]] -name = "bstr" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "built" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" - -[[package]] -name = "bumpalo" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[package]] -name = "bytemuck" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" - -[[package]] -name = "calloop" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" -dependencies = [ - "bitflags 2.10.0", - "polling", - "rustix 1.1.2", - "slab", - "tracing", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" -dependencies = [ - "calloop", - "rustix 1.1.2", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cbindgen" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" -dependencies = [ - "heck 0.4.1", - "indexmap", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 2.0.111", - "tempfile", - "toml 0.8.23", -] - -[[package]] -name = "cc" -version = "1.2.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom 7.1.3", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "cgl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link 0.2.1", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "circular-buffer" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c638459986b83c2b885179bd4ea6a2cbb05697b001501a56adb3a3d230803b" - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" -dependencies = [ - "bitflags 2.10.0", - "block", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" -dependencies = [ - "bitflags 2.10.0", - "block", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "libc", - "objc", -] - -[[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "collections" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "indexmap", - "rustc-hash 2.1.1", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "command-fds" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f849b92c694fe237ecd8fafd1ba0df7ae0d45c1df6daeb7f68ed4220d51640bd" -dependencies = [ - "nix 0.30.1", - "thiserror 2.0.17", -] - -[[package]] -name = "compression-codecs" -version = "0.4.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" -dependencies = [ - "compression-core", - "deflate64", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.16", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-helmer-fork" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-graphics2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4583956b9806b69f73fcb23aee05eb3620efc282972f08f6a6db7504f8334d" -dependencies = [ - "bitflags 2.10.0", - "block", - "cfg-if", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-text" -version = "21.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" -dependencies = [ - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-video" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45e71d5be22206bed53c3c3cb99315fc4c3d31b8963808c6bc4538168c4f8ef" -dependencies = [ - "block", - "core-foundation 0.10.0", - "core-graphics2", - "io-surface", - "libc", - "metal 0.29.0", -] - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "cosmic-text" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8" -dependencies = [ - "bitflags 2.10.0", - "fontdb 0.16.2", - "log", - "rangemap", - "rustc-hash 1.1.0", - "rustybuzz 0.14.1", - "self_cell", - "smol_str", - "swash", - "sys-locale", - "ttf-parser 0.21.1", - "unicode-bidi", - "unicode-linebreak", - "unicode-script", - "unicode-segmentation", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" -dependencies = [ - "ctor-proc-macro", - "dtor", -] - -[[package]] -name = "ctor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" - -[[package]] -name = "data-url" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" - -[[package]] -name = "deflate64" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.111", -] - -[[package]] -name = "derive_refineable" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.10.0", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dtor" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dwrote" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" -dependencies = [ - "lazy_static", - "libc", - "winapi", - "wio", -] - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "embed-resource" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.10+spec-1.1.0", - "vswhom", - "winreg", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endi" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" - -[[package]] -name = "enum-iterator" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "erased-serde" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etagere" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" -dependencies = [ - "euclid", - "svg_fmt", -] - -[[package]] -name = "euclid" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" -dependencies = [ - "num-traits", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "exr" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fax" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" -dependencies = [ - "fax_derive", -] - -[[package]] -name = "fax_derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "filedescriptor" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" -dependencies = [ - "libc", - "thiserror 1.0.69", - "winapi", -] - -[[package]] -name = "filetime" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.60.2", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" - -[[package]] -name = "flate2" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" - -[[package]] -name = "float-ord" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" - -[[package]] -name = "float_next_after" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" - -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin 0.9.8", -] - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "font-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "fontconfig-parser" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" -dependencies = [ - "roxmltree", -] - -[[package]] -name = "fontdb" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.20.0", -] - -[[package]] -name = "fontdb" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.25.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "freetype-sys" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand 2.3.0", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.2", - "windows-link 0.2.1", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "gif" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "globset" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "globwalk" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags 1.3.2", - "ignore", - "walkdir", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "glow" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.10.0", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-ash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbda7a18a29bc98c2e0de0435c347df935bf59489935d0cbd0b73f1679b6f79a" -dependencies = [ - "ash", - "gpu-alloc-types", - "tinyvec", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "gpui" -version = "0.2.2" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "anyhow", - "as-raw-xcb-connection", - "ashpd 0.11.0", - "async-task", - "bindgen", - "bitflags 2.10.0", - "blade-graphics", - "blade-macros", - "blade-util", - "block", - "bytemuck", - "calloop", - "calloop-wayland-source", - "cbindgen", - "circular-buffer", - "cocoa 0.26.0", - "cocoa-foundation 0.2.0", - "collections", - "core-foundation 0.10.0", - "core-foundation-sys", - "core-graphics 0.24.0", - "core-text", - "core-video", - "cosmic-text", - "ctor", - "derive_more", - "embed-resource", - "etagere", - "filedescriptor", - "flume", - "foreign-types", - "futures", - "gpui_macros", - "http_client", - "image", - "inventory", - "itertools 0.14.0", - "libc", - "log", - "lyon", - "mach2", - "media", - "metal 0.29.0", - "naga", - "num_cpus", - "objc", - "oo7", - "open", - "parking", - "parking_lot", - "pathfinder_geometry", - "pin-project", - "postage", - "profiling", - "rand 0.9.2", - "raw-window-handle", - "refineable", - "resvg", - "schemars", - "seahash", - "semver", - "serde", - "serde_json", - "slotmap", - "smallvec", - "smol", - "spin 0.10.0", - "stacksafe", - "strum 0.27.2", - "sum_tree", - "taffy", - "thiserror 2.0.17", - "usvg", - "util", - "util_macros", - "uuid", - "waker-fn", - "wayland-backend", - "wayland-client", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-plasma", - "wayland-protocols-wlr", - "windows 0.61.3", - "windows-core 0.61.2", - "windows-numerics", - "windows-registry", - "x11-clipboard", - "x11rb", - "xkbcommon", - "zed-font-kit", - "zed-scap", - "zed-xim", -] - -[[package]] -name = "gpui-component" -version = "0.5.0" -dependencies = [ - "aho-corasick", - "anyhow", - "chrono", - "enum-iterator", - "gpui", - "gpui-component-macros", - "gpui-macros", - "html5ever", - "itertools 0.13.0", - "lsp-types", - "markdown", - "markup5ever_rcdom", - "notify", - "num-traits", - "once_cell", - "paste", - "regex", - "ropey", - "rust-i18n", - "schemars", - "serde", - "serde_json", - "serde_repr", - "smallvec", - "smol", - "tracing", - "tree-sitter", - "tree-sitter-json", - "unicode-segmentation", - "uuid", - "zed-sum-tree", -] - -[[package]] -name = "gpui-component-macros" -version = "0.5.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "gpui-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb02dd63a2859714ac7b6b476937617c3c744157af1b49f7c904023a79039be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "gpui_macros" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "grid" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "num-traits", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "hidden-trait" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ed9e850438ac849bec07e7d09fbe9309cbd396a5988c30b010580ce08860df" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "html5ever" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" -dependencies = [ - "log", - "mac", - "markup5ever", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http_client" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "anyhow", - "async-compression", - "async-fs", - "async-tar", - "bytes", - "derive_more", - "futures", - "http", - "http-body", - "log", - "parking_lot", - "serde", - "serde_json", - "serde_urlencoded", - "sha2", - "tempfile", - "url", - "util", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "ignore" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "image" -version = "0.25.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png 0.18.0", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core 0.5.0", - "zune-jpeg 0.5.7", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imagesize" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" - -[[package]] -name = "imgref" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" - -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "inotify" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "inventory" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" -dependencies = [ - "rustversion", -] - -[[package]] -name = "io-surface" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "554b8c5d64ec09a3a520fe58e4d48a73e00ff32899cdcbe32a4877afd4968b8e" -dependencies = [ - "cgl", - "core-foundation 0.10.0", - "core-foundation-sys", - "leaky-cow", -] - -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", -] - -[[package]] -name = "kqueue" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "kurbo" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" -dependencies = [ - "arrayvec", - "euclid", - "smallvec", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] - -[[package]] -name = "leak" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" - -[[package]] -name = "leaky-cow" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc" -dependencies = [ - "leak", -] - -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - -[[package]] -name = "libc" -version = "0.2.178" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link 0.2.1", -] - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libredox" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" -dependencies = [ - "bitflags 2.10.0", - "libc", - "redox_syscall 0.6.0", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -dependencies = [ - "serde_core", - "value-bag", -] - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lsp-types" -version = "0.97.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53353550a17c04ac46c585feb189c2db82154fc84b79c7a66c96c2c644f66071" -dependencies = [ - "bitflags 1.3.2", - "fluent-uri", - "serde", - "serde_json", - "serde_repr", -] - -[[package]] -name = "lyon" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352" -dependencies = [ - "lyon_algorithms", - "lyon_tessellation", -] - -[[package]] -name = "lyon_algorithms" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647" -dependencies = [ - "lyon_path", - "num-traits", -] - -[[package]] -name = "lyon_geom" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906021b2343" -dependencies = [ - "arrayvec", - "euclid", - "num-traits", -] - -[[package]] -name = "lyon_path" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb" -dependencies = [ - "lyon_geom", - "num-traits", -] - -[[package]] -name = "lyon_tessellation" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353" -dependencies = [ - "float_next_after", - "lyon_path", - "num-traits", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "mach2" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" -dependencies = [ - "libc", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "markdown" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5cab8f2cadc416a82d2e783a1946388b31654d391d1c7d92cc1f03e295b1deb" -dependencies = [ - "serde", - "unicode-id", -] - -[[package]] -name = "markup5ever" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" -dependencies = [ - "log", - "phf", - "phf_codegen", - "string_cache", - "string_cache_codegen", - "tendril", -] - -[[package]] -name = "markup5ever_rcdom" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edaa21ab3701bfee5099ade5f7e1f84553fd19228cf332f13cd6e964bf59be18" -dependencies = [ - "html5ever", - "markup5ever", - "tendril", - "xml5ever", -] - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "media" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "anyhow", - "bindgen", - "core-foundation 0.10.0", - "core-video", - "ctor", - "foreign-types", - "metal 0.29.0", - "objc", -] - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[package]] -name = "memmap2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.10.0", - "block", - "core-graphics-types 0.1.3", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "metal" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" -dependencies = [ - "bitflags 2.10.0", - "block", - "core-graphics-types 0.1.3", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[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]] -name = "mint" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" - -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "moxcms" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "naga" -version = "25.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.10.0", - "cfg_aliases", - "codespan-reporting", - "half", - "hashbrown 0.15.5", - "hexf-parse", - "indexmap", - "log", - "num-traits", - "once_cell", - "rustc-hash 1.1.0", - "spirv", - "strum 0.26.3", - "thiserror 2.0.17", - "unicode-ident", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "normpath" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "notify" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" -dependencies = [ - "bitflags 2.10.0", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "notify-types", - "walkdir", - "windows-sys 0.52.0", -] - -[[package]] -name = "notify-types" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585d3cb5e12e01aed9e8a1f70d5c6b5e86fe2a6e48fc8cd0b3e0b8df6f6eb174" -dependencies = [ - "instant", -] - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "serde", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.10.0", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-metal" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" -dependencies = [ - "bitflags 2.10.0", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "oo7" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3299dd401feaf1d45afd8fd1c0586f10fcfb22f244bb9afa942cec73503b89d" -dependencies = [ - "aes", - "ashpd 0.12.0", - "async-fs", - "async-io", - "async-lock", - "blocking", - "cbc", - "cipher", - "digest", - "endi", - "futures-lite 2.6.1", - "futures-util", - "getrandom 0.3.4", - "hkdf", - "hmac", - "md-5", - "num", - "num-bigint-dig", - "pbkdf2", - "rand 0.9.2", - "serde", - "sha2", - "subtle", - "zbus", - "zbus_macros", - "zeroize", - "zvariant", -] - -[[package]] -name = "open" -version = "5.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" -dependencies = [ - "is-wsl", - "libc", - "pathdiff", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "pathfinder_geometry" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" -dependencies = [ - "log", - "pathfinder_simd", -] - -[[package]] -name = "pathfinder_simd" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf9027960355bf3afff9841918474a81a5f972ac6d226d518060bba758b5ad57" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "perf" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "collections", - "serde", - "serde_json", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand 2.3.0", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "png" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" -dependencies = [ - "bitflags 2.10.0", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - -[[package]] -name = "postage" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" -dependencies = [ - "atomic", - "crossbeam-queue", - "futures", - "log", - "parking_lot", - "pin-project", - "pollster", - "static_assertions", - "thiserror 1.0.69", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.111", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "proc-macro2" -version = "1.0.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" -dependencies = [ - "quote", - "syn 2.0.111", -] - -[[package]] -name = "psm" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" -dependencies = [ - "ar_archive_writer", - "cc", -] - -[[package]] -name = "pxfm" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" -dependencies = [ - "num-traits", -] - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rangemap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" - -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.14.0", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.2", - "rand_chacha 0.9.0", - "simd_helpers", - "thiserror 2.0.17", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "raw-window-metal" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" -dependencies = [ - "cocoa 0.25.0", - "core-graphics 0.23.2", - "objc", - "raw-window-handle", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "read-fonts" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" -dependencies = [ - "bytemuck", - "font-types", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "redox_syscall" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "refineable" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "derive_refineable", -] - -[[package]] -name = "regex" -version = "1.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "resvg" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" -dependencies = [ - "log", - "pico-args", - "rgb", - "svgtypes", - "tiny-skia", - "usvg", -] - -[[package]] -name = "rgb" -version = "0.8.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ropey" -version = "2.0.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4045a00dc327d084a2bbf126976e14125b54f23bd30511d45b842eba76c52d74" -dependencies = [ - "str_indices", -] - -[[package]] -name = "roxmltree" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" - -[[package]] -name = "rust-embed" -version = "8.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.111", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" -dependencies = [ - "globset", - "sha2", - "walkdir", -] - -[[package]] -name = "rust-i18n" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda2551fdfaf6cc5ee283adc15e157047b92ae6535cf80f6d4962d05717dc332" -dependencies = [ - "globwalk", - "once_cell", - "regex", - "rust-i18n-macro", - "rust-i18n-support", - "smallvec", -] - -[[package]] -name = "rust-i18n-macro" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22baf7d7f56656d23ebe24f6bb57a5d40d2bce2a5f1c503e692b5b2fa450f965" -dependencies = [ - "glob", - "once_cell", - "proc-macro2", - "quote", - "rust-i18n-support", - "serde", - "serde_json", - "serde_yaml", - "syn 2.0.111", -] - -[[package]] -name = "rust-i18n-support" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940ed4f52bba4c0152056d771e563b7133ad9607d4384af016a134b58d758f19" -dependencies = [ - "arc-swap", - "base62", - "globwalk", - "itertools 0.11.0", - "lazy_static", - "normpath", - "once_cell", - "proc-macro2", - "regex", - "serde", - "serde_json", - "serde_yaml", - "siphasher", - "toml 0.8.23", - "triomphe", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "rustybuzz" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" -dependencies = [ - "bitflags 2.10.0", - "bytemuck", - "libm", - "smallvec", - "ttf-parser 0.21.1", - "unicode-bidi-mirroring 0.2.0", - "unicode-ccc 0.2.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.10.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.25.1", - "unicode-bidi-mirroring 0.4.0", - "unicode-ccc 0.4.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schemars" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" -dependencies = [ - "dyn-clone", - "indexmap", - "ref-cast", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301858a4023d78debd2353c7426dc486001bddc91ae31a76fb1f55132f7e2633" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.111", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "screencapturekit" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5eeeb57ac94960cfe5ff4c402be6585ae4c8d29a2cf41b276048c2e849d64e" -dependencies = [ - "screencapturekit-sys", -] - -[[package]] -name = "screencapturekit-sys" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22411b57f7d49e7fe08025198813ee6fd65e1ee5eff4ebc7880c12c82bde4c60" -dependencies = [ - "block", - "dispatch", - "objc", - "objc-foundation", - "objc_id", - "once_cell", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "self_cell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "serde_fmt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_json_lenient" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e033097bf0d2b59a62b42c18ebbb797503839b26afdda2c4e1415cb6c813540" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" -dependencies = [ - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "simplecss" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" -dependencies = [ - "log", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "skrifa" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" -dependencies = [ - "bytemuck", - "read-fonts", -] - -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "smol" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spin" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "stacker" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - -[[package]] -name = "stacksafe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9c1172965d317e87ddb6d364a040d958b40a1db82b6ef97da26253a8b3d090" -dependencies = [ - "stacker", - "stacksafe-macro", -] - -[[package]] -name = "stacksafe-macro" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172175341049678163e979d9107ca3508046d4d2a7c6682bee46ac541b17db69" -dependencies = [ - "proc-macro-error2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "str_indices" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6" - -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -dependencies = [ - "float-cmp", -] - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.111", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "sum_tree" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "arrayvec", - "log", - "rayon", - "tracing", - "ztracing", -] - -[[package]] -name = "sval" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502b8906c4736190684646827fbab1e954357dfe541013bbd7994d033d53a1ca" - -[[package]] -name = "sval_buffer" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b854348b15b6c441bdd27ce9053569b016a0723eab2d015b1fd8e6abe4f708" -dependencies = [ - "sval", - "sval_ref", -] - -[[package]] -name = "sval_dynamic" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bd9e8b74410ddad37c6962587c5f9801a2caadba9e11f3f916ee3f31ae4a1f" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_fmt" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe17b8deb33a9441280b4266c2d257e166bafbaea6e66b4b34ca139c91766d9" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_json" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854addb048a5bafb1f496c98e0ab5b9b581c3843f03ca07c034ae110d3b7c623" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_nested" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf068f482108ff44ae8013477cb047a1665d5f1a635ad7cf79582c1845dce9" -dependencies = [ - "sval", - "sval_buffer", - "sval_ref", -] - -[[package]] -name = "sval_ref" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed02126365ffe5ab8faa0abd9be54fbe68d03d607cd623725b0a71541f8aaa6f" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_serde" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a263383c6aa2076c4ef6011d3bae1b356edf6ea2613e3d8e8ebaa7b57dd707d5" -dependencies = [ - "serde_core", - "sval", - "sval_nested", -] - -[[package]] -name = "svg_fmt" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" - -[[package]] -name = "svgtypes" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" -dependencies = [ - "kurbo", - "siphasher", -] - -[[package]] -name = "swash" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" -dependencies = [ - "skrifa", - "yazi", - "zeno", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "sys-locale" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" -dependencies = [ - "libc", -] - -[[package]] -name = "sysinfo" -version = "0.31.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "rayon", - "windows 0.57.0", -] - -[[package]] -name = "sysinfo" -version = "0.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "rayon", - "windows 0.57.0", -] - -[[package]] -name = "system_monitor" -version = "0.5.0" -dependencies = [ - "anyhow", - "core-foundation 0.10.0", - "gpui", - "gpui-component", - "metal 0.31.0", - "smol", - "sysinfo 0.33.1", - "windows 0.58.0", -] - -[[package]] -name = "taffy" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13e5d13f79d558b5d353a98072ca8ca0e99da429467804de959aa8c83c9a004" -dependencies = [ - "arrayvec", - "grid", - "serde", - "slotmap", -] - -[[package]] -name = "take-until" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" - -[[package]] -name = "tao-core-video-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "objc", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand 2.3.0", - "getrandom 0.3.4", - "once_cell", - "rustix 1.1.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "tiff" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg 0.4.21", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "png 0.17.16", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.10+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "tree-sitter" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87" -dependencies = [ - "cc", - "regex", - "regex-syntax", - "serde_json", - "streaming-iterator", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-json" -version = "0.24.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-language" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae62f7eae5eb549c71b76658648b72cc6111f2d87d24a1e31fa907f4943e3ce" - -[[package]] -name = "triomphe" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" -dependencies = [ - "arc-swap", - "serde", - "stable_deref_trait", -] - -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -dependencies = [ - "core_maths", -] - -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - -[[package]] -name = "unicode-ccc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" - -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - -[[package]] -name = "unicode-id" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ba288e709927c043cbe476718d37be306be53fb1fafecd0dbe36d072be2580" - -[[package]] -name = "unicode-ident" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" - -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - -[[package]] -name = "unicode-script" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-vo" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "usvg" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" -dependencies = [ - "base64", - "data-url", - "flate2", - "fontdb 0.23.0", - "imagesize", - "kurbo", - "log", - "pico-args", - "roxmltree", - "rustybuzz 0.20.1", - "simplecss", - "siphasher", - "strict-num", - "svgtypes", - "tiny-skia-path", - "unicode-bidi", - "unicode-script", - "unicode-vo", - "xmlwriter", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "util" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "anyhow", - "async-fs", - "async_zip", - "collections", - "command-fds", - "dirs 4.0.0", - "dunce", - "futures", - "futures-lite 1.13.0", - "globset", - "itertools 0.14.0", - "libc", - "log", - "mach2", - "nix 0.29.0", - "regex", - "rust-embed", - "schemars", - "serde", - "serde_json", - "serde_json_lenient", - "shlex", - "smol", - "take-until", - "tempfile", - "tendril", - "unicase", - "walkdir", - "which", -] - -[[package]] -name = "util_macros" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "perf", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "uuid" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" -dependencies = [ - "getrandom 0.3.4", - "js-sys", - "serde_core", - "sha1_smol", - "wasm-bindgen", -] - -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" -dependencies = [ - "value-bag-serde1", - "value-bag-sval2", -] - -[[package]] -name = "value-bag-serde1" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5" -dependencies = [ - "erased-serde", - "serde_core", - "serde_fmt", -] - -[[package]] -name = "value-bag-sval2" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f" -dependencies = [ - "sval", - "sval_buffer", - "sval_dynamic", - "sval_fmt", - "sval_json", - "sval_ref", - "sval_serde", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.111", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.1.2", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.10.0", - "rustix 1.1.2", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" -dependencies = [ - "rustix 1.1.2", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml 0.37.5", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "weezl" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "which" -version = "6.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" -dependencies = [ - "either", - "home", - "rustix 0.38.44", - "winsafe", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-capture" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4df73e95feddb9ec1a7e9c2ca6323b8c97d5eeeff78d28f1eccdf19c882b24" -dependencies = [ - "parking_lot", - "rayon", - "thiserror 2.0.17", - "windows 0.61.3", - "windows-future", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi", -] - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "workspace-hack" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beffa227304dbaea3ad6a06ac674f9bc83a3dec3b7f63eeb442de37e7cb6bb01" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-clipboard" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" -dependencies = [ - "libc", - "x11rb", -] - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "rustix 1.1.2", - "x11rb-protocol", - "xcursor", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "xattr" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" -dependencies = [ - "libc", -] - -[[package]] -name = "xcb" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f07c123b796139bfe0603e654eaf08e132e52387ba95b252c78bad3640ba37ea" -dependencies = [ - "bitflags 1.3.2", - "libc", - "quick-xml 0.30.0", - "x11", -] - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xim-ctext" -version = "0.3.0" -source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" -dependencies = [ - "encoding_rs", -] - -[[package]] -name = "xim-parser" -version = "0.2.1" -source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "xkbcommon" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" -dependencies = [ - "as-raw-xcb-connection", - "libc", - "memmap2", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xml5ever" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bbb26405d8e919bc1547a5aa9abc95cbfa438f04844f5fdd9dc7596b748bf69" -dependencies = [ - "log", - "mac", - "markup5ever", -] - -[[package]] -name = "xmlwriter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" - -[[package]] -name = "y4m" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" - -[[package]] -name = "yazi" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" - -[[package]] -name = "yeslogic-fontconfig-sys" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" -dependencies = [ - "dlib", - "once_cell", - "pkg-config", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zbus" -version = "5.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" -dependencies = [ - "async-broadcast", - "async-executor", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener 5.4.1", - "futures-core", - "futures-lite 2.6.1", - "hex", - "nix 0.30.1", - "ordered-stream", - "serde", - "serde_repr", - "tracing", - "uds_windows", - "uuid", - "windows-sys 0.61.2", - "winnow", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "5.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.111", - "zbus_names", - "zvariant", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" -dependencies = [ - "serde", - "static_assertions", - "winnow", - "zvariant", -] - -[[package]] -name = "zed-font-kit" -version = "0.14.1-zed" -source = "git+https://github.com/zed-industries/font-kit?rev=110523127440aefb11ce0cf280ae7c5071337ec5#110523127440aefb11ce0cf280ae7c5071337ec5" -dependencies = [ - "bitflags 2.10.0", - "byteorder", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "core-text", - "dirs 5.0.1", - "dwrote", - "float-ord", - "freetype-sys", - "lazy_static", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "walkdir", - "winapi", - "yeslogic-fontconfig-sys", -] - -[[package]] -name = "zed-scap" -version = "0.0.8-zed" -source = "git+https://github.com/zed-industries/scap?rev=4afea48c3b002197176fb19cd0f9b180dd36eaac#4afea48c3b002197176fb19cd0f9b180dd36eaac" -dependencies = [ - "anyhow", - "cocoa 0.25.0", - "core-graphics-helmer-fork", - "log", - "objc", - "rand 0.8.5", - "screencapturekit", - "screencapturekit-sys", - "sysinfo 0.31.4", - "tao-core-video-sys", - "windows 0.61.3", - "windows-capture", - "x11", - "xcb", -] - -[[package]] -name = "zed-sum-tree" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d490156d0d7311855564d6e1d6dccab992405a0c0e15e1c8ef18920c02177e35" -dependencies = [ - "arrayvec", - "log", - "rayon", - "workspace-hack", -] - -[[package]] -name = "zed-xim" -version = "0.4.0-zed" -source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" -dependencies = [ - "ahash", - "hashbrown 0.14.5", - "log", - "x11rb", - "xim-ctext", - "xim-parser", -] - -[[package]] -name = "zeno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" - -[[package]] -name = "zerocopy" -version = "0.8.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "zlog" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "anyhow", - "chrono", - "collections", - "log", -] - -[[package]] -name = "ztracing" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" -dependencies = [ - "tracing", - "tracing-subscriber", - "zlog", - "ztracing_macro", -] - -[[package]] -name = "ztracing_macro" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#3104482c6c7c06c02be7d63927487c64695ea290" - -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" -dependencies = [ - "zune-core 0.4.12", -] - -[[package]] -name = "zune-jpeg" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d915729b0e7d5fe35c2f294c5dc10b30207cc637920e5b59077bfa3da63f28" -dependencies = [ - "zune-core 0.5.0", -] - -[[package]] -name = "zvariant" -version = "5.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" -dependencies = [ - "endi", - "enumflags2", - "serde", - "url", - "winnow", - "zvariant_derive", - "zvariant_utils", -] - -[[package]] -name = "zvariant_derive" -version = "5.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.111", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.111", - "winnow", -] diff --git a/typos.toml b/typos.toml index ade79636..e09be148 100644 --- a/typos.toml +++ b/typos.toml @@ -3,7 +3,6 @@ ignore-files = true ignore-hidden = false extend-exclude = [ ".git/", - "vendor/gpui/", # Fixtures may contain intentional test data "**/fixtures/*", ] diff --git a/vendor/gpui b/vendor/gpui deleted file mode 160000 index 1eeb173f..00000000 --- a/vendor/gpui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1eeb173f71fad65c25cc8ea22319715703f05b5b diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml new file mode 100644 index 00000000..b3a02df5 --- /dev/null +++ b/xtask/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "xtask" +version = "0.0.0" +edition.workspace = true +publish = false +rust-version.workspace = true + +[dependencies] +anyhow.workspace = true +serde.workspace = true +serde_json.workspace = true +toml.workspace = true + +[dev-dependencies] +tempfile.workspace = true + +[lints] +workspace = true diff --git a/xtask/src/main.rs b/xtask/src/main.rs new file mode 100644 index 00000000..61bf8451 --- /dev/null +++ b/xtask/src/main.rs @@ -0,0 +1,2022 @@ +use anyhow::{Context, Result, anyhow, bail}; +use serde::Deserialize; +use std::{ + collections::{BTreeMap, BTreeSet, VecDeque}, + env, fs, + path::{Path, PathBuf}, + process::Command, +}; +use toml::Value; + +const COMPATIBILITY_FILE: &str = "compatibility.toml"; +const GENERATED_FILE: &str = "docs/COMPATIBILITY.md"; +const VALID_REGISTRY_STATUSES: &[&str] = &[ + "published", + "unpublished", + "selected-unpublished", + "unavailable", + "conflict", +]; +const VALID_EVIDENCE_STATUSES: &[&str] = &["verified", "not-verified", "not-applicable", "blocked"]; +const VALID_MATURITY: &[&str] = &["supported", "preview", "experimental"]; + +#[derive(Debug, Deserialize)] +struct Compatibility { + schema: u32, + framework: Framework, + gpui: Gpui, + release: Release, + platforms: Vec, +} + +#[derive(Debug, Deserialize)] +struct Framework { + name: String, + version: String, + repository: String, + rust_msrv: String, + pinned_toolchain: String, + audit_toolchain: String, + previous_release: String, + previous_release_gpui_rev: String, +} + +#[derive(Debug, Deserialize)] +struct Gpui { + repository: String, + rev: String, + zed_repository: String, + zed_upstream_base: String, + packages: Vec, +} + +#[derive(Debug, Deserialize)] +struct GpuiPackage { + dependency: String, + registry_package: String, + version: String, + crate_path: String, + public_api: bool, + features: Vec, + registry_status: String, + registry_note: String, +} + +#[derive(Debug, Deserialize)] +struct Release { + crates_io_ready: bool, + blockers: Vec, +} + +#[derive(Debug, Deserialize)] +struct Platform { + name: String, + target: String, + build: String, + unit: String, + headless: String, + native_runtime: String, + renderer: String, + package: String, + maturity: String, + notes: String, +} + +#[derive(Default)] +struct Options { + gpui_path: Option, + require_registry: bool, +} + +fn main() -> Result<()> { + let root = Path::new(env!("CARGO_MANIFEST_DIR")) + .parent() + .context("xtask must be inside the workspace")?; + let mut args = env::args().skip(1); + let Some(command) = args.next() else { + print_help(); + bail!("missing command"); + }; + + match command.as_str() { + "compatibility" => { + let Some(action) = args.next() else { + bail!("usage: cargo xtask compatibility [--gpui-path PATH]"); + }; + let options = parse_options(args)?; + match action.as_str() { + "generate" => generate(root, options.gpui_path.as_deref()), + "check" => check(root, options.gpui_path.as_deref()), + _ => bail!("unknown compatibility action: {action}"), + } + } + "publish-plan" => { + let options = parse_options(args)?; + publish_plan(root, options.gpui_path.as_deref(), options.require_registry) + } + "release-check" => { + let options = parse_options(args)?; + release_check(root, &options) + } + "--help" | "-h" | "help" => { + print_help(); + Ok(()) + } + _ => bail!("unknown command: {command}"), + } +} + +fn print_help() { + println!( + "\ +Usage: + cargo xtask compatibility generate [--gpui-path PATH] + cargo xtask compatibility check [--gpui-path PATH] + cargo xtask publish-plan [--gpui-path PATH] [--require-registry] + cargo xtask release-check [--gpui-path PATH] [--require-registry]" + ); +} + +fn parse_options(mut args: impl Iterator) -> Result { + let mut options = Options::default(); + while let Some(arg) = args.next() { + match arg.as_str() { + "--gpui-path" => { + options.gpui_path = Some( + args.next() + .map(PathBuf::from) + .context("--gpui-path requires a path")?, + ); + } + "--require-registry" => options.require_registry = true, + _ => bail!("unknown option: {arg}"), + } + } + Ok(options) +} + +fn load(root: &Path) -> Result { + let path = root.join(COMPATIBILITY_FILE); + let source = + fs::read_to_string(&path).with_context(|| format!("failed to read {}", path.display()))?; + toml::from_str(&source).with_context(|| format!("invalid {}", path.display())) +} + +fn generate(root: &Path, gpui_path: Option<&Path>) -> Result<()> { + let compatibility = load(root)?; + let report = validate(root, &compatibility, gpui_path, false); + print_warnings(&report.warnings); + if !report.errors.is_empty() { + return Err(validation_error(report.errors)); + } + let output = render(&compatibility); + fs::write(root.join(GENERATED_FILE), output) + .with_context(|| format!("failed to write {GENERATED_FILE}"))?; + println!("generated {GENERATED_FILE}"); + Ok(()) +} + +fn check(root: &Path, gpui_path: Option<&Path>) -> Result<()> { + let compatibility = load(root)?; + let mut report = validate(root, &compatibility, gpui_path, true); + validate_generated(root, &compatibility, &mut report.errors); + print_warnings(&report.warnings); + if !report.errors.is_empty() { + return Err(validation_error(report.errors)); + } + println!( + "compatibility valid: {} {} -> {}#{}", + compatibility.framework.name, + compatibility.framework.version, + compatibility.gpui.repository, + compatibility.gpui.rev + ); + Ok(()) +} + +fn validate_generated(root: &Path, compatibility: &Compatibility, errors: &mut Vec) { + match fs::read_to_string(root.join(GENERATED_FILE)) { + Ok(actual) if actual == render(compatibility) => {} + Ok(_) => errors.push(format!( + "{GENERATED_FILE} is stale; run `cargo xtask compatibility generate`" + )), + Err(error) => errors.push(format!("failed to read {GENERATED_FILE}: {error}")), + } +} + +#[derive(Default)] +struct Validation { + errors: Vec, + warnings: Vec, +} + +fn validation_error(errors: Vec) -> anyhow::Error { + anyhow!( + "compatibility validation failed:\n{}", + errors + .into_iter() + .map(|error| format!("- {error}")) + .collect::>() + .join("\n") + ) +} + +fn print_warnings(warnings: &[String]) { + for warning in warnings { + eprintln!("warning: {warning}"); + } +} + +fn validate( + root: &Path, + compatibility: &Compatibility, + gpui_path: Option<&Path>, + check_generated: bool, +) -> Validation { + let mut report = Validation::default(); + validate_metadata(compatibility, &mut report.errors); + + let root_manifest_path = root.join("Cargo.toml"); + let root_manifest = match read_toml(&root_manifest_path) { + Ok(manifest) => manifest, + Err(error) => { + report.errors.push(error.to_string()); + return report; + } + }; + validate_root_manifest(&root_manifest, compatibility, &mut report.errors); + validate_all_manifests(root, compatibility, &mut report.errors); + validate_lockfile(root, compatibility, &mut report.errors); + validate_toolchain(root, compatibility, &mut report.errors); + validate_publishable_dependencies(root, &mut report.errors); + + if let Some(gpui_path) = gpui_path { + validate_gpui_checkout(gpui_path, compatibility, &mut report); + } + + if check_generated && !root.join(GENERATED_FILE).is_file() { + report.errors.push(format!( + "{GENERATED_FILE} is missing; run `cargo xtask compatibility generate`" + )); + } + report +} + +fn validate_metadata(compatibility: &Compatibility, errors: &mut Vec) { + if compatibility.schema != 1 { + errors.push(format!( + "unsupported compatibility schema {}; expected 1", + compatibility.schema + )); + } + if compatibility.framework.name.trim().is_empty() { + errors.push("framework.name must not be empty".into()); + } + if compatibility.framework.repository.trim().is_empty() { + errors.push("framework.repository must not be empty".into()); + } + if !is_version(&compatibility.framework.version) { + errors.push("framework.version must be a three-part numeric version".into()); + } + if !is_version(&compatibility.framework.previous_release) { + errors.push("framework.previous_release must be a three-part numeric version".into()); + } + if !is_msrv(&compatibility.framework.rust_msrv) { + errors.push("framework.rust_msrv must be a numeric major.minor version".into()); + } + if !is_version(&compatibility.framework.pinned_toolchain) { + errors.push("framework.pinned_toolchain must be a three-part numeric version".into()); + } + if !is_version(&compatibility.framework.audit_toolchain) { + errors.push("framework.audit_toolchain must be a three-part numeric version".into()); + } + if !is_full_sha(&compatibility.framework.previous_release_gpui_rev) { + errors.push("framework.previous_release_gpui_rev must be a full commit SHA".into()); + } + if !is_full_sha(&compatibility.gpui.rev) { + errors.push("gpui.rev must be a full commit SHA".into()); + } + if compatibility.gpui.repository != "https://github.com/BumpyClock/gpui" { + errors.push("gpui.repository must be https://github.com/BumpyClock/gpui".into()); + } + if compatibility.gpui.zed_repository != "https://github.com/zed-industries/zed" { + errors.push("gpui.zed_repository must be https://github.com/zed-industries/zed".into()); + } + if compatibility.gpui.zed_upstream_base != "unknown" + && !is_full_sha(&compatibility.gpui.zed_upstream_base) + { + errors.push("gpui.zed_upstream_base must be `unknown` or a full commit SHA".into()); + } + if compatibility.gpui.zed_upstream_base == "unknown" + && !compatibility + .release + .blockers + .iter() + .any(|blocker| blocker.contains("upstream base")) + { + errors.push("unknown Zed upstream base must have an explicit release blocker".into()); + } + + let mut dependencies = BTreeSet::new(); + let mut registry_packages = BTreeSet::new(); + for package in &compatibility.gpui.packages { + if !dependencies.insert(package.dependency.as_str()) { + errors.push(format!( + "duplicate GPUI dependency key `{}`", + package.dependency + )); + } + if !registry_packages.insert(package.registry_package.as_str()) { + errors.push(format!( + "conflicting aliases target registry package `{}`", + package.registry_package + )); + } + if package.dependency.trim().is_empty() + || package.registry_package.trim().is_empty() + || package.crate_path.trim().is_empty() + { + errors.push("GPUI package fields must not be empty".into()); + } + if !is_version(&package.version) { + errors.push(format!( + "{} version must be a three-part numeric version", + package.dependency + )); + } + if !VALID_REGISTRY_STATUSES.contains(&package.registry_status.as_str()) { + errors.push(format!( + "{} has invalid registry status `{}`", + package.dependency, package.registry_status + )); + } + if package.registry_note.trim().is_empty() { + errors.push(format!( + "{} registry_note must not be empty", + package.dependency + )); + } + } + + if compatibility.release.crates_io_ready + && (compatibility + .gpui + .packages + .iter() + .any(|package| package.registry_status != "published") + || !compatibility.release.blockers.is_empty()) + { + errors.push( + "release.crates_io_ready cannot be true while registry packages or blockers remain" + .into(), + ); + } + + for platform in &compatibility.platforms { + for (field, value) in [ + ("build", &platform.build), + ("unit", &platform.unit), + ("headless", &platform.headless), + ("native_runtime", &platform.native_runtime), + ("renderer", &platform.renderer), + ("package", &platform.package), + ] { + if !VALID_EVIDENCE_STATUSES.contains(&value.as_str()) { + errors.push(format!( + "{} has invalid {field} status `{value}`", + platform.name + )); + } + } + if !VALID_MATURITY.contains(&platform.maturity.as_str()) { + errors.push(format!( + "{} has invalid maturity `{}`", + platform.name, platform.maturity + )); + } + if platform.target.trim().is_empty() || platform.notes.trim().is_empty() { + errors.push(format!("{} must have target and notes", platform.name)); + } + } +} + +fn validate_root_manifest( + manifest: &Value, + compatibility: &Compatibility, + errors: &mut Vec, +) { + let workspace = table_at(manifest, &["workspace"], "Cargo.toml [workspace]", errors); + let Some(workspace) = workspace else { + return; + }; + let package = table_at_table(workspace, "package", "[workspace.package]", errors); + if let Some(package) = package { + check_string( + package, + "version", + &compatibility.framework.version, + "workspace package version", + errors, + ); + check_string( + package, + "rust-version", + &compatibility.framework.rust_msrv, + "workspace rust-version", + errors, + ); + } + let dependencies = table_at_table( + workspace, + "dependencies", + "[workspace.dependencies]", + errors, + ); + let Some(dependencies) = dependencies else { + return; + }; + for package in &compatibility.gpui.packages { + let Some(value) = dependencies.get(&package.dependency) else { + errors.push(format!( + "workspace dependency `{}` is missing", + package.dependency + )); + continue; + }; + validate_dependency( + "Cargo.toml [workspace.dependencies]", + &package.dependency, + value, + package, + compatibility, + false, + errors, + ); + } +} + +fn validate_all_manifests(root: &Path, compatibility: &Compatibility, errors: &mut Vec) { + let mut manifests = Vec::new(); + collect_manifests(root, &mut manifests, errors); + for path in manifests { + let Ok(manifest) = read_toml(&path) else { + continue; + }; + visit_dependency_tables(&manifest, "", &mut |section, dependencies| { + let is_workspace = section == "workspace.dependencies"; + for package in &compatibility.gpui.packages { + if let Some(value) = dependencies.get(&package.dependency) { + let label = format!("{} [{section}]", relative(root, &path)); + validate_dependency( + &label, + &package.dependency, + value, + package, + compatibility, + !is_workspace, + errors, + ); + } + } + }); + } +} + +fn validate_dependency( + location: &str, + dependency: &str, + value: &Value, + package: &GpuiPackage, + compatibility: &Compatibility, + allow_workspace: bool, + errors: &mut Vec, +) { + let Some(table) = value.as_table() else { + errors.push(format!( + "{location}: GPUI dependency `{dependency}` must use a detailed declaration" + )); + return; + }; + if allow_workspace && table.get("workspace").and_then(Value::as_bool) == Some(true) { + if table.contains_key("git") + || table.contains_key("rev") + || table.contains_key("branch") + || table.contains_key("version") + || table.contains_key("package") + { + errors.push(format!( + "{location}: workspace dependency `{dependency}` must not override source identity" + )); + } + return; + } + + if table.contains_key("branch") || table.contains_key("tag") { + errors.push(format!( + "{location}: GPUI dependency `{dependency}` must use only a full `rev`, not branch/tag" + )); + } + match table.get("git").and_then(Value::as_str) { + Some(git) if git == compatibility.gpui.repository => {} + Some(git) => errors.push(format!( + "{location}: GPUI dependency `{dependency}` uses noncanonical Git URL `{git}`" + )), + None => errors.push(format!( + "{location}: GPUI dependency `{dependency}` is missing `git`" + )), + } + match table.get("rev").and_then(Value::as_str) { + Some(rev) if rev == compatibility.gpui.rev && is_full_sha(rev) => {} + Some(rev) => errors.push(format!( + "{location}: GPUI dependency `{dependency}` uses revision `{rev}`, expected `{}`", + compatibility.gpui.rev + )), + None => errors.push(format!( + "{location}: GPUI dependency `{dependency}` is missing `rev`" + )), + } + let expected_version = format!("={}", package.version); + match table.get("version").and_then(Value::as_str) { + Some(version) if version == expected_version => {} + Some(version) => errors.push(format!( + "{location}: public GPUI dependency `{dependency}` version `{version}` is not exact `{expected_version}`" + )), + None => errors.push(format!( + "{location}: GPUI dependency `{dependency}` is Git-only; exact `version` is required" + )), + } + let actual_package = table + .get("package") + .and_then(Value::as_str) + .unwrap_or(dependency); + if normalize_package(actual_package) != normalize_package(&package.registry_package) { + errors.push(format!( + "{location}: dependency `{dependency}` aliases registry package `{actual_package}`, expected `{}`", + package.registry_package + )); + } + let mut actual_features: Vec<_> = table + .get("features") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(Value::as_str) + .map(str::to_owned) + .collect(); + let mut expected_features = package.features.clone(); + actual_features.sort(); + expected_features.sort(); + if actual_features != expected_features { + errors.push(format!( + "{location}: dependency `{dependency}` features {actual_features:?}, expected {expected_features:?}" + )); + } +} + +fn validate_lockfile(root: &Path, compatibility: &Compatibility, errors: &mut Vec) { + let path = root.join("Cargo.lock"); + let lock = match read_toml(&path) { + Ok(lock) => lock, + Err(error) => { + errors.push(error.to_string()); + return; + } + }; + let Some(entries) = lock.get("package").and_then(Value::as_array) else { + errors.push("Cargo.lock has no package entries".into()); + return; + }; + let canonical_sources: Vec<_> = entries + .iter() + .filter_map(Value::as_table) + .filter_map(|package| { + let source = package.get("source").and_then(Value::as_str)?; + source + .contains(&compatibility.gpui.repository) + .then_some((package, source)) + }) + .collect(); + for (package, source) in &canonical_sources { + if !source.contains(&compatibility.gpui.rev) { + errors.push(format!( + "Cargo.lock package `{}` uses canonical GPUI source at revision other than {}: `{source}`", + package + .get("name") + .and_then(Value::as_str) + .unwrap_or(""), + compatibility.gpui.rev + )); + } + } + let canonical_names: BTreeSet<_> = canonical_sources + .iter() + .filter_map(|(package, _)| package.get("name").and_then(Value::as_str)) + .map(normalize_package) + .collect(); + for name in canonical_names { + let sources: BTreeSet<_> = entries + .iter() + .filter_map(Value::as_table) + .filter(|package| { + package + .get("name") + .and_then(Value::as_str) + .is_some_and(|package_name| normalize_package(package_name) == name) + }) + .filter_map(|package| package.get("source").and_then(Value::as_str)) + .collect(); + if sources.len() > 1 { + errors.push(format!( + "Cargo.lock contains duplicate engine package `{name}` from conflicting sources: {}", + sources.into_iter().collect::>().join(", ") + )); + } + } + for expected in &compatibility.gpui.packages { + let matches: Vec<_> = entries + .iter() + .filter_map(Value::as_table) + .filter(|package| { + package.get("name").and_then(Value::as_str) + == Some(expected.registry_package.as_str()) + && package + .get("source") + .and_then(Value::as_str) + .is_some_and(|source| source.contains(&compatibility.gpui.rev)) + }) + .collect(); + if matches.len() != 1 { + errors.push(format!( + "Cargo.lock must resolve exactly one Git package `{}` at {}; found {}", + expected.registry_package, + compatibility.gpui.rev, + matches.len() + )); + continue; + } + let actual_version = matches[0].get("version").and_then(Value::as_str); + if actual_version != Some(expected.version.as_str()) { + errors.push(format!( + "Git package `{}` declares version `{}`, expected `{}`", + expected.registry_package, + actual_version.unwrap_or(""), + expected.version + )); + } + } +} + +fn validate_toolchain(root: &Path, compatibility: &Compatibility, errors: &mut Vec) { + let path = root.join("rust-toolchain.toml"); + match read_toml(&path) { + Ok(toolchain) => { + let actual = value_string(&toolchain, &["toolchain", "channel"]); + if actual != Some(compatibility.framework.pinned_toolchain.as_str()) { + errors.push(format!( + "rust-toolchain.toml channel is `{}`, expected compatibility pinned_toolchain `{}`", + actual.unwrap_or(""), + compatibility.framework.pinned_toolchain + )); + } + } + Err(error) => errors.push(error.to_string()), + } +} + +fn validate_publishable_dependencies(root: &Path, errors: &mut Vec) { + let metadata = match cargo_metadata(root) { + Ok(metadata) => metadata, + Err(error) => { + errors.push(error.to_string()); + return; + } + }; + validate_publishable_metadata(&metadata, errors); +} + +fn validate_publishable_metadata(metadata: &CargoMetadata, errors: &mut Vec) { + let workspace: BTreeMap<_, _> = metadata + .packages + .iter() + .filter(|package| metadata.workspace_members.contains(&package.id)) + .map(|package| (normalize_package(&package.name), package)) + .collect(); + for package in workspace.values().filter(|package| is_publishable(package)) { + for dependency in package + .dependencies + .iter() + .filter(|dependency| dependency.kind.as_deref() != Some("dev")) + { + if dependency + .source + .as_deref() + .is_some_and(|source| source.starts_with("git+") && dependency.req == "*") + { + errors.push(format!( + "publishable package `{}` has Git-only normal dependency `{}`", + package.name, dependency.name + )); + } + if dependency.path.is_some() && dependency.req == "*" { + errors.push(format!( + "publishable package `{}` has path-only normal dependency `{}`", + package.name, dependency.name + )); + } + if dependency.path.is_some() + && workspace + .get(&normalize_package(&dependency.name)) + .is_some_and(|dependency_package| !is_publishable(dependency_package)) + { + errors.push(format!( + "publishable package `{}` depends on private workspace package `{}`", + package.name, dependency.name + )); + } + } + } +} + +fn validate_gpui_checkout( + gpui_path: &Path, + compatibility: &Compatibility, + report: &mut Validation, +) { + if !gpui_path.join("Cargo.toml").is_file() { + report.errors.push(format!( + "--gpui-path {} has no Cargo.toml", + gpui_path.display() + )); + return; + } + match command_output( + Command::new("git") + .args(["rev-parse", "HEAD"]) + .current_dir(gpui_path), + ) { + Ok(head) if head.trim() == compatibility.gpui.rev => {} + Ok(head) => report.warnings.push(format!( + "local GPUI checkout is a development override at {}, not release-compatible pin {}", + head.trim(), + compatibility.gpui.rev + )), + Err(error) => report.errors.push(error.to_string()), + } + match command_output( + Command::new("git") + .args(["status", "--porcelain"]) + .current_dir(gpui_path), + ) { + Ok(status) if status.trim().is_empty() => {} + Ok(_) => report + .warnings + .push("local GPUI checkout has uncommitted changes and is development-only".into()), + Err(error) => report.errors.push(error.to_string()), + } + + for package in &compatibility.gpui.packages { + let path = gpui_path.join(&package.crate_path).join("Cargo.toml"); + match read_toml(&path) { + Ok(manifest) => { + let actual_name = value_string(&manifest, &["package", "name"]); + let actual_version = value_string(&manifest, &["package", "version"]); + if actual_name != Some(package.registry_package.as_str()) { + report.errors.push(format!( + "{} package name is `{}`, expected `{}`", + relative(gpui_path, &path), + actual_name.unwrap_or(""), + package.registry_package + )); + } + if actual_version != Some(package.version.as_str()) { + report.errors.push(format!( + "{} package version is `{}`, expected `{}`", + relative(gpui_path, &path), + actual_version.unwrap_or(""), + package.version + )); + } + } + Err(error) => report.errors.push(error.to_string()), + } + } + + let fork_path = gpui_path.join("fork.toml"); + if fork_path.is_file() { + match read_toml(&fork_path) { + Ok(fork) => { + let recorded = value_string(&fork, &["upstream-base-commit"]) + .or_else(|| value_string(&fork, &["upstream", "base_commit"])) + .or_else(|| value_string(&fork, &["upstream", "commit"])); + if compatibility.gpui.zed_upstream_base != "unknown" + && recorded != Some(compatibility.gpui.zed_upstream_base.as_str()) + { + report.errors.push(format!( + "fork.toml Zed upstream base `{}` does not match compatibility metadata `{}`", + recorded.unwrap_or(""), + compatibility.gpui.zed_upstream_base + )); + } + } + Err(error) => report.errors.push(error.to_string()), + } + } else { + report + .errors + .push(format!("{} is missing fork.toml", gpui_path.display())); + } + validate_root_patches(gpui_path, report); +} + +fn validate_root_patches(gpui_path: &Path, report: &mut Validation) { + let manifest = match read_toml(&gpui_path.join("Cargo.toml")) { + Ok(manifest) => manifest, + Err(error) => { + report.errors.push(error.to_string()); + return; + } + }; + let metadata = match cargo_metadata_full(gpui_path) { + Ok(metadata) => metadata, + Err(error) => { + report.errors.push(error.to_string()); + return; + } + }; + let patches: BTreeSet<_> = resolved_git_root_patches(&manifest, &metadata) + .into_values() + .collect(); + for package in patches { + report.errors.push(format!( + "GPUI workspace root patch for `{package}` affects the publishable dependency graph but is not inherited by Git consumers or packaged manifests" + )); + } +} + +fn render(compatibility: &Compatibility) -> String { + let mut output = String::new(); + output.push_str( + "---\ntitle: \"Compatibility Matrix\"\nsummary: \"Generated framework, GPUI, registry, and platform compatibility evidence.\"\nread_when: \"updating GPUI pins, packaging crates, or preparing a release\"\n---\n\n\n", + ); + output.push_str("# Compatibility\n\n"); + output.push_str(&format!( + "- Framework: `{}` `{}`\n- Framework repository: `{}`\n- Declared Rust MSRV: `{}` (not exercised by this audit)\n- Repository-pinned toolchain: `{}` (not installed in this environment)\n- Audit host toolchain: `{}`\n- GPUI repository: `{}`\n- GPUI commit: `{}`\n- Zed upstream: `{}`\n- Zed upstream base: `{}`\n\n", + compatibility.framework.name, + compatibility.framework.version, + compatibility.framework.repository, + compatibility.framework.rust_msrv, + compatibility.framework.pinned_toolchain, + compatibility.framework.audit_toolchain, + compatibility.gpui.repository, + compatibility.gpui.rev, + compatibility.gpui.zed_repository, + compatibility.gpui.zed_upstream_base, + )); + output.push_str("## Engine packages\n\n"); + output.push_str( + "| Dependency | Registry package | Exact version | Features | Public API | Registry status | Note |\n", + ); + output.push_str("|---|---|---:|---|:---:|---|---|\n"); + for package in &compatibility.gpui.packages { + output.push_str(&format!( + "| `{}` | `{}` | `={}` | {} | {} | {} | {} |\n", + package.dependency, + package.registry_package, + package.version, + if package.features.is_empty() { + "none".into() + } else { + package + .features + .iter() + .map(|feature| format!("`{feature}`")) + .collect::>() + .join(", ") + }, + if package.public_api { "yes" } else { "no" }, + package.registry_status, + package.registry_note + )); + } + output.push_str("\n## Consumption modes\n\n"); + output.push_str( + "**Git source.** Select an immutable `gpui-component` tag or commit. Its source manifest uses the exact GPUI Git revision and the matching exact registry version. Do not select a separate GPUI revision.\n\n", + ); + output.push_str( + "**crates.io.** Once registry readiness is true, select the published framework version. Cargo's normalized package manifests omit the Git location and resolve the same exact engine versions from crates.io. Git and registry sources must represent identical engine source and public behavior.\n\n", + ); + output.push_str("## Platform evidence\n\n"); + output.push_str("| Platform | Target | Build | Unit | Headless | Native runtime | Renderer presentation | Package artifact | Maturity |\n"); + output.push_str("|---|---|---|---|---|---|---|---|---|\n"); + for platform in &compatibility.platforms { + output.push_str(&format!( + "| {} | `{}` | {} | {} | {} | {} | {} | {} | {} |\n", + platform.name, + platform.target, + platform.build, + platform.unit, + platform.headless, + platform.native_runtime, + platform.renderer, + platform.package, + platform.maturity + )); + } + output.push_str("\n"); + for platform in &compatibility.platforms { + output.push_str(&format!("- **{}:** {}\n", platform.name, platform.notes)); + } + output.push_str("\n## crates.io readiness\n\n"); + output.push_str(if compatibility.release.crates_io_ready { + "**Ready.** Compatibility and package checks still must pass for the release commit.\n" + } else { + "**Blocked.** Framework publication must not start yet.\n" + }); + if !compatibility.release.blockers.is_empty() { + output.push_str("\nBlockers:\n\n"); + for blocker in &compatibility.release.blockers { + output.push_str(&format!("- {blocker}\n")); + } + } + output.push_str(&format!( + "\nHistorical evidence: immutable `v{}` pinned GPUI `{}`. Current `{}` metadata defines a new compatibility line; it does not reinterpret that tag.\n", + compatibility.framework.previous_release, + compatibility.framework.previous_release_gpui_rev, + compatibility.framework.version + )); + output +} + +#[derive(Debug, Deserialize)] +struct CargoMetadata { + packages: Vec, + workspace_members: Vec, + #[serde(default)] + resolve: Option, +} + +#[derive(Debug, Deserialize)] +struct CargoResolve { + nodes: Vec, +} + +#[derive(Debug, Deserialize)] +struct CargoNode { + id: String, + deps: Vec, +} + +#[derive(Debug, Deserialize)] +struct CargoNodeDependency { + pkg: String, + #[serde(default)] + dep_kinds: Vec, +} + +#[derive(Debug, Deserialize)] +struct CargoNodeDependencyKind { + kind: Option, +} + +#[derive(Debug, Deserialize)] +struct CargoPackage { + id: String, + name: String, + version: String, + source: Option, + publish: Option>, + description: Option, + license: Option, + license_file: Option, + readme: Option, + repository: Option, + rust_version: Option, + dependencies: Vec, +} + +#[derive(Debug, Deserialize)] +struct CargoDependency { + name: String, + source: Option, + req: String, + path: Option, + kind: Option, +} + +#[derive(Clone)] +struct PlanNode { + id: String, + repository: String, + package: String, + registry_package: String, + version: String, + prerequisites: BTreeSet, + metadata_ready: bool, + registry_status: String, + full_dry_run: String, + non_registry_blocker: bool, +} + +fn publish_plan(root: &Path, gpui_path: Option<&Path>, require_registry: bool) -> Result<()> { + let compatibility = load(root)?; + let nodes = build_plan(root, gpui_path, &compatibility)?; + println!( + "repository\tpackage\tregistry package\tversion\tregistry\tprerequisites\tmetadata\tfull dry-run" + ); + for node in &nodes { + println!( + "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}", + node.repository, + node.package, + node.registry_package, + node.version, + node.registry_status, + if node.prerequisites.is_empty() { + "-".into() + } else { + node.prerequisites + .iter() + .cloned() + .collect::>() + .join(",") + }, + if node.metadata_ready { + "ready" + } else { + "blocked" + }, + node.full_dry_run + ); + } + if require_registry { + require_registry_gate(&nodes)?; + } + Ok(()) +} + +fn require_registry_gate(nodes: &[PlanNode]) -> Result<()> { + let blocked: Vec<_> = nodes + .iter() + .filter(|node| node.registry_status != "published" || node.non_registry_blocker) + .map(|node| { + let mut reasons = Vec::new(); + if node.registry_status != "published" { + reasons.push(format!("registry={}", node.registry_status)); + } + if node.non_registry_blocker { + reasons.push(node.full_dry_run.clone()); + } + format!( + "{}/{} ={} ({})", + node.repository, + node.registry_package, + node.version, + reasons.join("; ") + ) + }) + .collect(); + if !blocked.is_empty() { + bail!( + "publication gate blocked:\n{}", + blocked + .into_iter() + .map(|package| format!("- {package}")) + .collect::>() + .join("\n") + ); + } + Ok(()) +} + +fn build_plan( + root: &Path, + gpui_path: Option<&Path>, + compatibility: &Compatibility, +) -> Result> { + let mut nodes = BTreeMap::::new(); + if let Some(gpui_path) = gpui_path { + let metadata = cargo_metadata_full(gpui_path)?; + let manifest = read_toml(&gpui_path.join("Cargo.toml"))?; + let root_patches = resolved_git_root_patches(&manifest, &metadata); + let patch_reachability = root_patch_reachability(&metadata, &root_patches)?; + let fork_registry = fork_registry_statuses(gpui_path)?; + add_workspace_nodes(&metadata, "BumpyClock/gpui", &mut nodes, |package| { + compatibility + .gpui + .packages + .iter() + .find(|item| { + normalize_package(&item.registry_package) == normalize_package(&package.name) + }) + .map(|item| item.registry_status.clone()) + .or_else(|| { + fork_registry + .get(&normalize_package(&package.name)) + .cloned() + }) + .unwrap_or_else(|| "unknown".into()) + })?; + for (package, patches) in patch_reachability { + let Some(node) = nodes.get_mut(&plan_id("BumpyClock/gpui", &package)) else { + continue; + }; + node.full_dry_run = format!( + "blocked: non-inherited GPUI root patches: {}", + patches.into_iter().collect::>().join(", ") + ); + node.non_registry_blocker = true; + } + } else { + let resolved = cargo_metadata_full(root)?; + add_resolved_engine_nodes(&resolved, compatibility, &mut nodes); + } + + let framework = cargo_metadata(root)?; + let framework_registry: BTreeMap<_, _> = framework + .packages + .iter() + .filter(|package| framework.workspace_members.contains(&package.id)) + .filter(|package| is_publishable(package)) + .map(|package| { + ( + normalize_package(&package.name), + registry_probe(&package.name, &package.version), + ) + }) + .collect(); + add_workspace_nodes( + &framework, + "BumpyClock/gpui-component", + &mut nodes, + |package| { + framework_registry + .get(&normalize_package(&package.name)) + .cloned() + .unwrap_or_else(|| "unknown".into()) + }, + )?; + + let engine_ids: BTreeMap<_, _> = compatibility + .gpui + .packages + .iter() + .map(|package| { + ( + normalize_package(&package.registry_package), + plan_id("BumpyClock/gpui", &package.registry_package), + ) + }) + .collect(); + for package in &framework.packages { + let id = plan_id("BumpyClock/gpui-component", &package.name); + let Some(node) = nodes.get_mut(&id) else { + continue; + }; + let mut directly_uses_engine = false; + for dependency in package + .dependencies + .iter() + .filter(|dependency| dependency.kind.as_deref() != Some("dev")) + { + if let Some(engine_id) = engine_ids.get(&normalize_package(&dependency.name)) { + node.prerequisites.insert(engine_id.clone()); + directly_uses_engine = true; + } + } + if directly_uses_engine + && compatibility + .gpui + .packages + .iter() + .any(|package| package.registry_status != "published") + { + node.full_dry_run = "blocked: exact engine packages are not published".into(); + } + } + topological_sort(nodes) +} + +fn fork_registry_statuses(gpui_path: &Path) -> Result> { + let fork = read_toml(&gpui_path.join("fork.toml"))?; + Ok(fork + .get("registry-packages") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(Value::as_table) + .filter_map(|package| { + let identity = package + .get("package") + .and_then(Value::as_str) + .or_else(|| package.get("workspace").and_then(Value::as_str))?; + Some(( + normalize_package(identity), + package.get("status")?.as_str()?.to_owned(), + )) + }) + .collect()) +} + +fn add_resolved_engine_nodes( + metadata: &CargoMetadata, + compatibility: &Compatibility, + nodes: &mut BTreeMap, +) { + let engine_packages: BTreeMap<_, _> = metadata + .packages + .iter() + .filter(|package| { + package.source.as_deref().is_some_and(|source| { + source.contains(&compatibility.gpui.repository) + && source.contains(&compatibility.gpui.rev) + }) + }) + .map(|package| (normalize_package(&package.name), package)) + .collect(); + let mut reachable = BTreeSet::new(); + let mut pending: VecDeque<_> = compatibility + .gpui + .packages + .iter() + .map(|package| normalize_package(&package.registry_package)) + .collect(); + while let Some(name) = pending.pop_front() { + if !reachable.insert(name.clone()) { + continue; + } + let Some(package) = engine_packages.get(&name) else { + continue; + }; + for dependency in package + .dependencies + .iter() + .filter(|dependency| dependency.kind.as_deref() != Some("dev")) + { + let dependency = normalize_package(&dependency.name); + if engine_packages.contains_key(&dependency) { + pending.push_back(dependency); + } + } + } + for package in engine_packages + .values() + .filter(|package| reachable.contains(&normalize_package(&package.name))) + { + let status = compatibility + .gpui + .packages + .iter() + .find(|item| { + normalize_package(&item.registry_package) == normalize_package(&package.name) + }) + .map(|item| item.registry_status.clone()) + .unwrap_or_else(|| { + if is_publishable(package) { + "unavailable".into() + } else { + "private".into() + } + }); + let id = plan_id("BumpyClock/gpui", &package.name); + let prerequisites = package + .dependencies + .iter() + .filter(|dependency| dependency.kind.as_deref() != Some("dev")) + .filter_map(|dependency| { + engine_packages + .get(&normalize_package(&dependency.name)) + .map(|prerequisite| plan_id("BumpyClock/gpui", &prerequisite.name)) + }) + .collect(); + nodes.insert( + id.clone(), + PlanNode { + id, + repository: "BumpyClock/gpui".into(), + package: package.name.clone(), + registry_package: package.name.clone(), + version: package.version.clone(), + prerequisites, + metadata_ready: is_publishable(package) + && package_metadata_ready(package) + && status != "conflict", + registry_status: status.clone(), + full_dry_run: match status.as_str() { + "published" => "possible".into(), + "private" => "blocked: required engine package is private".into(), + _ => "blocked: engine registry prerequisite unavailable".into(), + }, + non_registry_blocker: false, + }, + ); + } + for package in &compatibility.gpui.packages { + let id = plan_id("BumpyClock/gpui", &package.registry_package); + nodes.entry(id.clone()).or_insert_with(|| PlanNode { + id, + repository: "BumpyClock/gpui".into(), + package: package.registry_package.clone(), + registry_package: package.registry_package.clone(), + version: package.version.clone(), + prerequisites: BTreeSet::new(), + metadata_ready: false, + registry_status: package.registry_status.clone(), + full_dry_run: "blocked: package is not publishable at the pinned GPUI commit".into(), + non_registry_blocker: true, + }); + } +} + +fn resolved_git_root_patches( + manifest: &Value, + metadata: &CargoMetadata, +) -> BTreeMap { + let patches: BTreeMap<_, _> = manifest + .get("patch") + .and_then(|patch| patch.get("crates-io")) + .and_then(Value::as_table) + .into_iter() + .flatten() + .filter_map(|(package, source)| { + Some(( + normalize_package(package), + ( + package.clone(), + normalized_git_repository(source.as_table()?.get("git")?.as_str()?), + ), + )) + }) + .collect(); + metadata + .packages + .iter() + .filter_map(|package| { + let (patch_name, patch_repository) = patches.get(&normalize_package(&package.name))?; + let source = package.source.as_deref()?; + (normalized_git_repository(source) == *patch_repository) + .then(|| (package.id.clone(), patch_name.clone())) + }) + .collect() +} + +fn normalized_git_repository(source: &str) -> String { + source + .strip_prefix("git+") + .unwrap_or(source) + .split(['?', '#']) + .next() + .unwrap_or(source) + .trim_end_matches('/') + .trim_end_matches(".git") + .to_owned() +} + +fn root_patch_reachability( + metadata: &CargoMetadata, + root_patches: &BTreeMap, +) -> Result>> { + let resolve = metadata + .resolve + .as_ref() + .context("full cargo metadata did not include a resolve graph")?; + let dependencies: BTreeMap<_, _> = resolve + .nodes + .iter() + .map(|node| { + ( + node.id.as_str(), + node.deps + .iter() + .filter(|dependency| { + dependency.dep_kinds.is_empty() + || dependency + .dep_kinds + .iter() + .any(|kind| kind.kind.as_deref() != Some("dev")) + }) + .map(|dependency| dependency.pkg.as_str()) + .collect::>(), + ) + }) + .collect(); + let members: BTreeSet<_> = metadata.workspace_members.iter().collect(); + let mut reachable = BTreeMap::new(); + for package in metadata + .packages + .iter() + .filter(|package| members.contains(&package.id) && is_publishable(package)) + { + let mut patches = BTreeSet::new(); + let mut visited = BTreeSet::new(); + let mut pending = VecDeque::from([package.id.as_str()]); + while let Some(id) = pending.pop_front() { + if !visited.insert(id) { + continue; + } + if let Some(patch) = root_patches.get(id) { + patches.insert(patch.clone()); + } + if let Some(dependencies) = dependencies.get(id) { + pending.extend(dependencies.iter().copied()); + } + } + if !patches.is_empty() { + reachable.insert(normalize_package(&package.name), patches); + } + } + Ok(reachable) +} + +fn add_workspace_nodes( + metadata: &CargoMetadata, + repository: &str, + nodes: &mut BTreeMap, + registry_status: impl Fn(&CargoPackage) -> String, +) -> Result<()> { + let members: BTreeSet<_> = metadata.workspace_members.iter().collect(); + let publishable: BTreeMap<_, _> = metadata + .packages + .iter() + .filter(|package| members.contains(&package.id) && is_publishable(package)) + .map(|package| (normalize_package(&package.name), package)) + .collect(); + for package in publishable.values() { + let status = registry_status(package); + let id = plan_id(repository, &package.name); + let metadata_ready = package_metadata_ready(package); + let prerequisites = package + .dependencies + .iter() + .filter(|dependency| dependency.kind.as_deref() != Some("dev")) + .filter_map(|dependency| { + publishable + .get(&normalize_package(&dependency.name)) + .map(|prerequisite| plan_id(repository, &prerequisite.name)) + }) + .collect(); + nodes.insert( + id.clone(), + PlanNode { + id, + repository: repository.into(), + package: package.name.clone(), + registry_package: package.name.clone(), + version: package.version.clone(), + prerequisites, + metadata_ready, + registry_status: status, + full_dry_run: if metadata_ready { + "possible after registry prerequisites".into() + } else { + "blocked: package metadata incomplete".into() + }, + non_registry_blocker: !metadata_ready, + }, + ); + } + Ok(()) +} + +fn topological_sort(mut nodes: BTreeMap) -> Result> { + let mut sorted = Vec::new(); + let known: BTreeSet<_> = nodes.keys().cloned().collect(); + for node in nodes.values_mut() { + node.prerequisites.retain(|item| known.contains(item)); + } + while !nodes.is_empty() { + let next = nodes + .iter() + .filter(|(_, node)| { + node.prerequisites.iter().all(|prerequisite| { + sorted + .iter() + .any(|done: &PlanNode| &done.id == prerequisite) + }) + }) + .min_by_key(|(_, node)| (publication_phase(node), node.id.as_str())) + .map(|(id, _)| id.clone()); + let Some(next) = next else { + bail!("publication graph contains a cycle"); + }; + sorted.push(nodes.remove(&next).expect("selected node exists")); + } + Ok(sorted) +} + +fn publication_phase(node: &PlanNode) -> u8 { + match (node.repository.as_str(), node.package.as_str()) { + ("BumpyClock/gpui", _) => 0, + ("BumpyClock/gpui-component", "gpui-component") => 2, + _ => 1, + } +} + +fn release_check(root: &Path, options: &Options) -> Result<()> { + println!("1/5 compatibility metadata and generated documentation"); + check(root, options.gpui_path.as_deref())?; + + let compatibility = load(root)?; + if options.require_registry { + println!("2/5 complete publication plan and registry availability"); + publish_plan(root, options.gpui_path.as_deref(), true)?; + } + + println!("2/5 source build"); + run(Command::new("cargo") + .args(["check", "--locked", "--workspace", "--all-targets"]) + .current_dir(root))?; + + println!("3/5 unit and headless tests"); + run(Command::new("cargo") + .args(["test", "--locked", "--workspace", "--all-targets"]) + .current_dir(root))?; + + println!("4/5 publication plan"); + publish_plan(root, options.gpui_path.as_deref(), options.require_registry)?; + + println!("5/5 package file lists and normalized manifests"); + let blockers = validate_packages(root, &compatibility, options.require_registry)?; + if blockers.is_empty() { + if options.require_registry { + println!("code, manifest, package, and registry release checks passed"); + } else { + println!( + "code and manifest checks passed; registry readiness was not required (run with --require-registry for publication)" + ); + } + } else { + println!("code checks passed; registry-dependent package artifacts remain blocked:"); + for blocker in blockers { + println!("- {blocker}"); + } + } + Ok(()) +} + +fn validate_packages( + root: &Path, + compatibility: &Compatibility, + require_registry: bool, +) -> Result> { + let metadata = cargo_metadata(root)?; + let mut blockers = Vec::new(); + let engine_registry_blocked = compatibility + .gpui + .packages + .iter() + .any(|package| package.registry_status != "published"); + for package in publishable_package_order(&metadata)? { + run(Command::new("cargo") + .args([ + "package", + "--locked", + "--list", + "--allow-dirty", + "-p", + &package.name, + ]) + .current_dir(root))?; + let mut command = Command::new("cargo"); + command + .args(["package", "--locked", "--allow-dirty", "-p", &package.name]) + .current_dir(root); + if !require_registry { + command.arg("--no-verify"); + } + let output = command + .output() + .with_context(|| format!("failed to package {}", package.name))?; + if output.status.success() { + inspect_package_files(root, package)?; + inspect_normalized_manifest(root, package, compatibility)?; + continue; + } + let stderr = String::from_utf8_lossy(&output.stderr); + let registry_failure = stderr.contains("failed to select a version") + || stderr.contains("no matching package named"); + if !require_registry && engine_registry_blocked && registry_failure { + blockers.push(format!( + "{} {} normalized artifact blocked until exact engine/framework prerequisites are published: {}", + package.name, + package.version, + stderr + .lines() + .find(|line| { + line.contains("failed to select a version") + || line.contains("no matching package named") + }) + .unwrap_or("registry prerequisite unavailable") + .trim() + )); + continue; + } + bail!( + "cargo package failed for {} {}:\n{}", + package.name, + package.version, + stderr + ); + } + Ok(blockers) +} + +fn publishable_package_order(metadata: &CargoMetadata) -> Result> { + let mut remaining: BTreeMap<_, _> = metadata + .packages + .iter() + .filter(|package| metadata.workspace_members.contains(&package.id)) + .filter(|package| is_publishable(package)) + .map(|package| (normalize_package(&package.name), package)) + .collect(); + let package_names: BTreeSet<_> = remaining.keys().cloned().collect(); + let mut published = BTreeSet::new(); + let mut ordered = Vec::new(); + while !remaining.is_empty() { + let next = remaining + .iter() + .find(|(_, package)| { + package + .dependencies + .iter() + .filter(|dependency| dependency.kind.as_deref() != Some("dev")) + .map(|dependency| normalize_package(&dependency.name)) + .filter(|dependency| package_names.contains(dependency)) + .all(|dependency| published.contains(&dependency)) + }) + .map(|(name, _)| name.clone()) + .context("publishable framework package graph contains a cycle")?; + let package = remaining.remove(&next).expect("selected package exists"); + published.insert(next); + ordered.push(package); + } + Ok(ordered) +} + +fn inspect_package_files(root: &Path, package: &CargoPackage) -> Result<()> { + let archive = root + .join("target/package") + .join(format!("{}-{}.crate", package.name, package.version)); + let listing = command_output( + Command::new("tar").args([ + "-tzf", + archive + .to_str() + .context("package archive path is not UTF-8")?, + ]), + )?; + let files: Vec<_> = listing.lines().collect(); + if !files.iter().any(|file| { + file.rsplit('/') + .next() + .is_some_and(|name| name.starts_with("README")) + }) { + bail!("{} contains no README file", archive.display()); + } + if !files.iter().any(|file| { + file.rsplit('/') + .next() + .is_some_and(|name| name.starts_with("LICENSE")) + }) { + bail!("{} contains no LICENSE file", archive.display()); + } + Ok(()) +} + +fn inspect_normalized_manifest( + root: &Path, + package: &CargoPackage, + compatibility: &Compatibility, +) -> Result<()> { + let archive = root + .join("target/package") + .join(format!("{}-{}.crate", package.name, package.version)); + let member = format!("{}-{}/Cargo.toml", package.name, package.version); + let source = command_output( + Command::new("tar").args([ + "-xOf", + archive + .to_str() + .context("package archive path is not UTF-8")?, + &member, + ]), + )?; + let manifest: Value = toml::from_str(&source) + .with_context(|| format!("invalid normalized manifest in {}", archive.display()))?; + let mut errors = Vec::new(); + visit_dependency_tables(&manifest, "", &mut |section, dependencies| { + if !section.ends_with("dependencies") || section.ends_with("dev-dependencies") { + return; + } + for (name, value) in dependencies { + let Some(table) = value.as_table() else { + continue; + }; + if table.contains_key("git") { + errors.push(format!( + "{} [{section}] dependency `{name}` retains a Git source", + archive.display() + )); + } + if table.get("path").is_some() && table.get("version").is_none() { + errors.push(format!( + "{} [{section}] dependency `{name}` is path-only", + archive.display() + )); + } + if let Some(expected) = compatibility + .gpui + .packages + .iter() + .find(|expected| expected.dependency == *name) + { + let version = table.get("version").and_then(Value::as_str); + if version != Some(format!("={}", expected.version).as_str()) { + errors.push(format!( + "{} normalized `{name}` version is `{}`, expected `={}`", + archive.display(), + version.unwrap_or(""), + expected.version + )); + } + let registry_package = table.get("package").and_then(Value::as_str).unwrap_or(name); + if normalize_package(registry_package) + != normalize_package(&expected.registry_package) + { + errors.push(format!( + "{} normalized `{name}` package is `{registry_package}`, expected `{}`", + archive.display(), + expected.registry_package + )); + } + let mut actual_features: Vec<_> = table + .get("features") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(Value::as_str) + .map(str::to_owned) + .collect(); + let mut expected_features = expected.features.clone(); + actual_features.sort(); + expected_features.sort(); + if actual_features != expected_features { + errors.push(format!( + "{} normalized `{name}` features {actual_features:?}, expected {expected_features:?}", + archive.display() + )); + } + } + } + }); + if errors.is_empty() { + Ok(()) + } else { + Err(validation_error(errors)) + } +} + +fn cargo_metadata(root: &Path) -> Result { + let output = Command::new("cargo") + .args(["metadata", "--locked", "--no-deps", "--format-version", "1"]) + .current_dir(root) + .output() + .with_context(|| format!("failed to run cargo metadata in {}", root.display()))?; + if !output.status.success() { + bail!( + "cargo metadata failed in {}:\n{}", + root.display(), + String::from_utf8_lossy(&output.stderr) + ); + } + serde_json::from_slice(&output.stdout).context("cargo metadata returned invalid JSON") +} + +fn cargo_metadata_full(root: &Path) -> Result { + let output = Command::new("cargo") + .args(["metadata", "--locked", "--format-version", "1"]) + .current_dir(root) + .output() + .with_context(|| format!("failed to run cargo metadata in {}", root.display()))?; + if !output.status.success() { + bail!( + "cargo metadata failed in {}:\n{}", + root.display(), + String::from_utf8_lossy(&output.stderr) + ); + } + serde_json::from_slice(&output.stdout).context("cargo metadata returned invalid JSON") +} + +fn registry_probe(package: &str, version: &str) -> String { + let output = Command::new("cargo") + .args([ + "info", + &format!("{package}@{version}"), + "--registry", + "crates-io", + ]) + .output(); + match output { + Ok(output) if output.status.success() => "published".into(), + Ok(output) + if String::from_utf8_lossy(&output.stderr).contains("could not find") + || String::from_utf8_lossy(&output.stderr).contains("no matching package") => + { + "unpublished".into() + } + Ok(_) | Err(_) => "unknown".into(), + } +} + +fn package_metadata_ready(package: &CargoPackage) -> bool { + package.description.is_some() + && (package.license.is_some() || package.license_file.is_some()) + && package.readme.is_some() + && package.repository.is_some() + && package.rust_version.is_some() +} + +fn is_publishable(package: &CargoPackage) -> bool { + !matches!(package.publish.as_deref(), Some([])) +} + +fn plan_id(repository: &str, package: &str) -> String { + format!("{repository}/{}", normalize_package(package)) +} + +fn read_toml(path: &Path) -> Result { + let source = + fs::read_to_string(path).with_context(|| format!("failed to read {}", path.display()))?; + toml::from_str(&source).with_context(|| format!("invalid TOML in {}", path.display())) +} + +fn collect_manifests(directory: &Path, manifests: &mut Vec, errors: &mut Vec) { + let entries = match fs::read_dir(directory) { + Ok(entries) => entries, + Err(error) => { + errors.push(format!("failed to read {}: {error}", directory.display())); + return; + } + }; + for entry in entries.flatten() { + let path = entry.path(); + if path.is_dir() { + if matches!( + path.file_name().and_then(|name| name.to_str()), + Some(".git" | "target" | "vendor" | "node_modules") + ) { + continue; + } + collect_manifests(&path, manifests, errors); + } else if path.file_name().and_then(|name| name.to_str()) == Some("Cargo.toml") { + manifests.push(path); + } + } +} + +fn visit_dependency_tables( + value: &Value, + prefix: &str, + visitor: &mut impl FnMut(&str, &toml::map::Map), +) { + let Some(table) = value.as_table() else { + return; + }; + for (key, value) in table { + let path = if prefix.is_empty() { + key.clone() + } else { + format!("{prefix}.{key}") + }; + if matches!( + key.as_str(), + "dependencies" | "dev-dependencies" | "build-dependencies" + ) { + if let Some(dependencies) = value.as_table() { + visitor(&path, dependencies); + } + } + visit_dependency_tables(value, &path, visitor); + } +} + +fn table_at<'a>( + value: &'a Value, + path: &[&str], + label: &str, + errors: &mut Vec, +) -> Option<&'a toml::map::Map> { + let mut current = value; + for key in path { + let Some(next) = current.get(*key) else { + errors.push(format!("{label} is missing")); + return None; + }; + current = next; + } + match current.as_table() { + Some(table) => Some(table), + None => { + errors.push(format!("{label} must be a table")); + None + } + } +} + +fn table_at_table<'a>( + table: &'a toml::map::Map, + key: &str, + label: &str, + errors: &mut Vec, +) -> Option<&'a toml::map::Map> { + match table.get(key).and_then(Value::as_table) { + Some(table) => Some(table), + None => { + errors.push(format!("{label} is missing or not a table")); + None + } + } +} + +fn check_string( + table: &toml::map::Map, + key: &str, + expected: &str, + label: &str, + errors: &mut Vec, +) { + let actual = table.get(key).and_then(Value::as_str); + if actual != Some(expected) { + errors.push(format!( + "{label} is `{}`, expected `{expected}`", + actual.unwrap_or("") + )); + } +} + +fn value_string<'a>(value: &'a Value, path: &[&str]) -> Option<&'a str> { + let mut current = value; + for key in path { + current = current.get(*key)?; + } + current.as_str() +} + +fn normalize_package(value: &str) -> String { + value.replace('-', "_") +} + +fn is_full_sha(value: &str) -> bool { + value.len() == 40 && value.bytes().all(|byte| byte.is_ascii_hexdigit()) +} + +fn is_version(value: &str) -> bool { + value.split('.').count() == 3 + && value + .split('.') + .all(|part| !part.is_empty() && part.bytes().all(|byte| byte.is_ascii_digit())) +} + +fn is_msrv(value: &str) -> bool { + value.split('.').count() == 2 + && value + .split('.') + .all(|part| !part.is_empty() && part.bytes().all(|byte| byte.is_ascii_digit())) +} + +fn relative(root: &Path, path: &Path) -> String { + path.strip_prefix(root) + .unwrap_or(path) + .display() + .to_string() +} + +fn run(command: &mut Command) -> Result<()> { + let description = format!("{command:?}"); + let status = command + .status() + .with_context(|| format!("failed to run {description}"))?; + if status.success() { + Ok(()) + } else { + bail!("{description} exited with {status}") + } +} + +fn command_output(command: &mut Command) -> Result { + let description = format!("{command:?}"); + let output = command + .output() + .with_context(|| format!("failed to run {description}"))?; + if !output.status.success() { + bail!( + "{description} exited with {}:\n{}", + output.status, + String::from_utf8_lossy(&output.stderr) + ); + } + String::from_utf8(output.stdout).context("command output was not UTF-8") +} + +#[cfg(test)] +mod tests; diff --git a/xtask/src/tests.rs b/xtask/src/tests.rs new file mode 100644 index 00000000..5d3fe3bd --- /dev/null +++ b/xtask/src/tests.rs @@ -0,0 +1,625 @@ +use super::*; +use std::fs; +use tempfile::TempDir; + +const REV: &str = "1111111111111111111111111111111111111111"; +const OLD_REV: &str = "2222222222222222222222222222222222222222"; + +fn fixture() -> (TempDir, Compatibility) { + let directory = TempDir::new().unwrap(); + let root = directory.path(); + fs::create_dir_all(root.join("docs")).unwrap(); + fs::create_dir_all(root.join("example/src")).unwrap(); + fs::write(root.join("example/src/lib.rs"), "").unwrap(); + fs::write( + root.join("compatibility.toml"), + format!( + r#" +schema = 1 +[framework] +name = "framework" +version = "0.7.0" +repository = "https://example.invalid/framework" +rust_msrv = "1.90" +pinned_toolchain = "1.95.0" +audit_toolchain = "1.97.1" +previous_release = "0.6.0" +previous_release_gpui_rev = "{OLD_REV}" +[gpui] +repository = "https://github.com/BumpyClock/gpui" +rev = "{REV}" +zed_repository = "https://github.com/zed-industries/zed" +zed_upstream_base = "unknown" +[[gpui.packages]] +dependency = "gpui" +registry_package = "bumpyclock-gpui" +version = "0.7.0" +crate_path = "crates/gpui" +public_api = true +features = [] +registry_status = "unavailable" +registry_note = "owner approval required" +[release] +crates_io_ready = false +blockers = ["Zed upstream base must be recorded"] +[[platforms]] +name = "macOS" +target = "aarch64-apple-darwin" +build = "verified" +unit = "verified" +headless = "verified" +native_runtime = "verified" +renderer = "not-verified" +package = "not-verified" +maturity = "preview" +notes = "fixture" +"# + ), + ) + .unwrap(); + fs::write( + root.join("Cargo.toml"), + format!( + r#" +[workspace] +members = ["example"] +[workspace.package] +version = "0.7.0" +rust-version = "1.90" +[workspace.dependencies] +gpui = {{ package = "bumpyclock-gpui", version = "=0.7.0", git = "https://github.com/BumpyClock/gpui", rev = "{REV}" }} +"# + ), + ) + .unwrap(); + fs::write( + root.join("example/Cargo.toml"), + r#" +[package] +name = "example" +version = "0.1.0" +edition = "2024" +[dependencies] +gpui.workspace = true +"#, + ) + .unwrap(); + fs::write( + root.join("Cargo.lock"), + format!( + r#" +version = 4 +[[package]] +name = "bumpyclock-gpui" +version = "0.7.0" +source = "git+https://github.com/BumpyClock/gpui?rev={REV}#{REV}" +"# + ), + ) + .unwrap(); + fs::write( + root.join("rust-toolchain.toml"), + "[toolchain]\nchannel = \"1.95.0\"\n", + ) + .unwrap(); + let compatibility = load(root).unwrap(); + fs::write(root.join(GENERATED_FILE), render(&compatibility)).unwrap(); + (directory, compatibility) +} + +fn errors(root: &Path, compatibility: &Compatibility) -> String { + validate(root, compatibility, None, true).errors.join("\n") +} + +#[test] +fn accepts_coherent_fixture() { + let (directory, compatibility) = fixture(); + assert_eq!(errors(directory.path(), &compatibility), ""); +} + +#[test] +fn rejects_different_revision() { + let (directory, compatibility) = fixture(); + fs::write( + directory.path().join("example/Cargo.toml"), + format!( + r#" +[package] +name = "example" +version = "0.1.0" +[dependencies] +gpui = {{ package = "bumpyclock-gpui", version = "=0.7.0", git = "https://github.com/BumpyClock/gpui", rev = "{OLD_REV}" }} +"# + ), + ) + .unwrap(); + assert!(errors(directory.path(), &compatibility).contains("uses revision")); +} + +#[test] +fn rejects_floating_branch() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.toml"); + let source = fs::read_to_string(&path) + .unwrap() + .replace(&format!("rev = \"{REV}\""), "branch = \"main\""); + fs::write(path, source).unwrap(); + let actual = errors(directory.path(), &compatibility); + assert!(actual.contains("not branch/tag")); + assert!(actual.contains("missing `rev`")); +} + +#[test] +fn rejects_git_only_dependency() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.toml"); + let source = fs::read_to_string(&path) + .unwrap() + .replace("version = \"=0.7.0\", ", ""); + fs::write(path, source).unwrap(); + assert!(errors(directory.path(), &compatibility).contains("Git-only")); +} + +#[test] +fn rejects_non_exact_public_version() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.toml"); + let source = fs::read_to_string(&path) + .unwrap() + .replace("version = \"=0.7.0\"", "version = \"0.7\""); + fs::write(path, source).unwrap(); + assert!(errors(directory.path(), &compatibility).contains("is not exact")); +} + +#[test] +fn rejects_git_package_version_mismatch() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.lock"); + let source = fs::read_to_string(&path) + .unwrap() + .replace("version = \"0.7.0\"", "version = \"0.8.0\""); + fs::write(path, source).unwrap(); + assert!(errors(directory.path(), &compatibility).contains("declares version")); +} + +#[test] +fn rejects_any_canonical_gpui_lock_entry_at_another_revision() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.lock"); + let mut source = fs::read_to_string(&path).unwrap(); + source.push_str(&format!( + r#" +[[package]] +name = "engine-helper" +version = "0.1.0" +source = "git+https://github.com/BumpyClock/gpui?rev={OLD_REV}#{OLD_REV}" +"# + )); + fs::write(path, source).unwrap(); + assert!( + errors(directory.path(), &compatibility) + .contains("canonical GPUI source at revision other than") + ); +} + +#[test] +fn rejects_wrong_registry_alias() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.toml"); + let source = fs::read_to_string(&path) + .unwrap() + .replace("package = \"bumpyclock-gpui\"", "package = \"wrong-gpui\""); + fs::write(path, source).unwrap(); + assert!(errors(directory.path(), &compatibility).contains("aliases registry package")); +} + +#[test] +fn accepts_implicit_package_identity_when_names_match() { + let (_, mut compatibility) = fixture(); + compatibility.gpui.packages[0].dependency = "gpui".into(); + compatibility.gpui.packages[0].registry_package = "gpui".into(); + let dependency: Value = toml::from_str(&format!( + r#"version = "=0.7.0" +git = "https://github.com/BumpyClock/gpui" +rev = "{REV}" +"# + )) + .unwrap(); + let mut actual = Vec::new(); + validate_dependency( + "fixture", + "gpui", + &dependency, + &compatibility.gpui.packages[0], + &compatibility, + false, + &mut actual, + ); + assert_eq!(actual, Vec::::new()); +} + +#[test] +fn maps_fork_registry_status_by_explicit_package_identity() { + let directory = TempDir::new().unwrap(); + fs::write( + directory.path().join("fork.toml"), + r#" +[[registry-packages]] +workspace = "gpui" +package = "bumpyclock-gpui" +status = "selected-unpublished" +"#, + ) + .unwrap(); + + let statuses = fork_registry_statuses(directory.path()).unwrap(); + assert_eq!( + statuses.get("bumpyclock_gpui").map(String::as_str), + Some("selected-unpublished") + ); + assert!(!statuses.contains_key("gpui")); +} + +#[test] +fn selected_unpublished_is_valid_but_fails_registry_gate() { + let (_, mut compatibility) = fixture(); + compatibility.gpui.packages[0].registry_status = "selected-unpublished".into(); + let mut metadata_errors = Vec::new(); + validate_metadata(&compatibility, &mut metadata_errors); + assert!(metadata_errors.is_empty(), "{metadata_errors:?}"); + + let node = PlanNode { + id: "repo/bumpyclock-gpui".into(), + repository: "repo".into(), + package: "gpui".into(), + registry_package: "bumpyclock-gpui".into(), + version: "0.7.0".into(), + prerequisites: BTreeSet::new(), + metadata_ready: true, + registry_status: "selected-unpublished".into(), + full_dry_run: "blocked: registry publication is deferred".into(), + non_registry_blocker: false, + }; + let error = require_registry_gate(&[node]).unwrap_err().to_string(); + assert!(error.contains("registry=selected-unpublished")); +} + +#[test] +fn rejects_engine_feature_drift() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.toml"); + let source = fs::read_to_string(&path).unwrap().replace( + &format!("rev = \"{REV}\""), + &format!("rev = \"{REV}\", features = [\"drift\"]"), + ); + fs::write(path, source).unwrap(); + assert!(errors(directory.path(), &compatibility).contains("features [\"drift\"]")); +} + +#[test] +fn detects_stale_generated_document() { + let (directory, compatibility) = fixture(); + fs::write(directory.path().join(GENERATED_FILE), "stale").unwrap(); + let mut actual = Vec::new(); + validate_generated(directory.path(), &compatibility, &mut actual); + assert_eq!(actual.len(), 1); + assert!(actual[0].contains("is stale")); +} + +#[test] +fn rejects_missing_required_metadata_field() { + let (directory, _) = fixture(); + let path = directory.path().join(COMPATIBILITY_FILE); + let source = fs::read_to_string(&path) + .unwrap() + .replace("rust_msrv = \"1.90\"\n", ""); + fs::write(path, source).unwrap(); + assert!( + load(directory.path()) + .unwrap_err() + .to_string() + .contains("invalid") + ); +} + +#[test] +fn rejects_invalid_platform_status() { + let (directory, mut compatibility) = fixture(); + compatibility.platforms[0].native_runtime = "sometimes".into(); + assert!(errors(directory.path(), &compatibility).contains("invalid native_runtime status")); +} + +#[test] +fn topologically_sorts_publication_prerequisites() { + let foundation_id = "repo/foundation".to_string(); + let facade_id = "repo/facade".to_string(); + let foundation = PlanNode { + id: foundation_id.clone(), + repository: "repo".into(), + package: "foundation".into(), + registry_package: "foundation".into(), + version: "1.0.0".into(), + prerequisites: BTreeSet::new(), + metadata_ready: true, + registry_status: "unpublished".into(), + full_dry_run: "possible".into(), + non_registry_blocker: false, + }; + let facade = PlanNode { + id: facade_id.clone(), + repository: "repo".into(), + package: "facade".into(), + registry_package: "facade".into(), + version: "1.0.0".into(), + prerequisites: BTreeSet::from([foundation_id]), + metadata_ready: true, + registry_status: "unpublished".into(), + full_dry_run: "possible".into(), + non_registry_blocker: false, + }; + let sorted = topological_sort(BTreeMap::from([ + (facade_id, facade), + (foundation.id.clone(), foundation), + ])) + .unwrap(); + assert_eq!(sorted[0].package, "foundation"); + assert_eq!(sorted[1].package, "facade"); +} + +#[test] +fn orders_framework_support_packages_before_facade_without_fake_dependencies() { + let repository = "BumpyClock/gpui-component"; + let macro_id = format!("{repository}/gpui_component_macros"); + let manifest_id = format!("{repository}/gpui_component_manifest"); + let facade_id = format!("{repository}/gpui_component"); + let node = |id: String, package: &str, prerequisites: BTreeSet| PlanNode { + id, + repository: repository.into(), + package: package.into(), + registry_package: package.into(), + version: "0.7.0".into(), + prerequisites, + metadata_ready: true, + registry_status: "unpublished".into(), + full_dry_run: "possible".into(), + non_registry_blocker: false, + }; + let nodes = BTreeMap::from([ + ( + facade_id.clone(), + node( + facade_id, + "gpui-component", + BTreeSet::from([macro_id.clone()]), + ), + ), + ( + manifest_id.clone(), + node(manifest_id, "gpui-component-manifest", BTreeSet::new()), + ), + ( + macro_id.clone(), + node(macro_id, "gpui-component-macros", BTreeSet::new()), + ), + ]); + let sorted = topological_sort(nodes).unwrap(); + assert_eq!( + sorted + .iter() + .map(|node| node.package.as_str()) + .collect::>(), + [ + "gpui-component-macros", + "gpui-component-manifest", + "gpui-component" + ] + ); + assert_eq!( + sorted.last().unwrap().prerequisites, + BTreeSet::from([format!("{repository}/gpui_component_macros")]) + ); +} + +#[test] +fn finds_transitive_non_dev_root_patch_reachability() { + let package = |id: &str, name: &str, workspace: bool| CargoPackage { + id: id.into(), + name: name.into(), + version: "1.0.0".into(), + source: (!workspace).then(|| "git+https://example.invalid/patch".into()), + publish: None, + description: Some("fixture".into()), + license: Some("Apache-2.0".into()), + license_file: None, + readme: Some("README.md".into()), + repository: Some("https://example.invalid".into()), + rust_version: Some("1.90".into()), + dependencies: Vec::new(), + }; + let dependency = |package: &str, kind: Option<&str>| CargoNodeDependency { + pkg: package.into(), + dep_kinds: vec![CargoNodeDependencyKind { + kind: kind.map(str::to_owned), + }], + }; + let metadata = CargoMetadata { + workspace_members: vec!["foundation".into(), "facade".into(), "dev-only".into()], + packages: vec![ + package("foundation", "foundation", true), + package("facade", "facade", true), + package("dev-only", "dev-only", true), + package("async-task", "async-task", false), + package("calloop", "calloop", false), + ], + resolve: Some(CargoResolve { + nodes: vec![ + CargoNode { + id: "foundation".into(), + deps: vec![dependency("async-task", None)], + }, + CargoNode { + id: "facade".into(), + deps: vec![dependency("foundation", None)], + }, + CargoNode { + id: "dev-only".into(), + deps: vec![dependency("calloop", Some("dev"))], + }, + CargoNode { + id: "async-task".into(), + deps: Vec::new(), + }, + CargoNode { + id: "calloop".into(), + deps: Vec::new(), + }, + ], + }), + }; + let actual = root_patch_reachability( + &metadata, + &BTreeMap::from([ + ("async-task".into(), "async-task".into()), + ("calloop".into(), "calloop".into()), + ]), + ) + .unwrap(); + + assert_eq!( + actual.get("foundation"), + Some(&BTreeSet::from(["async-task".into()])) + ); + assert_eq!( + actual.get("facade"), + Some(&BTreeSet::from(["async-task".into()])) + ); + assert!(!actual.contains_key("dev-only")); +} + +#[test] +fn require_registry_gate_rejects_non_registry_dry_run_blocker() { + let node = PlanNode { + id: "repo/package".into(), + repository: "repo".into(), + package: "package".into(), + registry_package: "package".into(), + version: "1.0.0".into(), + prerequisites: BTreeSet::new(), + metadata_ready: true, + registry_status: "published".into(), + full_dry_run: "blocked: non-inherited GPUI root patch: async-task".into(), + non_registry_blocker: true, + }; + + let error = require_registry_gate(&[node]).unwrap_err().to_string(); + assert!(error.contains("async-task")); +} + +#[test] +fn rejects_publishable_package_with_git_only_normal_dependency() { + let package = CargoPackage { + id: "published 1.0.0".into(), + name: "published".into(), + version: "1.0.0".into(), + source: None, + publish: None, + description: Some("fixture".into()), + license: Some("Apache-2.0".into()), + license_file: None, + readme: Some("README.md".into()), + repository: Some("https://example.invalid".into()), + rust_version: Some("1.90".into()), + dependencies: vec![CargoDependency { + name: "git-only".into(), + source: Some("git+https://example.invalid/repo".into()), + req: "*".into(), + path: None, + kind: None, + }], + }; + let metadata = CargoMetadata { + workspace_members: vec![package.id.clone()], + packages: vec![package], + resolve: None, + }; + let mut actual = Vec::new(); + validate_publishable_metadata(&metadata, &mut actual); + assert_eq!(actual.len(), 1); + assert!(actual[0].contains("Git-only normal dependency")); +} + +fn archive_fixture(manifest: &str, include_license: bool) -> (TempDir, CargoPackage) { + let directory = TempDir::new().unwrap(); + let root = directory.path(); + let package_root = root.join("staging/fixture-1.0.0"); + fs::create_dir_all(root.join("target/package")).unwrap(); + fs::create_dir_all(&package_root).unwrap(); + fs::write(package_root.join("Cargo.toml"), manifest).unwrap(); + fs::write(package_root.join("README.md"), "# fixture").unwrap(); + if include_license { + fs::write(package_root.join("LICENSE-APACHE"), "fixture").unwrap(); + } + let status = Command::new("tar") + .args([ + "-czf", + "../target/package/fixture-1.0.0.crate", + "fixture-1.0.0", + ]) + .current_dir(root.join("staging")) + .status() + .unwrap(); + assert!(status.success()); + ( + directory, + CargoPackage { + id: "fixture 1.0.0".into(), + name: "fixture".into(), + version: "1.0.0".into(), + source: None, + publish: None, + description: Some("fixture".into()), + license: Some("Apache-2.0".into()), + license_file: None, + readme: Some("README.md".into()), + repository: Some("https://example.invalid".into()), + rust_version: Some("1.90".into()), + dependencies: Vec::new(), + }, + ) +} + +#[test] +fn rejects_normalized_engine_feature_drift() { + let (_, mut compatibility) = fixture(); + let (directory, package) = archive_fixture( + r#" +[package] +name = "fixture" +version = "1.0.0" +[dependencies.gpui] +version = "=0.7.0" +package = "bumpyclock-gpui" +features = ["drift"] +"#, + true, + ); + compatibility.gpui.packages[0].features = Vec::new(); + let error = inspect_normalized_manifest(directory.path(), &package, &compatibility) + .unwrap_err() + .to_string(); + assert!(error.contains("normalized `gpui` features [\"drift\"]")); +} + +#[test] +fn rejects_package_archive_without_license() { + let (directory, package) = archive_fixture( + "[package]\nname = \"fixture\"\nversion = \"1.0.0\"\n", + false, + ); + assert!( + inspect_package_files(directory.path(), &package) + .unwrap_err() + .to_string() + .contains("contains no LICENSE") + ); +} From bf2194cf5e499ccd6a7cd78bbbecfda60333f34b Mon Sep 17 00:00:00 2001 From: Aditya Sharma Date: Tue, 28 Jul 2026 19:30:14 -0700 Subject: [PATCH 2/3] fix: harden phase zero validation Require least-privilege immutable Actions, exact GPUI source matching, bounded registry probes, and clean strict packaging so deferred registry blockers cannot mask unrelated failures. --- .agents/skills/update-gpui/SKILL.md | 5 +- .claude/skills/update-gpui/SKILL.md | 5 +- .github/ISSUE_TEMPLATE/01_bug.md | 2 +- .github/workflows/ci.yml | 31 ++++-- .github/workflows/release-docs.yml | 11 +- .github/workflows/release.yml | 6 +- .github/workflows/test-docs.yml | 9 +- Cargo.lock | 10 ++ Cargo.toml | 1 + LEARNINGS.md | 2 +- docs/learned/app-platform-plan.md | 4 +- docs/learned/gpui-submodule.md | 42 +++++-- xtask/Cargo.toml | 1 + xtask/src/main.rs | 166 ++++++++++++++++++++-------- xtask/src/tests.rs | 94 ++++++++++++++++ 15 files changed, 308 insertions(+), 81 deletions(-) diff --git a/.agents/skills/update-gpui/SKILL.md b/.agents/skills/update-gpui/SKILL.md index 07ad9474..016a47e5 100644 --- a/.agents/skills/update-gpui/SKILL.md +++ b/.agents/skills/update-gpui/SKILL.md @@ -41,8 +41,11 @@ not select a moving ref. 5. Build, test, and check release plan: ```bash + cargo fmt --all -- --check + cargo metadata --locked + cargo check --workspace --all-targets --locked cargo test --workspace --all-targets --locked - cargo clippy --workspace --all-targets --locked -- -D warnings + ./script/clippy --locked cargo xtask publish-plan cargo xtask release-check ``` diff --git a/.claude/skills/update-gpui/SKILL.md b/.claude/skills/update-gpui/SKILL.md index 07ad9474..016a47e5 100644 --- a/.claude/skills/update-gpui/SKILL.md +++ b/.claude/skills/update-gpui/SKILL.md @@ -41,8 +41,11 @@ not select a moving ref. 5. Build, test, and check release plan: ```bash + cargo fmt --all -- --check + cargo metadata --locked + cargo check --workspace --all-targets --locked cargo test --workspace --all-targets --locked - cargo clippy --workspace --all-targets --locked -- -D warnings + ./script/clippy --locked cargo xtask publish-plan cargo xtask release-check ``` diff --git a/.github/ISSUE_TEMPLATE/01_bug.md b/.github/ISSUE_TEMPLATE/01_bug.md index 425e0ac2..fdc1f276 100644 --- a/.github/ISSUE_TEMPLATE/01_bug.md +++ b/.github/ISSUE_TEMPLATE/01_bug.md @@ -11,7 +11,7 @@ Use English with clear and concise description of the bug, if you just have a qu ## Environment -- GPUI: [e.g., bumpyclock-gpui 0.1.0 / commit SHA] +- GPUI: [e.g., bumpyclock-gpui =0.1.0, commit d1a6019136eb9fb9386eaa047a7445c1032d8668] - GPUI Component: [e.g., v0.4.0] - Platform: [e.g., macOS 26, Windows 11, Ubuntu 20.04] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91694936..69e6dc6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.ref_name == 'main' && github.sha || 'anysha' }} cancel-in-progress: true +permissions: + contents: read + jobs: compile: name: Compile and lint @@ -26,8 +29,10 @@ jobs: run_on: windows-latest runs-on: ${{ matrix.run_on }} steps: - - uses: actions/checkout@v4 - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1 with: components: clippy - name: Install system dependencies @@ -35,9 +40,9 @@ jobs: run: script/bootstrap - name: Machete if: ${{ matrix.run_on == 'macos-latest' }} - uses: bnjbvr/cargo-machete@v0.9.1 + uses: bnjbvr/cargo-machete@7959c845782fed02ee69303126d4a12d64f1db18 # v0.9.1 - name: Setup | Cache Cargo - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: | ~/.cargo/bin/ @@ -67,8 +72,10 @@ jobs: name: Unit, doctest, and headless tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1 - name: Install system dependencies run: script/bootstrap - name: Run maintained unit and headless tests @@ -81,8 +88,10 @@ jobs: needs: unit-and-headless runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1 - name: Install system dependencies run: script/bootstrap - name: Show publication prerequisites @@ -110,8 +119,10 @@ jobs: run_on: windows-latest runs-on: ${{ matrix.run_on }} steps: - - uses: actions/checkout@v4 - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1 - name: Install system dependencies if: ${{ matrix.run_on != 'windows-latest' }} run: script/bootstrap diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml index 82977a9d..626381bd 100644 --- a/.github/workflows/release-docs.yml +++ b/.github/workflows/release-docs.yml @@ -16,10 +16,11 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: ref: ${{ github.event.workflow_run.head_sha }} - - uses: oven-sh/setup-bun@v1 + persist-credentials: false + - uses: oven-sh/setup-bun@f4d14e03ff726c06358e5557344e1da148b56cf7 # v1 - name: Install working-directory: docs run: bun install @@ -29,11 +30,11 @@ jobs: bun run build cp .vitepress/dist/index.html .vitepress/dist/404.html - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3 with: path: "docs/.vitepress/dist" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a59002be..0a766e2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,8 +11,10 @@ jobs: name: Validate registry release prerequisites runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1 - name: Show required publication order run: cargo xtask publish-plan --require-registry - name: Validate source, tests, and package artifacts diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 349e9f8d..d040ca24 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -4,13 +4,18 @@ on: paths: - "docs/**" +permissions: + contents: read + jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + - uses: oven-sh/setup-bun@f4d14e03ff726c06358e5557344e1da148b56cf7 # v1 - name: Install working-directory: docs run: bun install diff --git a/Cargo.lock b/Cargo.lock index 2829b535..1452b7ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9476,6 +9476,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "waker-fn" version = "1.2.0" @@ -10814,6 +10823,7 @@ dependencies = [ "serde_json", "tempfile", "toml 0.9.12+spec-1.1.0", + "wait-timeout", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e31bebbf..daaf1090 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,6 +100,7 @@ thiserror = "2.0.12" toml = "0.9" tracing = "0.1.44" uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] } +wait-timeout = "0.2.1" scap = { git = "https://github.com/zed-industries/scap", rev = "4afea48c3b002197176fb19cd0f9b180dd36eaac", default-features = false, package = "zed-scap", version = "0.0.8-zed" } [workspace.dependencies.windows] diff --git a/LEARNINGS.md b/LEARNINGS.md index 9eee32b4..17b0eab1 100644 --- a/LEARNINGS.md +++ b/LEARNINGS.md @@ -85,7 +85,7 @@ Superseded: Phase 0 removed the GPUI submodule. This entry preserves rationale, not an operational workflow. What worked then: - Keep workspace dependencies as Git plus immutable revision; direct committed - source overrides failed due GPUI workspace dependency inheritance. + source overrides failed due to GPUI workspace dependency inheritance. Current rule: committed manifests use canonical Git URL, full revision, and exact package versions. A sibling checkout may be used only through an uncommitted Cargo patch; update compatibility metadata and generated docs with diff --git a/docs/learned/app-platform-plan.md b/docs/learned/app-platform-plan.md index 0e9b6074..7fd2a965 100644 --- a/docs/learned/app-platform-plan.md +++ b/docs/learned/app-platform-plan.md @@ -110,8 +110,8 @@ Cross-cutting problems: 5. gpui fork has unused app primitives the library never wraps — but some are **stubs**: review verified URL-scheme registration is unimplemented on Windows ([`BumpyClock/gpui@d1a6019136eb9fb9386eaa047a7445c1032d8668`](https://github.com/BumpyClock/gpui/blob/d1a6019136eb9fb9386eaa047a7445c1032d8668/crates/gpui_windows/src/platform.rs#L842)) and Linux - (`gpui_linux/src/platform.rs:685`), and X11 overlay click-through is a silent no-op - (`x11/window.rs:1619`). "Exists in the fork" ≠ "works on 3 OSes". + ([`gpui_linux/src/linux/platform.rs:685`](https://github.com/BumpyClock/gpui/blob/d1a6019136eb9fb9386eaa047a7445c1032d8668/crates/gpui_linux/src/linux/platform.rs#L685)), and X11 overlay click-through is a silent no-op + ([`gpui_linux/src/linux/x11/window.rs:1619`](https://github.com/BumpyClock/gpui/blob/d1a6019136eb9fb9386eaa047a7445c1032d8668/crates/gpui_linux/src/linux/x11/window.rs#L1619)). "Exists in the fork" ≠ "works on 3 OSes". ## 2. Decisions diff --git a/docs/learned/gpui-submodule.md b/docs/learned/gpui-submodule.md index 022f26a2..5aebd760 100644 --- a/docs/learned/gpui-submodule.md +++ b/docs/learned/gpui-submodule.md @@ -9,15 +9,36 @@ The committed framework always uses the immutable GPUI Git revision in the workspace manifest. The repository does not vendor GPUI and has no GPUI submodule. -For coordinated development, clone GPUI beside this repository and create an -uncommitted `.cargo/config.toml` override: +For coordinated development, create an untracked disposable framework snapshot +in `/tmp`. Copy only source files, excluding Git metadata and build or docs +output. Add the override only to the snapshot's `.cargo/config.toml`; never edit +the tracked checkout or global `$CARGO_HOME/config.toml`: + +```bash +snapshot=$(mktemp -d /tmp/gpui-component-gpui-override.XXXXXX) +rsync -a --exclude='.git' --exclude='target' --exclude='docs/node_modules' ./ "$snapshot/" +cd "$snapshot" +``` + +Replace `/absolute/path/to/gpui` below with the absolute path of the sibling +GPUI checkout. Absolute paths are required because the framework snapshot lives +outside the sibling checkout directory. ```toml [patch."https://github.com/BumpyClock/gpui"] -bumpyclock-gpui = { path = "../gpui/crates/gpui" } -gpui_platform = { path = "../gpui/crates/gpui_platform" } -gpui_macros = { path = "../gpui/crates/gpui_macros" } -sum_tree = { path = "../gpui/crates/sum_tree" } +bumpyclock-gpui = { path = "/absolute/path/to/gpui/crates/gpui" } +gpui_platform = { path = "/absolute/path/to/gpui/crates/gpui_platform" } +gpui_macros = { path = "/absolute/path/to/gpui/crates/gpui_macros" } +sum_tree = { path = "/absolute/path/to/gpui/crates/sum_tree" } +``` + +The copied `Cargo.lock` still records Git sources, so first refresh it only in +the disposable snapshot. Subsequent validation remains locked: + +```bash +cargo metadata --format-version 1 +cargo check --locked --workspace --all-targets +cargo xtask release-check ``` Patch keys are Cargo package identities, not dependency aliases or Rust import @@ -27,9 +48,12 @@ names. The framework manifest must already declare test in a disposable framework snapshot and wait for the canonical GPUI commit before changing the committed pin. -Add every GPUI package resolved by the framework to the patch table. Keep this -developer-specific override out of commits. Before release work, remove it and -verify the committed Git dependency: +Add every GPUI package resolved by the framework to the patch table. Because +the snapshot has no Git metadata, this developer-specific override cannot enter +a commit. Do not use Cargo's `--config` flag for this workflow: `cargo xtask` +launches child Cargo processes that do not inherit the parent command line's +config. Before release work, discard the disposable snapshot, return to the +tracked checkout, and verify the committed Git dependency: ```bash cargo xtask compatibility check diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index b3a02df5..9fc5b125 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -10,6 +10,7 @@ anyhow.workspace = true serde.workspace = true serde_json.workspace = true toml.workspace = true +wait-timeout.workspace = true [dev-dependencies] tempfile.workspace = true diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 61bf8451..797cdf0d 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -4,9 +4,11 @@ use std::{ collections::{BTreeMap, BTreeSet, VecDeque}, env, fs, path::{Path, PathBuf}, - process::Command, + process::{Command, Stdio}, + time::Duration, }; use toml::Value; +use wait_timeout::ChildExt; const COMPATIBILITY_FILE: &str = "compatibility.toml"; const GENERATED_FILE: &str = "docs/COMPATIBILITY.md"; @@ -19,6 +21,7 @@ const VALID_REGISTRY_STATUSES: &[&str] = &[ ]; const VALID_EVIDENCE_STATUSES: &[&str] = &["verified", "not-verified", "not-applicable", "blocked"]; const VALID_MATURITY: &[&str] = &["supported", "preview", "experimental"]; +const REGISTRY_PROBE_TIMEOUT: Duration = Duration::from_secs(15); #[derive(Debug, Deserialize)] struct Compatibility { @@ -245,7 +248,7 @@ fn validate( } }; validate_root_manifest(&root_manifest, compatibility, &mut report.errors); - validate_all_manifests(root, compatibility, &mut report.errors); + validate_all_manifests(root, compatibility, &root_manifest_path, &mut report.errors); validate_lockfile(root, compatibility, &mut report.errors); validate_toolchain(root, compatibility, &mut report.errors); validate_publishable_dependencies(root, &mut report.errors); @@ -455,7 +458,12 @@ fn validate_root_manifest( } } -fn validate_all_manifests(root: &Path, compatibility: &Compatibility, errors: &mut Vec) { +fn validate_all_manifests( + root: &Path, + compatibility: &Compatibility, + root_manifest_path: &Path, + errors: &mut Vec, +) { let mut manifests = Vec::new(); collect_manifests(root, &mut manifests, errors); for path in manifests { @@ -463,6 +471,9 @@ fn validate_all_manifests(root: &Path, compatibility: &Compatibility, errors: &m continue; }; visit_dependency_tables(&manifest, "", &mut |section, dependencies| { + if path == root_manifest_path && section == "workspace.dependencies" { + return; + } let is_workspace = section == "workspace.dependencies"; for package in &compatibility.gpui.packages { if let Some(value) = dependencies.get(&package.dependency) { @@ -586,18 +597,17 @@ fn validate_lockfile(root: &Path, compatibility: &Compatibility, errors: &mut Ve errors.push("Cargo.lock has no package entries".into()); return; }; + let canonical_repository = normalized_git_repository(&compatibility.gpui.repository); let canonical_sources: Vec<_> = entries .iter() .filter_map(Value::as_table) .filter_map(|package| { let source = package.get("source").and_then(Value::as_str)?; - source - .contains(&compatibility.gpui.repository) - .then_some((package, source)) + (normalized_git_repository(source) == canonical_repository).then_some((package, source)) }) .collect(); for (package, source) in &canonical_sources { - if !source.contains(&compatibility.gpui.rev) { + if resolved_git_revision(source) != Some(compatibility.gpui.rev.as_str()) { errors.push(format!( "Cargo.lock package `{}` uses canonical GPUI source at revision other than {}: `{source}`", package @@ -642,7 +652,11 @@ fn validate_lockfile(root: &Path, compatibility: &Compatibility, errors: &mut Ve && package .get("source") .and_then(Value::as_str) - .is_some_and(|source| source.contains(&compatibility.gpui.rev)) + .is_some_and(|source| { + normalized_git_repository(source) == canonical_repository + && resolved_git_revision(source) + == Some(compatibility.gpui.rev.as_str()) + }) }) .collect(); if matches.len() != 1 { @@ -1227,8 +1241,9 @@ fn add_resolved_engine_nodes( .iter() .filter(|package| { package.source.as_deref().is_some_and(|source| { - source.contains(&compatibility.gpui.repository) - && source.contains(&compatibility.gpui.rev) + normalized_git_repository(source) + == normalized_git_repository(&compatibility.gpui.repository) + && resolved_git_revision(source) == Some(compatibility.gpui.rev.as_str()) }) }) .map(|package| (normalize_package(&package.name), package)) @@ -1371,6 +1386,10 @@ fn normalized_git_repository(source: &str) -> String { .to_owned() } +fn resolved_git_revision(source: &str) -> Option<&str> { + source.rsplit_once('#').map(|(_, revision)| revision) +} + fn root_patch_reachability( metadata: &CargoMetadata, root_patches: &BTreeMap, @@ -1516,11 +1535,6 @@ fn release_check(root: &Path, options: &Options) -> Result<()> { check(root, options.gpui_path.as_deref())?; let compatibility = load(root)?; - if options.require_registry { - println!("2/5 complete publication plan and registry availability"); - publish_plan(root, options.gpui_path.as_deref(), true)?; - } - println!("2/5 source build"); run(Command::new("cargo") .args(["check", "--locked", "--workspace", "--all-targets"]) @@ -1567,22 +1581,22 @@ fn validate_packages( .any(|package| package.registry_status != "published"); for package in publishable_package_order(&metadata)? { run(Command::new("cargo") - .args([ - "package", - "--locked", - "--list", - "--allow-dirty", - "-p", + .args(cargo_package_args( &package.name, - ]) + true, + !require_registry, + false, + )) .current_dir(root))?; let mut command = Command::new("cargo"); command - .args(["package", "--locked", "--allow-dirty", "-p", &package.name]) + .args(cargo_package_args( + &package.name, + false, + !require_registry, + !require_registry, + )) .current_dir(root); - if !require_registry { - command.arg("--no-verify"); - } let output = command .output() .with_context(|| format!("failed to package {}", package.name))?; @@ -1592,21 +1606,16 @@ fn validate_packages( continue; } let stderr = String::from_utf8_lossy(&output.stderr); - let registry_failure = stderr.contains("failed to select a version") - || stderr.contains("no matching package named"); - if !require_registry && engine_registry_blocked && registry_failure { + if !require_registry + && engine_registry_blocked + && let Some(registry_failure) = + unavailable_engine_registry_failure(&stderr, compatibility) + { blockers.push(format!( "{} {} normalized artifact blocked until exact engine/framework prerequisites are published: {}", package.name, package.version, - stderr - .lines() - .find(|line| { - line.contains("failed to select a version") - || line.contains("no matching package named") - }) - .unwrap_or("registry prerequisite unavailable") - .trim() + registry_failure.trim() )); continue; } @@ -1620,6 +1629,49 @@ fn validate_packages( Ok(blockers) } +fn cargo_package_args( + package: &str, + list: bool, + allow_dirty: bool, + no_verify: bool, +) -> Vec { + let mut args = vec!["package".into(), "--locked".into()]; + if list { + args.push("--list".into()); + } + if allow_dirty { + args.push("--allow-dirty".into()); + } + args.extend(["-p".into(), package.into()]); + if no_verify { + args.push("--no-verify".into()); + } + args +} + +fn unavailable_engine_registry_failure<'a>( + stderr: &'a str, + compatibility: &Compatibility, +) -> Option<&'a str> { + for package in compatibility + .gpui + .packages + .iter() + .filter(|package| package.registry_status != "published") + { + let exact_requirement = + format!("`{} = \"={}\"`", package.registry_package, package.version); + let missing_package = format!("`{}` found", package.registry_package); + if let Some(line) = stderr.lines().find(|line| { + (line.contains("failed to select a version") && line.contains(&exact_requirement)) + || (line.contains("no matching package named") && line.contains(&missing_package)) + }) { + return Some(line); + } + } + None +} + fn publishable_package_order(metadata: &CargoMetadata) -> Result> { let mut remaining: BTreeMap<_, _> = metadata .packages @@ -1808,23 +1860,43 @@ fn cargo_metadata_full(root: &Path) -> Result { } fn registry_probe(package: &str, version: &str) -> String { - let output = Command::new("cargo") + let mut child = match Command::new("cargo") .args([ "info", &format!("{package}@{version}"), "--registry", "crates-io", ]) - .output(); - match output { - Ok(output) if output.status.success() => "published".into(), - Ok(output) - if String::from_utf8_lossy(&output.stderr).contains("could not find") - || String::from_utf8_lossy(&output.stderr).contains("no matching package") => - { - "unpublished".into() + .stdout(Stdio::null()) + .stderr(Stdio::piped()) + .spawn() + { + Ok(child) => child, + Err(_) => return "unknown".into(), + }; + let output = match child.wait_timeout(REGISTRY_PROBE_TIMEOUT) { + Ok(Some(_)) => child.wait_with_output().ok(), + Ok(None) | Err(_) => { + let _ = child.kill(); + let _ = child.wait(); + return "unknown".into(); } - Ok(_) | Err(_) => "unknown".into(), + }; + match output { + Some(output) => registry_probe_status(output.status.success(), &output.stderr).into(), + None => "unknown".into(), + } +} + +fn registry_probe_status(success: bool, stderr: &[u8]) -> &'static str { + if success { + return "published"; + } + let stderr = String::from_utf8_lossy(stderr); + if stderr.contains("could not find") || stderr.contains("no matching package") { + "unpublished" + } else { + "unknown" } } diff --git a/xtask/src/tests.rs b/xtask/src/tests.rs index 5d3fe3bd..c905f12b 100644 --- a/xtask/src/tests.rs +++ b/xtask/src/tests.rs @@ -202,6 +202,37 @@ source = "git+https://github.com/BumpyClock/gpui?rev={OLD_REV}#{OLD_REV}" ); } +#[test] +fn rejects_lookalike_gpui_lock_source() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.lock"); + let source = fs::read_to_string(&path).unwrap().replace( + "https://github.com/BumpyClock/gpui?", + "https://github.com/BumpyClock/gpui-mirror?", + ); + fs::write(path, source).unwrap(); + assert!( + errors(directory.path(), &compatibility) + .contains("Cargo.lock must resolve exactly one Git package") + ); +} + +#[test] +fn reports_root_workspace_dependency_errors_once() { + let (directory, compatibility) = fixture(); + let path = directory.path().join("Cargo.toml"); + let source = fs::read_to_string(&path) + .unwrap() + .replace(&format!("rev = \"{REV}\""), &format!("rev = \"{OLD_REV}\"")); + fs::write(path, source).unwrap(); + assert_eq!( + errors(directory.path(), &compatibility) + .matches("uses revision") + .count(), + 1 + ); +} + #[test] fn rejects_wrong_registry_alias() { let (directory, compatibility) = fixture(); @@ -515,6 +546,69 @@ fn require_registry_gate_rejects_non_registry_dry_run_blocker() { assert!(error.contains("async-task")); } +#[test] +fn recognizes_only_exact_unpublished_engine_registry_failures() { + let (_, compatibility) = fixture(); + assert!( + unavailable_engine_registry_failure( + "failed to select a version for the requirement `bumpyclock-gpui = \"=0.7.0\"`", + &compatibility, + ) + .is_some() + ); + assert!( + unavailable_engine_registry_failure( + "no matching package named `bumpyclock-gpui` found", + &compatibility, + ) + .is_some() + ); + assert!( + !unavailable_engine_registry_failure( + "failed to select a version for the requirement `bumpyclock-gpui = \"=0.8.0\"`", + &compatibility, + ) + .is_some() + ); + assert!( + !unavailable_engine_registry_failure( + "failed to select a version for the requirement `serde = \"=1.0.0\"`", + &compatibility, + ) + .is_some() + ); + assert!( + !unavailable_engine_registry_failure( + "failed to select a version for the requirement `serde = \"=1.0.0\"`\nrequired by `bumpyclock-gpui = \"=0.7.0\"`", + &compatibility, + ) + .is_some() + ); +} + +#[test] +fn registry_probe_status_is_fail_closed_for_unknown_failures() { + assert_eq!(registry_probe_status(true, b""), "published"); + assert_eq!( + registry_probe_status(false, b"error: could not find `fixture`"), + "unpublished" + ); + assert_eq!(registry_probe_status(false, b"network timeout"), "unknown"); +} + +#[test] +fn strict_package_commands_do_not_allow_dirty_worktrees() { + for list in [false, true] { + let development = cargo_package_args("fixture", list, true, true); + assert!(development.contains(&"--allow-dirty".into())); + assert!(development.contains(&"--no-verify".into())); + + let strict = cargo_package_args("fixture", list, false, false); + assert!(!strict.contains(&"--allow-dirty".into())); + assert!(!strict.contains(&"--no-verify".into())); + } +} + #[test] fn rejects_publishable_package_with_git_only_normal_dependency() { let package = CargoPackage { From c83d8c084ceeebdcd48ba1ea4e661ada019bea9f Mon Sep 17 00:00:00 2001 From: Aditya Sharma Date: Tue, 28 Jul 2026 19:35:22 -0700 Subject: [PATCH 3/3] test: use direct none assertions Keep the registry-classifier regressions clean under the repository's pinned Rust 1.95 Clippy gate. --- xtask/src/tests.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/xtask/src/tests.rs b/xtask/src/tests.rs index c905f12b..9dd94ece 100644 --- a/xtask/src/tests.rs +++ b/xtask/src/tests.rs @@ -564,25 +564,25 @@ fn recognizes_only_exact_unpublished_engine_registry_failures() { .is_some() ); assert!( - !unavailable_engine_registry_failure( + unavailable_engine_registry_failure( "failed to select a version for the requirement `bumpyclock-gpui = \"=0.8.0\"`", &compatibility, ) - .is_some() + .is_none() ); assert!( - !unavailable_engine_registry_failure( + unavailable_engine_registry_failure( "failed to select a version for the requirement `serde = \"=1.0.0\"`", &compatibility, ) - .is_some() + .is_none() ); assert!( - !unavailable_engine_registry_failure( + unavailable_engine_registry_failure( "failed to select a version for the requirement `serde = \"=1.0.0\"`\nrequired by `bumpyclock-gpui = \"=0.7.0\"`", &compatibility, ) - .is_some() + .is_none() ); }