Replace incremental build scenario with binary size (#64453)
## Summary - remove the `incremental-editor` Wezel scenario and its source patch - build the `zed` binary with the release profile - track both its original size and the size of a separately stripped copy - lock the `exec` and `filesize` foragers and regenerate the experiment schema - skip the full Zed test suite when a pull request changes only `.wezel/**` ## Validation - `wezel project tool sync` - `wezel experiment lint` - `wezel project status` - smoke-tested the copy-and-strip command against a debug-symbol-bearing executable on macOS - `rustfmt --check tooling/xtask/src/tasks/workflows/run_tests.rs` - `actionlint .github/workflows/run_tests.yml` - exercised the CI path filter with Wezel-only, mixed, docs-only, and source-only file sets The full Zed release build was not run locally. Release Notes: - N/A --------- Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
1 parent
c6f3347870
commit
f5966f7610
8 files changed
+180
-39
No files matched your search
@@ -115,7 +115,7 @@ jobs:
|
||||
check_pattern "run_action_checks" '^\.github/(workflows/|actions/|actionlint.yml)|tooling/xtask|script/' -qP
|
||||
check_pattern "run_docs" '^(docs/|crates/.*\.rs)' -qP
|
||||
check_pattern "run_licenses" '^(Cargo\.lock$|script/.*licenses|(?:.*/)?LICENSE[^/]*$)' -qP
|
||||
check_pattern "run_tests" '^(docs/|script/update_top_ranking_issues/|\.github/(ISSUE_TEMPLATE|workflows/(?!run_tests))|extensions/)' -qvP
|
||||
check_pattern "run_tests" '^(docs/|script/update_top_ranking_issues/|\.github/(ISSUE_TEMPLATE|workflows/(?!run_tests))|[.]wezel/|extensions/)' -qvP
|
||||
# Detect changed extension directories (excluding extensions/workflows)
|
||||
CHANGED_EXTENSIONS=$(echo "$CHANGED_FILES" | grep -oP '^extensions/[^/]+(?=/)' | sort -u | grep -v '^extensions/workflows$' || true)
|
||||
# Filter out deleted extensions
|
||||
|
||||
@@ -11,3 +11,9 @@ targets = [
|
||||
|
||||
[tools.foragers.cargo]
|
||||
github = "wezel-build/forager_cargo"
|
||||
|
||||
[tools.foragers.exec]
|
||||
github = "wezel-build/wezel_exec"
|
||||
|
||||
[tools.foragers.filesize]
|
||||
github = "wezel-build/wezel_filesize"
|
||||
@@ -0,0 +1,19 @@
|
||||
#:schema ../../schema.json
|
||||
|
||||
description = "Measures stripped and unstripped release binary size"
|
||||
|
||||
[step.cargo.build-release]
|
||||
command = "build"
|
||||
build_target = ["zed"]
|
||||
profile = "release"
|
||||
|
||||
[step.filesize.measure-unstripped]
|
||||
glob = "target/release/zed"
|
||||
summary.unstripped-binary-size = { outcome = "target/release/zed" }
|
||||
|
||||
[step.exec.strip-copy]
|
||||
cmd = "cp target/release/zed target/release/zed-stripped && strip target/release/zed-stripped"
|
||||
|
||||
[step.filesize.measure-stripped]
|
||||
glob = "target/release/zed-stripped"
|
||||
summary.stripped-binary-size = { outcome = "target/release/zed-stripped" }
|
||||
@@ -1,12 +0,0 @@
|
||||
diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs
|
||||
index 31ddc4b5c4..cd8e8e77e2 100644
|
||||
--- a/crates/editor/src/editor.rs
|
||||
+++ b/crates/editor/src/editor.rs
|
||||
@@ -11,6 +11,7 @@
|
||||
//! All other submodules and structs are mostly concerned with holding editor data about the way it displays current buffer region(s).
|
||||
//!
|
||||
//! If you're looking to improve Vim mode, you should check out Vim crate that wraps Editor and overrides its behavior.
|
||||
+//!
|
||||
pub mod actions;
|
||||
pub mod blink_manager;
|
||||
mod bracket_colorization;
|
||||
@@ -1,23 +0,0 @@
|
||||
#:schema ../../schema.json
|
||||
|
||||
description = "Measures rebuild time after a trivial edit to the editor crate"
|
||||
|
||||
# `zed` rather than `workspace`: it pulls in the whole editor -> ... -> binary
|
||||
# chain that a developer actually waits on, without also building collab, the
|
||||
# benchmarks and the other workspace members that no editor edit can affect.
|
||||
|
||||
# Prime the build cache off a clean build, so the measured step below pays only
|
||||
# for editor and its dependents.
|
||||
[step.cargo.prime-cache]
|
||||
command = "build"
|
||||
build_target = ["zed"]
|
||||
|
||||
# The patch only appends an empty `//!` line to the crate-root doc comment, so
|
||||
# nothing about editor's public surface changes. What's left is the floor cost
|
||||
# of touching the crate at all: rustc's incremental reuse for editor itself,
|
||||
# plus the relink of every crate downstream of it.
|
||||
[step.cargo.editor-doc-comment]
|
||||
apply-diff = true
|
||||
command = "build"
|
||||
build_target = ["zed"]
|
||||
summary.incremental-editor-build = { outcome = "time_ms", aggregation = "min", samples = 5 }
|
||||
+131
-2
@@ -165,7 +165,7 @@
|
||||
{
|
||||
"properties": {
|
||||
"outcome": {
|
||||
"description": "**`time_ms`** — cargo's own reported build duration (the `Finished … in <t>` line), in milliseconds. Excludes process startup and dependency resolution.",
|
||||
"description": "**`time_ms`** — how long `cargo <command>` took, in milliseconds.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
@@ -192,6 +192,121 @@
|
||||
"command"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"Step_exec": {
|
||||
"additionalProperties": false,
|
||||
"description": "Body of a `[step.<tool>.<step_name>]` table. The tool name is recovered from the outer key, not a field; flatten-collected `rest` is forwarded to the forager plugin via `FORAGER_INPUTS` as JSON.",
|
||||
"properties": {
|
||||
"apply-diff": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/DiffField"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"description": "Apply a patch before running this step. `true` uses `<step name>.patch`; a string overrides the filename."
|
||||
},
|
||||
"cmd": {
|
||||
"description": "Shell command to run.",
|
||||
"type": "string"
|
||||
},
|
||||
"cwd": {
|
||||
"description": "Working directory override.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"env": {
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
},
|
||||
"default": {},
|
||||
"description": "Extra environment variables.",
|
||||
"type": "object"
|
||||
},
|
||||
"summary": {
|
||||
"additionalProperties": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/EmbeddedSummaryToml"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"outcome": {
|
||||
"description": "Every successful command emits these outcomes on Linux and macOS. No root access\nor external profiling tool is required.\n\n| Outcome | Unit | Meaning |\n| --- | --- | --- |\n| `wall_time_ms` | milliseconds | Elapsed time from immediately before command launch until its exit is collected, including waiting. |\n| `user_time_ms` | milliseconds | CPU time spent executing in user mode. |\n| `system_time_ms` | milliseconds | CPU time spent executing in kernel mode. |\n| `max_rss_bytes` | bytes | Largest individual process peak resident memory reported by the OS. |\n| `minor_page_faults` | count | Page faults serviced without I/O. |\n| `major_page_faults` | count | Page faults requiring I/O. |\n| `voluntary_context_switches` | count | Context switches caused by yielding or blocking. |\n| `involuntary_context_switches` | count | Context switches caused by preemption. |\n\nTime values retain fractional milliseconds. Memory and count values are integers.\nAll outcomes have unit metadata, use the default lower-is-better direction, and\nhave no tags. Fault and context-switch counts are diagnostic signals; a reduction\nalone does not establish that a build improved.\n\nCPU time and resource counters include the shell and descendants whose usage is\npropagated by their parents waiting for them. Commands must wait for their work to\nfinish; detached processes and work performed by an existing build daemon are not\nfully accounted for. CPU time can exceed wall time when work runs in parallel.\n\n`max_rss_bytes` is **not the combined peak memory of a parallel build**. It is the\nlargest individual peak reported through the process hierarchy. OS accounting\nsemantics differ, so compare measurements on the same platform and testbed.\n\nA command that cannot start, exits unsuccessfully, or is terminated by a signal\nfails the step and produces no outcome report.\n",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"description": "Summaries emitted by this step, keyed by summary name.",
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"cmd"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"Step_filesize": {
|
||||
"additionalProperties": false,
|
||||
"description": "Body of a `[step.<tool>.<step_name>]` table. The tool name is recovered from the outer key, not a field; flatten-collected `rest` is forwarded to the forager plugin via `FORAGER_INPUTS` as JSON.",
|
||||
"properties": {
|
||||
"apply-diff": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/DiffField"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"description": "Apply a patch before running this step. `true` uses `<step name>.patch`; a string overrides the filename."
|
||||
},
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"glob": {
|
||||
"description": "Glob pattern, evaluated against the experiment workspace cwd.",
|
||||
"type": "string"
|
||||
},
|
||||
"summary": {
|
||||
"additionalProperties": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/EmbeddedSummaryToml"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"outcome": {
|
||||
"description": "One outcome per matched file. The outcome name is the file's path (relative to cwd); the value is its size in bytes.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"description": "Summaries emitted by this step, keyed by summary name.",
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"glob"
|
||||
],
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"description": "Top-level shape of `.wezel/experiments/<name>/experiment.toml`.\n\nSteps live under `[step.<tool>.<step_name>]`. The outer map is keyed by tool name and the inner by step name; bodies are wrapped in `toml::Spanned` so the parser can recover file-line order across reopened tables.",
|
||||
@@ -211,7 +326,21 @@
|
||||
"additionalProperties": {
|
||||
"$ref": "#/definitions/Step_cargo"
|
||||
},
|
||||
"description": "Runs `cargo <command>` and records the build time cargo reports",
|
||||
"description": "Runs `cargo <command>` and records wall-clock time",
|
||||
"type": "object"
|
||||
},
|
||||
"exec": {
|
||||
"additionalProperties": {
|
||||
"$ref": "#/definitions/Step_exec"
|
||||
},
|
||||
"description": "Executes a shell command and measures time and resource usage",
|
||||
"type": "object"
|
||||
},
|
||||
"filesize": {
|
||||
"additionalProperties": {
|
||||
"$ref": "#/definitions/Step_filesize"
|
||||
},
|
||||
"description": "Reports byte size of every file matching a glob",
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5,6 +5,27 @@ github = "wezel-build/forager_cargo"
|
||||
tag = "nightly-2026-07-17-dd1c13f"
|
||||
|
||||
[tools.foragers.cargo.assets]
|
||||
aarch64-apple-darwin = "sha256:6ab37a321c528404f5fc998c55ac7b499e8d8dd8d24c807fe11ab9ec6885f071"
|
||||
aarch64-unknown-linux-gnu = "sha256:4162756b5268d29046242a1f29d41649e07ef024c72a690914bff61af82dcee1"
|
||||
x86_64-apple-darwin = "sha256:263224ed47256fabd71a02e638fccd768cda4ff7023f34cc35bd520edcee0162"
|
||||
x86_64-unknown-linux-gnu = "sha256:18092f74eabef4e0774d14ac3ca967505b6d5ccf6fd2a1f1ddef79d8317b0722"
|
||||
|
||||
[tools.foragers.exec]
|
||||
github = "wezel-build/wezel_exec"
|
||||
tag = "nightly-2026-09-13-f96d366"
|
||||
|
||||
[tools.foragers.exec.assets]
|
||||
aarch64-apple-darwin = "sha256:7114aeece8eabecf36090169913bbb939be0034e8ead187fbdedadca9cdc31a7"
|
||||
aarch64-unknown-linux-gnu = "sha256:c4e10f11b36ad70817aa1897e072185f624cce248cd560b8f6f7884d85c0edb5"
|
||||
x86_64-apple-darwin = "sha256:7b284018b759d8a07c3143bbbf015de39baa2ac54aecfe0a16e18eb47eb11c20"
|
||||
x86_64-unknown-linux-gnu = "sha256:292709a40dad042d2c9f7054a01c48e8d06514e1713d20e372980f980936ebee"
|
||||
|
||||
[tools.foragers.filesize]
|
||||
github = "wezel-build/wezel_filesize"
|
||||
tag = "nightly-2026-09-13-b72395f"
|
||||
|
||||
[tools.foragers.filesize.assets]
|
||||
aarch64-apple-darwin = "sha256:7dcf99b47444b06217aa9b21b570068181e8d5983b071ef82d4ff7c50568d789"
|
||||
aarch64-unknown-linux-gnu = "sha256:cacc578d36333b1f64b057b5393663b9e096fbcb09ec3e3a985fcbd0b206fb5a"
|
||||
x86_64-apple-darwin = "sha256:2f1c0a4b3346d59032fc1e589c00e5c8fb5f4230a732eaf7936fecd40b57e5e4"
|
||||
x86_64-unknown-linux-gnu = "sha256:a42a28956781548936993d7518db5881c19dfdf20177d359f21f5dc9cad6f91e"
|
||||
@@ -26,10 +26,11 @@ pub(crate) fn run_tests() -> Workflow {
|
||||
// - script/update_top_ranking_issues/
|
||||
// - .github/ISSUE_TEMPLATE/
|
||||
// - .github/workflows/ (except .github/workflows/ci.yml)
|
||||
// - .wezel/
|
||||
// - extensions/ (these have their own test workflow)
|
||||
let should_run_tests = PathCondition::inverted(
|
||||
"run_tests",
|
||||
r"^(docs/|script/update_top_ranking_issues/|\.github/(ISSUE_TEMPLATE|workflows/(?!run_tests))|extensions/)",
|
||||
r"^(docs/|script/update_top_ranking_issues/|\.github/(ISSUE_TEMPLATE|workflows/(?!run_tests))|[.]wezel/|extensions/)",
|
||||
);
|
||||
let should_check_docs = PathCondition::new("run_docs", r"^(docs/|crates/.*\.rs)");
|
||||
let should_check_scripts = PathCondition::new(
|
||||
|
||||
Reference in new issue
Block a user