fix(tool): the check limited to changes sees uncommitted ones too

Melos' --diff compares commits alone (<commit>...HEAD), so a check with
--changed-since before committing tested nothing and passed. The check
now works out the packages touched itself, from git diff against the
commit and the files new to git, each file counted in its innermost
package, and hands them to Melos as --scope with --include-dependents;
a changed root pubspec, lock or lint rule means every package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-19 21:32:14 +02:00
commit bf20134819
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -16,9 +16,43 @@ final _generated = RegExp(
bool isOwnDartFile(String path) =>
path.endsWith('.dart') && !_generated.hasMatch(path);
/// The filters handed to Melos for the tests: every package, or with
/// [changedSince] only the packages changed since that commit and those
/// depending on them.
List<String> melosFilters({String? changedSince}) => [
if (changedSince != null) ...['--diff=$changedSince', '--include-dependents'],
/// The root's files every package's resolution or analysis depends on.
const _rootFiles = {'pubspec.yaml', 'pubspec.lock', 'analysis_options.yaml'};
/// The workspace's packages that [paths] (changed files, relative to the
/// repository's root) are in, each file counted in the innermost package
/// holding it ([packages]: name to its folder, relative to the root); null
/// for every package, should a root file all of them depend on have changed.
/// Files in no package (docs, tools, deploy) touch none.
List<String>? packagesTouched(
Iterable<String> paths,
Map<String, String> packages,
) {
final touched = <String>{};
for (final path in paths) {
if (_rootFiles.contains(path)) {
return null;
}
String? innermost;
for (final MapEntry(key: name, value: folder) in packages.entries) {
if (path.startsWith('$folder/') &&
(innermost == null || folder.length > packages[innermost]!.length)) {
innermost = name;
}
}
if (innermost != null) {
touched.add(innermost);
}
}
return touched.toList()..sort();
}
/// The filters handed to Melos for the tests: none for every package, or
/// the packages [touched] and those depending on them. (Melos' own `--diff`
/// compares commits alone, so a check before committing would see nothing.)
List<String> melosFilters({List<String>? touched}) => [
if (touched != null) ...[
for (final name in touched) '--scope=$name',
'--include-dependents',
],
];