diff --git a/packages/flutter_tools/lib/src/commands/format.dart b/packages/flutter_tools/lib/src/commands/format.dart index 7d6e4f4b945..0bdbe4488dd 100644 --- a/packages/flutter_tools/lib/src/commands/format.dart +++ b/packages/flutter_tools/lib/src/commands/format.dart @@ -4,36 +4,18 @@ import 'dart:async'; +import 'package:args/args.dart'; + +import '../artifacts.dart'; import '../base/common.dart'; import '../base/process.dart'; -import '../dart/sdk.dart'; +import '../globals.dart' as globals; import '../runner/flutter_command.dart'; class FormatCommand extends FlutterCommand { - FormatCommand() { - argParser.addFlag('dry-run', - abbr: 'n', - help: 'Show which files would be modified but make no changes.', - defaultsTo: false, - negatable: false, - ); - argParser.addFlag('set-exit-if-changed', - help: 'Return exit code 1 if there are any formatting changes.', - defaultsTo: false, - negatable: false, - ); - argParser.addFlag('machine', - abbr: 'm', - help: 'Produce machine-readable JSON output.', - defaultsTo: false, - negatable: false, - ); - argParser.addOption('line-length', - abbr: 'l', - help: 'Wrap lines longer than this length. Defaults to 80 characters.', - defaultsTo: '80', - ); - } + @override + ArgParser get argParser => _argParser; + final ArgParser _argParser = ArgParser.allowAnything(); @override final String name = 'format'; @@ -48,34 +30,25 @@ class FormatCommand extends FlutterCommand { String get invocation => '${runner.executableName} $name '; @override - Future runCommand() async { - if (argResults.rest.isEmpty) { - throwToolExit( - 'No files specified to be formatted.\n' - '\n' - 'To format all files in the current directory tree:\n' - '${runner.executableName} $name .\n' - '\n' - '$usage' - ); - } + bool get shouldUpdateCache => false; - final String dartfmt = sdkBinaryName('dartfmt'); + @override + Future runCommand() async { + final String dartBinary = globals.artifacts.getArtifactPath(Artifact.engineDartBinary); + globals.printError( + '"flutter format" is deprecated and will be removed in a' + ' future release, use "dart format" instead.' + ); final List command = [ - dartfmt, - if (boolArg('dry-run')) '-n', - if (boolArg('machine')) '-m', - if (argResults['line-length'] != null) '-l ${argResults['line-length']}', - if (!boolArg('dry-run') && !boolArg('machine')) '-w', - if (boolArg('set-exit-if-changed')) '--set-exit-if-changed', + dartBinary, + 'format', ...argResults.rest, ]; final int result = await processUtils.stream(command); if (result != 0) { - throwToolExit('Formatting failed: $result', exitCode: result); + throwToolExit('', exitCode: result); } - return FlutterCommandResult.success(); } } diff --git a/packages/flutter_tools/test/commands.shard/permeable/format_test.dart b/packages/flutter_tools/test/commands.shard/permeable/format_test.dart deleted file mode 100644 index b5912750d19..00000000000 --- a/packages/flutter_tools/test/commands.shard/permeable/format_test.dart +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2014 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 'package:args/command_runner.dart'; -import 'package:flutter_tools/src/base/file_system.dart'; -import 'package:flutter_tools/src/cache.dart'; -import 'package:flutter_tools/src/commands/format.dart'; -import 'package:flutter_tools/src/globals.dart' as globals; - -import '../../src/common.dart'; -import '../../src/context.dart'; - -void main() { - group('format', () { - Directory tempDir; - - setUp(() { - Cache.disableLocking(); - tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_format_test.'); - }); - - tearDown(() { - tryToDelete(tempDir); - }); - - testUsingContext('a file', () async { - final String projectPath = await createProject(tempDir); - - final File srcFile = globals.fs.file(globals.fs.path.join(projectPath, 'lib', 'main.dart')); - final String original = srcFile.readAsStringSync(); - srcFile.writeAsStringSync(original.replaceFirst('main()', 'main( )')); - - final FormatCommand command = FormatCommand(); - final CommandRunner runner = createTestCommandRunner(command); - await runner.run(['format', srcFile.path]); - - final String formatted = srcFile.readAsStringSync(); - expect(formatted, original); - }); - - testUsingContext('dry-run', () async { - final String projectPath = await createProject(tempDir); - - final File srcFile = globals.fs.file( - globals.fs.path.join(projectPath, 'lib', 'main.dart')); - final String nonFormatted = srcFile.readAsStringSync().replaceFirst( - 'main()', 'main( )'); - srcFile.writeAsStringSync(nonFormatted); - - final FormatCommand command = FormatCommand(); - final CommandRunner runner = createTestCommandRunner(command); - await runner.run(['format', '--dry-run', srcFile.path]); - - final String shouldNotFormatted = srcFile.readAsStringSync(); - expect(shouldNotFormatted, nonFormatted); - }); - - testUsingContext('dry-run with set-exit-if-changed', () async { - final String projectPath = await createProject(tempDir); - - final File srcFile = globals.fs.file( - globals.fs.path.join(projectPath, 'lib', 'main.dart')); - final String nonFormatted = srcFile.readAsStringSync().replaceFirst( - 'main()', 'main( )'); - srcFile.writeAsStringSync(nonFormatted); - - final FormatCommand command = FormatCommand(); - final CommandRunner runner = createTestCommandRunner(command); - - expect(runner.run([ - 'format', '--dry-run', '--set-exit-if-changed', srcFile.path, - ]), throwsException); - - final String shouldNotFormatted = srcFile.readAsStringSync(); - expect(shouldNotFormatted, nonFormatted); - }); - - testUsingContext('line-length', () async { - const int lineLengthShort = 50; - const int lineLengthLong = 120; - final String projectPath = await createProject(tempDir); - - final File srcFile = globals.fs.file( - globals.fs.path.join(projectPath, 'lib', 'main.dart')); - final String nonFormatted = srcFile.readAsStringSync(); - srcFile.writeAsStringSync( - nonFormatted.replaceFirst('main()', - 'main(anArgument1, anArgument2, anArgument3, anArgument4, anArgument5)')); - - final String nonFormattedWithLongLine = srcFile.readAsStringSync(); - final FormatCommand command = FormatCommand(); - final CommandRunner runner = createTestCommandRunner(command); - - await runner.run(['format', '--line-length', '$lineLengthLong', srcFile.path]); - final String notFormatted = srcFile.readAsStringSync(); - expect(nonFormattedWithLongLine, notFormatted); - - await runner.run(['format', '--line-length', '$lineLengthShort', srcFile.path]); - final String shouldFormatted = srcFile.readAsStringSync(); - expect(nonFormattedWithLongLine, isNot(shouldFormatted)); - }); - }); -} diff --git a/packages/flutter_tools/test/general.shard/commands/format_test.dart b/packages/flutter_tools/test/general.shard/commands/format_test.dart new file mode 100644 index 00000000000..37e0ad305c5 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/commands/format_test.dart @@ -0,0 +1,38 @@ +// Copyright 2014 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 'package:args/command_runner.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/commands/format.dart'; +import 'package:flutter_tools/src/globals.dart' as globals; + +import '../../src/common.dart'; +import '../../src/context.dart'; + +void main() { + testUsingContext('flutter format forward all arguments to dart format and ' + 'prints deprecation warning', () async { + final CommandRunner runner = CommandRunner('flutter', 'test') + ..addCommand(FormatCommand()); + await runner.run(['format', 'a', 'b', 'c']); + + expect(testLogger.errorText, contains('"flutter format" is deprecated')); + expect((globals.processManager as FakeProcessManager).hasRemainingExpectations, false); + }, overrides: { + FileSystem: () => MemoryFileSystem.test(), + ProcessManager: () => FakeProcessManager.list([ + FakeCommand( + command: [ + globals.artifacts.getArtifactPath(Artifact.engineDartBinary), + 'format', + 'a', + 'b', + 'c', + ], + ) + ]) + }); +}