feat(cache): add output globs for cache restoration#375
Merged
branchseer merged 10 commits intomainfrom May 11, 2026
Merged
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9dbd5b86b9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Adds an `output` field to cached tasks: archives files matching the
configured globs after a successful run and restores them on cache hit.
Supports glob patterns, negative patterns, and `{pattern, base}` form
with explicit base directory. When `output` is omitted or empty, no
output archiving happens (matches prior behavior).
Schema version bumped to 12 (CacheEntryKey carries output_config,
CacheEntryValue carries output_archive). Old caches are reset on upgrade.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
9dbd5b8 to
6d03bc0
Compare
branchseer
commented
May 11, 2026
Combines the prior `exists()` precheck with the subsequent metadata call into a single `metadata()` invocation. NotFound is the only expected miss (file deleted between glob walk and archive write); any other I/O error now propagates instead of being swallowed by `exists()` returning false.
The old structure had a fallback `InputConfig` arm that was reachable only if all three fields (spawn, input, output) matched — but `get_by_cache_key` for the current key returned None earlier, so that state is contradictory. Flatten to a single if/else-if chain in priority order and assert the residual case with `debug_assert!`.
When archive restoration fails on cache hit (file missing, truncated, or unreadable), wrap the I/O error with a recovery hint telling the user to run `<program> cache clean`. This matches the message style already used for schema-version mismatches.
… output collection `compute_globbed_inputs` and `collect_glob_paths` had identical walk-and-filter logic, differing only in what they did per file (hash content vs. record path). Extract a common `walk_glob_files` helper that takes a closure; both public functions are now thin wrappers over it.
Adds `vtt list-dir <dir> [--ext <suffix>]` for inspecting cache state from e2e tests, plus a UUID redactor so archive filenames (which are random per run) stay stable across snapshot regenerations. The new `output_globs___old_archive_removed_on_rewrite` fixture asserts that after two cache-missing runs of the same task, the cache directory contains exactly one `.tar.zst` archive — proving the cleanup path in `ExecutionCache::update` actually runs.
branchseer
commented
May 11, 2026
- Rename crates/vite_task/src/session/execute/glob_inputs.rs to glob.rs to reflect its broader role (both input fingerprinting and output collection use it). - Change `walk_glob_files` to call the user closure with `AbsolutePathBuf` (was `(&Path, RelativePathBuf)`); callers strip the root themselves when they need a relative path. The closure now returns `anyhow::Result<ControlFlow<()>>` so a caller can stop the walk without producing an error. - Drop `workspace` from identifiers inside the module: positive globs are rooted at the caller-supplied `root`, which need not be a workspace root.
Adds a TODO note that this method will be folded into `from_user_config` once auto output inference lands and `output` becomes a `UserInputsConfig` like `input`.
- Move the descriptive comments out of TOML `#` lines (invisible to snapshots) and into per-step `comment =` fields, so the rendered snapshot describes what each step is doing. - In the negative-excludes scenario, follow the restoration step with a `vtt print-file dist/skip.txt` to assert that the excluded file is reported as "not found" — proving the negative glob keeps the file out of the archive, not just out of the initial walk.
fengmk2
approved these changes
May 11, 2026
Member
Author
Merge activity
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds an
outputfield to cached tasks: archives files matching the configured globs after a successful run and restores them on cache hit.[]: no output archiving (matches existing behavior)["dist/**"]: archive matching files; restore on cache hit[{"pattern": "...", "base": "workspace" | "package"}]: explicit base directory["!dist/cache/**"]: negative patterns exclude files{auto: true}— that comes in the follow-up feat(cache): restore output files on cache hit #321Schema bumped to v12 (
CacheEntryKeycarriesoutput_config,CacheEntryValuecarriesoutput_archive). Old caches reset on upgrade.Test plan
output_cache_test/covers archive+restore and negative-pattern exclusionoutput_configfield (default empty)🤖 Generated with Claude Code