feat(ws-changed): filter and classify a changeset by file extension - #123
Merged
Conversation
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
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
ws-changedanswers "which packages are affected?" but has no notion of what kind of file changed, so a CI lane can only ask the one coarse question. That's how a diff of threepackage.jsonscript strings ends up rebuilding a dev image and running a SQL lint lane.git-changedalready hasext/include/exclude; this teachesws-changedthe same filter, plus the reporting a lane needs to decide on its own.A
FileFilternarrows the changed files before they're attributed to packages, so the same diff answers several questions:Filtering before ownership is the point, and it has two consequences worth stating:
changed, and it also can't triggerglobal— a.sqllane isn't told "everything is affected" by a changedpnpm-lock.yaml. Ask the unfiltered question when you want the lockfile's blast radius;extensionsByPackagecoverschangedpackages only, never dependents — they own no changed file, so "what changed inpkg" stays distinct from "whatpkgis affected by".New on
AffectedResult:extaccepts the shapesgit-changedaccepts ('sql','.sql','ts,tsx',['.ts','.tsx']), normalized to lowercased.ext, so a filter moves between the two packages without translation.extOfdeliberately treats a dotfile or extensionless name as having no extension (.gitignore,Makefile,bin/ws-changed→''), which means they match noextfilter rather than accidentally matching every one.Surfaces:
filesin config,WS_CHANGED_EXTin the environment (so a CI lane needn't carry its own config file), and--ext/--files/--not-files/--extson the CLI:77 tests pass; new coverage includes uppercase/multi-dot/dotfile extensions, absolute paths, include/exclude globs, a filtered-out global trigger, and dependents staying out of
extensionsByPackage.Follow-up, not here: routing
constructive-db'sdev-image.ymlandproxy-e2e-tests.yamlthrough this instead of blanket YAMLpaths:entries.Link to Devin session: https://app.devin.ai/sessions/0512ac5790334f939a7bd0c2a8442162
Requested by: @pyramation