in script/tool/lib/src/version_check_command.dart [523:603]
Future<String?> _checkForMissingChangeError(RepositoryPackage package) async {
// Find the relative path to the current package, as it would appear at the
// beginning of a path reported by getChangedFiles() (which always uses
// Posix paths).
final Directory gitRoot =
packagesDir.fileSystem.directory((await gitDir).path);
final String relativePackagePath =
getRelativePosixPath(package.directory, from: gitRoot) + '/';
bool hasChanges = false;
bool needsVersionChange = false;
bool hasChangelogChange = false;
for (final String path in _changedFiles) {
// Only consider files within the package.
if (!path.startsWith(relativePackagePath)) {
continue;
}
hasChanges = true;
final List<String> components = p.posix.split(path);
final bool isChangelog = components.last == 'CHANGELOG.md';
if (isChangelog) {
hasChangelogChange = true;
}
if (!needsVersionChange &&
!isChangelog &&
// The example's main.dart is shown on pub.dev, but for anything else
// in the example publishing has no purpose.
!(components.contains('example') && components.last != 'main.dart') &&
// Changes to tests don't need to be published.
!components.contains('test') &&
!components.contains('androidTest') &&
!components.contains('RunnerTests') &&
!components.contains('RunnerUITests') &&
// Ignoring lints doesn't affect clients.
!components.contains('lint-baseline.xml')) {
needsVersionChange = true;
}
}
if (!hasChanges) {
return null;
}
if (needsVersionChange) {
if (_getChangeDescription().split('\n').any((String line) =>
line.startsWith(_missingVersionChangeJustificationMarker))) {
logWarning('Ignoring lack of version change due to '
'"$_missingVersionChangeJustificationMarker" in the '
'change description.');
} else {
printError(
'No version change found, but the change to this package could '
'not be verified to be exempt from version changes according to '
'repository policy. If this is a false positive, please '
'add a line starting with\n'
'$_missingVersionChangeJustificationMarker\n'
'to your PR description with an explanation of why it is exempt.');
return 'Missing version change';
}
}
if (!hasChangelogChange) {
if (_getChangeDescription().split('\n').any((String line) =>
line.startsWith(_missingChangelogChangeJustificationMarker))) {
logWarning('Ignoring lack of CHANGELOG update due to '
'"$_missingChangelogChangeJustificationMarker" in the '
'change description.');
} else {
printError(
'No CHANGELOG change found. If this PR needs an exemption from'
'the standard policy of listing all changes in the CHANGELOG, '
'please add a line starting with\n'
'$_missingChangelogChangeJustificationMarker\n'
'to your PR description with an explanation of why.');
return 'Missing CHANGELOG change';
}
}
return null;
}