[tool] Adds a fix command (#6512)

This commit is contained in:
stuartmorgan
2022-09-28 16:51:15 -04:00
committed by GitHub
parent 92330dbd2c
commit 70ff6821af
4 changed files with 135 additions and 0 deletions

View File

@ -1,3 +1,7 @@
## 0.11.1
* Adds a `fix` command to run `dart fix --apply` in target packages.
## 0.11
* Renames `publish-plugin` to `publish`.

View File

@ -0,0 +1,51 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:file/file.dart';
import 'package:platform/platform.dart';
import 'common/core.dart';
import 'common/package_looping_command.dart';
import 'common/process_runner.dart';
import 'common/repository_package.dart';
/// A command to run Dart's "fix" command on packages.
class FixCommand extends PackageLoopingCommand {
/// Creates a fix command instance.
FixCommand(
Directory packagesDir, {
ProcessRunner processRunner = const ProcessRunner(),
Platform platform = const LocalPlatform(),
}) : super(packagesDir, processRunner: processRunner, platform: platform);
@override
final String name = 'fix';
@override
final String description = 'Fixes packages using dart fix.\n\n'
'This command requires "dart" and "flutter" to be in your path, and '
'assumes that dependencies have already been fetched (e.g., by running '
'the analyze command first).';
@override
final bool hasLongOutput = false;
@override
PackageLoopingType get packageLoopingType =>
PackageLoopingType.includeAllSubpackages;
@override
Future<PackageResult> runForPackage(RepositoryPackage package) async {
final int exitCode = await processRunner.runAndStream(
'dart', <String>['fix', '--apply'],
workingDir: package.directory);
if (exitCode != 0) {
printError('Unable to automatically fix package.');
return PackageResult.fail();
}
return PackageResult.success();
}
}

View File

@ -17,6 +17,7 @@ import 'dependabot_check_command.dart';
import 'drive_examples_command.dart';
import 'federation_safety_check_command.dart';
import 'firebase_test_lab_command.dart';
import 'fix_command.dart';
import 'format_command.dart';
import 'license_check_command.dart';
import 'lint_android_command.dart';
@ -61,6 +62,7 @@ void main(List<String> args) {
..addCommand(DriveExamplesCommand(packagesDir))
..addCommand(FederationSafetyCheckCommand(packagesDir))
..addCommand(FirebaseTestLabCommand(packagesDir))
..addCommand(FixCommand(packagesDir))
..addCommand(FormatCommand(packagesDir))
..addCommand(LicenseCheckCommand(packagesDir))
..addCommand(LintAndroidCommand(packagesDir))

View File

@ -0,0 +1,78 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io' as io;
import 'package:args/command_runner.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_plugin_tools/src/common/core.dart';
import 'package:flutter_plugin_tools/src/fix_command.dart';
import 'package:test/test.dart';
import 'mocks.dart';
import 'util.dart';
void main() {
late FileSystem fileSystem;
late MockPlatform mockPlatform;
late Directory packagesDir;
late RecordingProcessRunner processRunner;
late CommandRunner<void> runner;
setUp(() {
fileSystem = MemoryFileSystem();
mockPlatform = MockPlatform();
packagesDir = createPackagesDirectory(fileSystem: fileSystem);
processRunner = RecordingProcessRunner();
final FixCommand command = FixCommand(
packagesDir,
processRunner: processRunner,
platform: mockPlatform,
);
runner = CommandRunner<void>('fix_command', 'Test for fix_command');
runner.addCommand(command);
});
test('runs fix in top-level packages and subpackages', () async {
final RepositoryPackage package = createFakePackage('a', packagesDir);
final RepositoryPackage plugin = createFakePlugin('b', packagesDir);
await runCapturingPrint(runner, <String>['fix']);
expect(
processRunner.recordedCalls,
orderedEquals(<ProcessCall>[
ProcessCall('dart', const <String>['fix', '--apply'], package.path),
ProcessCall('dart', const <String>['fix', '--apply'],
package.getExamples().first.path),
ProcessCall('dart', const <String>['fix', '--apply'], plugin.path),
ProcessCall('dart', const <String>['fix', '--apply'],
plugin.getExamples().first.path),
]));
});
test('fails if "dart fix" fails', () async {
createFakePlugin('foo', packagesDir);
processRunner.mockProcessesForExecutable['dart'] = <io.Process>[
MockProcess(exitCode: 1),
];
Error? commandError;
final List<String> output = await runCapturingPrint(runner, <String>['fix'],
errorHandler: (Error e) {
commandError = e;
});
expect(commandError, isA<ToolExit>());
expect(
output,
containsAllInOrder(<Matcher>[
contains('Unable to automatically fix package.'),
]),
);
});
}