[tools] Run pub get before format (#8052)

The new Dart formatter needs to know the Dart language version of the
code it is formatting, and it reads that from a file in `.dart_tool`,
not `pubspec.yaml` directly. To avoid it failing to determine the
version and assuming the latest (which will almost always be wrong in
this repo):
- Adds a step to the `format` repo command to ensure that `pub get`
appears to have been run, and runs it if not, and
- To avoid `pub get` running in `format` in CI, adds a deps-fetching
step to the `repo_checks` task, as we have in other tasks that need to
`pub get`.

This should unblock the roll.
This commit is contained in:
stuartmorgan
2024-11-11 14:55:30 -05:00
committed by GitHub
parent d681e4e404
commit df0f423184
5 changed files with 90 additions and 18 deletions

View File

@ -2,6 +2,13 @@ tasks:
- name: prepare tool - name: prepare tool
script: .ci/scripts/prepare_tool.sh script: .ci/scripts/prepare_tool.sh
infra_step: true # Note infra steps failing prevents "always" from running. infra_step: true # Note infra steps failing prevents "always" from running.
# format requires that 'pub get' has been run to determine the language
# version, so the tool will auto-run it if necessary. Run it manually first
# so that the network requests are in a separate infra step.
- name: download Dart deps
script: .ci/scripts/tool_runner.sh
args: ["fetch-deps"]
infra_step: true
- name: tool unit tests - name: tool unit tests
script: .ci/scripts/plugin_tools_tests.sh script: .ci/scripts/plugin_tools_tests.sh
- name: tool format - name: tool format

View File

@ -12,6 +12,7 @@ import 'package:meta/meta.dart';
import 'common/core.dart'; import 'common/core.dart';
import 'common/output_utils.dart'; import 'common/output_utils.dart';
import 'common/package_looping_command.dart'; import 'common/package_looping_command.dart';
import 'common/pub_utils.dart';
import 'common/repository_package.dart'; import 'common/repository_package.dart';
/// In theory this should be 8191, but in practice that was still resulting in /// In theory this should be 8191, but in practice that was still resulting in
@ -120,6 +121,15 @@ class FormatCommand extends PackageLoopingCommand {
relativeTo: package.directory, relativeTo: package.directory,
); );
if (getBoolArg(_dartArg)) { if (getBoolArg(_dartArg)) {
// Ensure that .dart_tool exists, since without it `dart` doesn't know
// the lanugage version, so the formatter may give different output.
if (!package.directory.childDirectory('.dart_tool').existsSync()) {
if (!await runPubGet(package, processRunner, super.platform)) {
printError('Unable to fetch dependencies.');
return PackageResult.fail(<String>['unable to fetch dependencies']);
}
}
await _formatDart(files, workingDir: package.directory); await _formatDart(files, workingDir: package.directory);
} }
// Success or failure is determined overall in completeRun, since most code // Success or failure is determined overall in completeRun, since most code

View File

@ -29,6 +29,7 @@ const Set<String> _ignoreBasenameList = <String>{
'flutter_export_environment', 'flutter_export_environment',
'GeneratedPluginRegistrant', 'GeneratedPluginRegistrant',
'generated_plugin_registrant', 'generated_plugin_registrant',
'web_plugin_registrant',
}; };
// File suffixes that otherwise match _codeFileExtensions to ignore. // File suffixes that otherwise match _codeFileExtensions to ignore.

View File

@ -50,6 +50,12 @@ void main() {
runner.addCommand(analyzeCommand); runner.addCommand(analyzeCommand);
}); });
/// Creates the .dart_tool directory for [package] to simulate (as much as
/// this command requires) `pub get` having been run.
void fakePubGet(RepositoryPackage package) {
package.directory.childDirectory('.dart_tool').createSync();
}
/// Returns a modified version of a list of [relativePaths] that are relative /// Returns a modified version of a list of [relativePaths] that are relative
/// to [package] to instead be relative to [packagesDir]. /// to [package] to instead be relative to [packagesDir].
List<String> getPackagesDirRelativePaths( List<String> getPackagesDirRelativePaths(
@ -92,6 +98,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -117,6 +124,7 @@ void main() {
unformattedFile, unformattedFile,
], ],
); );
fakePubGet(plugin);
final p.Context posixContext = p.posix; final p.Context posixContext = p.posix;
childFileWithSubcomponents( childFileWithSubcomponents(
@ -140,7 +148,9 @@ void main() {
'lib/src/b.dart', 'lib/src/b.dart',
'lib/src/c.dart', 'lib/src/c.dart',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['dart'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['dart'] = <FakeProcessInfo>[
FakeProcessInfo(MockProcess(exitCode: 1), <String>['format']) FakeProcessInfo(MockProcess(exitCode: 1), <String>['format'])
@ -163,7 +173,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'lib/a.dart', 'lib/a.dart',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format', '--no-dart']); await runCapturingPrint(runner, <String>['format', '--no-dart']);
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[])); expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
@ -179,6 +191,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -203,7 +216,9 @@ void main() {
'android/src/main/java/io/flutter/plugins/a_plugin/a.java', 'android/src/main/java/io/flutter/plugins/a_plugin/a.java',
'android/src/main/java/io/flutter/plugins/a_plugin/b.java', 'android/src/main/java/io/flutter/plugins/a_plugin/b.java',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['java'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['java'] = <FakeProcessInfo>[
FakeProcessInfo(MockProcess(exitCode: 1), <String>['-version']) FakeProcessInfo(MockProcess(exitCode: 1), <String>['-version'])
@ -229,7 +244,9 @@ void main() {
'android/src/main/java/io/flutter/plugins/a_plugin/a.java', 'android/src/main/java/io/flutter/plugins/a_plugin/a.java',
'android/src/main/java/io/flutter/plugins/a_plugin/b.java', 'android/src/main/java/io/flutter/plugins/a_plugin/b.java',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['java'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['java'] = <FakeProcessInfo>[
FakeProcessInfo( FakeProcessInfo(
@ -260,6 +277,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint( await runCapturingPrint(
runner, <String>['format', '--java-path=/path/to/java']); runner, <String>['format', '--java-path=/path/to/java']);
@ -284,7 +302,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'android/src/main/java/io/flutter/plugins/a_plugin/a.java', 'android/src/main/java/io/flutter/plugins/a_plugin/a.java',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format', '--no-java']); await runCapturingPrint(runner, <String>['format', '--no-java']);
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[])); expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
@ -304,6 +324,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -328,7 +349,9 @@ void main() {
'linux/foo_plugin.cc', 'linux/foo_plugin.cc',
'macos/Classes/Foo.h', 'macos/Classes/Foo.h',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['clang-format'] = processRunner.mockProcessesForExecutable['clang-format'] =
<FakeProcessInfo>[FakeProcessInfo(MockProcess(exitCode: 1))]; <FakeProcessInfo>[FakeProcessInfo(MockProcess(exitCode: 1))];
@ -357,6 +380,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['clang-format'] = processRunner.mockProcessesForExecutable['clang-format'] =
<FakeProcessInfo>[FakeProcessInfo(MockProcess(exitCode: 1))]; <FakeProcessInfo>[FakeProcessInfo(MockProcess(exitCode: 1))];
@ -396,6 +420,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, await runCapturingPrint(runner,
<String>['format', '--clang-format-path=/path/to/clang-format']); <String>['format', '--clang-format-path=/path/to/clang-format']);
@ -421,7 +446,9 @@ void main() {
'linux/foo_plugin.cc', 'linux/foo_plugin.cc',
'macos/Classes/Foo.h', 'macos/Classes/Foo.h',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['clang-format'] = processRunner.mockProcessesForExecutable['clang-format'] =
<FakeProcessInfo>[ <FakeProcessInfo>[
@ -448,7 +475,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'linux/foo_plugin.cc', 'linux/foo_plugin.cc',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format', '--no-clang-format']); await runCapturingPrint(runner, <String>['format', '--no-clang-format']);
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[])); expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
@ -465,6 +494,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -488,7 +518,9 @@ void main() {
'android/src/main/kotlin/io/flutter/plugins/a_plugin/a.kt', 'android/src/main/kotlin/io/flutter/plugins/a_plugin/a.kt',
'android/src/main/kotlin/io/flutter/plugins/a_plugin/b.kt', 'android/src/main/kotlin/io/flutter/plugins/a_plugin/b.kt',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['java'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['java'] = <FakeProcessInfo>[
FakeProcessInfo( FakeProcessInfo(
@ -513,7 +545,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'android/src/main/kotlin/io/flutter/plugins/a_plugin/a.kt', 'android/src/main/kotlin/io/flutter/plugins/a_plugin/a.kt',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format', '--no-kotlin']); await runCapturingPrint(runner, <String>['format', '--no-kotlin']);
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[])); expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
@ -530,6 +564,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>[ await runCapturingPrint(runner, <String>[
'format', 'format',
@ -567,11 +602,12 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'macos/foo.swift', 'macos/foo.swift',
]; ];
createFakePlugin( final RepositoryPackage plugin = createFakePlugin(
'a_plugin', 'a_plugin',
packagesDir, packagesDir,
extraFiles: files, extraFiles: files,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format', '--no-swift']); await runCapturingPrint(runner, <String>['format', '--no-swift']);
@ -583,7 +619,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'macos/foo.swift', 'macos/foo.swift',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['swift-format'] = processRunner.mockProcessesForExecutable['swift-format'] =
<FakeProcessInfo>[ <FakeProcessInfo>[
@ -609,7 +647,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'macos/foo.swift', 'macos/foo.swift',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['swift-format'] = processRunner.mockProcessesForExecutable['swift-format'] =
<FakeProcessInfo>[ <FakeProcessInfo>[
@ -643,7 +683,9 @@ void main() {
const List<String> files = <String>[ const List<String> files = <String>[
'macos/foo.swift', 'macos/foo.swift',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['swift-format'] = processRunner.mockProcessesForExecutable['swift-format'] =
<FakeProcessInfo>[ <FakeProcessInfo>[
@ -694,6 +736,7 @@ void main() {
...javaFiles, ...javaFiles,
], ],
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -732,6 +775,7 @@ void main() {
'example/macos/Flutter/GeneratedPluginRegistrant.swift', 'example/macos/Flutter/GeneratedPluginRegistrant.swift',
], ],
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>[ await runCapturingPrint(runner, <String>[
'format', 'format',
@ -773,7 +817,9 @@ void main() {
'linux/foo_plugin.cc', 'linux/foo_plugin.cc',
'macos/Classes/Foo.h', 'macos/Classes/Foo.h',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
const String changedFilePath = 'packages/a_plugin/linux/foo_plugin.cc'; const String changedFilePath = 'packages/a_plugin/linux/foo_plugin.cc';
processRunner.mockProcessesForExecutable['git'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['git'] = <FakeProcessInfo>[
@ -825,7 +871,9 @@ void main() {
'linux/foo_plugin.cc', 'linux/foo_plugin.cc',
'macos/Classes/Foo.h', 'macos/Classes/Foo.h',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
processRunner.mockProcessesForExecutable['git'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['git'] = <FakeProcessInfo>[
FakeProcessInfo(MockProcess(exitCode: 1), <String>['ls-files']) FakeProcessInfo(MockProcess(exitCode: 1), <String>['ls-files'])
@ -850,7 +898,9 @@ void main() {
'linux/foo_plugin.cc', 'linux/foo_plugin.cc',
'macos/Classes/Foo.h', 'macos/Classes/Foo.h',
]; ];
final RepositoryPackage plugin =
createFakePlugin('a_plugin', packagesDir, extraFiles: files); createFakePlugin('a_plugin', packagesDir, extraFiles: files);
fakePubGet(plugin);
const String changedFilePath = 'packages/a_plugin/linux/foo_plugin.cc'; const String changedFilePath = 'packages/a_plugin/linux/foo_plugin.cc';
processRunner.mockProcessesForExecutable['git'] = <FakeProcessInfo>[ processRunner.mockProcessesForExecutable['git'] = <FakeProcessInfo>[
@ -892,6 +942,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: <String>[...batch1, extraFile], extraFiles: <String>[...batch1, extraFile],
); );
fakePubGet(package);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -922,11 +973,12 @@ void main() {
// Make the file list one file longer than would fit in a Windows batch. // Make the file list one file longer than would fit in a Windows batch.
final List<String> batch = get99CharacterPathExtraFiles(batchSize + 1); final List<String> batch = get99CharacterPathExtraFiles(batchSize + 1);
createFakePlugin( final RepositoryPackage plugin = createFakePlugin(
pluginName, pluginName,
packagesDir, packagesDir,
extraFiles: batch, extraFiles: batch,
); );
fakePubGet(plugin);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);
@ -947,6 +999,7 @@ void main() {
packagesDir, packagesDir,
extraFiles: <String>[...batch1, extraFile], extraFiles: <String>[...batch1, extraFile],
); );
fakePubGet(package);
await runCapturingPrint(runner, <String>['format']); await runCapturingPrint(runner, <String>['format']);

View File

@ -115,6 +115,7 @@ void main() {
'GeneratedPluginRegistrant.m', 'GeneratedPluginRegistrant.m',
'generated_plugin_registrant.cc', 'generated_plugin_registrant.cc',
'generated_plugin_registrant.cpp', 'generated_plugin_registrant.cpp',
'web_plugin_registrant.dart',
// Ignored path suffixes. // Ignored path suffixes.
'foo.g.dart', 'foo.g.dart',
'foo.mocks.dart', 'foo.mocks.dart',