From f2dc590b54b956a3c34f5ade23926ba0563a4c14 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Tue, 4 Jan 2022 16:49:54 +0900 Subject: [PATCH 01/10] Migrate most commands to dart --- .gitignore | 3 ++ tools/lib/src/build_examples_command.dart | 58 +++++++++++++++++++++ tools/lib/src/integration_test_command.dart | 38 ++++++++++++++ tools/lib/src/main.dart | 27 +++++----- tools/pubspec.yaml | 1 + 5 files changed, 114 insertions(+), 13 deletions(-) create mode 100644 tools/lib/src/build_examples_command.dart create mode 100644 tools/lib/src/integration_test_command.dart diff --git a/.gitignore b/.gitignore index d7560505f..3582a15fa 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ build/ .project .classpath .settings + +# Downloaded by the plugin tools. +google-java-format-1.3-all-deps.jar diff --git a/tools/lib/src/build_examples_command.dart b/tools/lib/src/build_examples_command.dart new file mode 100644 index 000000000..0edc3a062 --- /dev/null +++ b/tools/lib/src/build_examples_command.dart @@ -0,0 +1,58 @@ +// ignore_for_file: public_member_api_docs, implementation_imports + +import 'package:file/file.dart'; +import 'package:file/src/interface/directory.dart'; +import 'package:flutter_plugin_tools/src/common/package_looping_command.dart'; +import 'package:flutter_plugin_tools/src/common/repository_package.dart'; + +class BuildExamplesCommand extends PackageLoopingCommand { + BuildExamplesCommand(Directory packagesDir) : super(packagesDir); + + @override + String get description => 'Builds all example apps.\n\n' + 'This command requires "flutter-tizen" to be in your path.\n\n'; + + @override + String get name => 'build-examples'; + + @override + Future runForPackage(RepositoryPackage package) async { + final List errors = []; + + if (await processRunner.runAndStream( + 'flutter-tizen', ['pub', 'get'], + workingDir: package.directory) != + 0) { + errors.add('${package.displayName} (pub get failed)'); + return PackageResult.fail(errors); + } + + bool builtSomething = false; + for (final RepositoryPackage example in package.getExamples()) { + final String packageName = + getRelativePosixPath(example.directory, from: packagesDir); + + builtSomething = true; + // (TODO: HakkyuKim) Support different profiles. + final int exitCode = await processRunner.runAndStream('flutter-tizen', + ['build', 'tpk', '--device-profile', 'wearable', '-v'], + workingDir: example.directory); + if (exitCode != 0) { + errors.add(packageName); + } + } + if (await processRunner.runAndStream('flutter-tizen', ['clean'], + workingDir: package.directory) != + 0) { + logWarning('Failed to clean ${package.displayName} after build.'); + } + + if (!builtSomething) { + errors.add('No examples found'); + } + + return errors.isEmpty + ? PackageResult.success() + : PackageResult.fail(errors); + } +} diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart new file mode 100644 index 000000000..a76fb441f --- /dev/null +++ b/tools/lib/src/integration_test_command.dart @@ -0,0 +1,38 @@ +// ignore_for_file: public_member_api_docs, implementation_imports + +import 'package:file/file.dart'; + +import 'package:flutter_plugin_tools/src/common/core.dart'; +import 'package:flutter_plugin_tools/src/common/plugin_command.dart'; + +class IntegrationTestCommand extends PluginCommand { + IntegrationTestCommand(Directory packagesDir) : super(packagesDir); + + @override + String get description => + 'Runs integration tests for plugin example apps.\n\n' + 'This command requires "flutter-tizen" to be in your path.'; + + @override + String get name => 'integration-test'; + + File get pythonTool => packagesDir.parent + .childDirectory('tools') + .childDirectory('tools') + .childFile('run_command.py'); + + @override + Future run() async { + if (!pythonTool.existsSync()) { + print('Error: Cannot find ${pythonTool.path}.'); + throw ToolExit(1); + } + + // (TODO: HakkyuKim) Migrate python tool logic to dart. + final int exitCode = await processRunner.runAndStream( + pythonTool.path, ['test', ...argResults!.arguments]); + if (exitCode != 0) { + throw ToolExit(exitCode); + } + } +} diff --git a/tools/lib/src/main.dart b/tools/lib/src/main.dart index ff108204c..0ecbd4633 100644 --- a/tools/lib/src/main.dart +++ b/tools/lib/src/main.dart @@ -7,11 +7,16 @@ import 'dart:io' as io; +import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/local.dart'; import 'package:flutter_plugin_tools/src/common/core.dart'; -import 'package:flutter_plugin_tools/src/common/process_runner.dart'; +import 'package:flutter_plugin_tools/src/format_command.dart'; +import 'package:flutter_plugin_tools/src/list_command.dart'; +import 'package:flutter_tizen_plugin_tools/src/build_examples_command.dart'; + +import 'integration_test_command.dart'; void main(List args) { const FileSystem fileSystem = LocalFileSystem(); @@ -28,19 +33,15 @@ void main(List args) { } } - const ProcessRunner processRunner = ProcessRunner(); - final Directory sourceTreeRoot = packagesDir.parent; - final File pythonTool = sourceTreeRoot - .childDirectory('tools') - .childDirectory('tools') - .childFile('run_command.py'); - - if (!pythonTool.existsSync()) { - print('Error: Cannot find ${pythonTool.path}.'); - io.exit(1); - } + final CommandRunner commandRunner = CommandRunner( + 'pub global run flutter_tizen_plugin tools', + 'Productivity utils for hosting multiple plugins within one repository.') + ..addCommand(BuildExamplesCommand(packagesDir)) + ..addCommand(FormatCommand(packagesDir)) + ..addCommand(IntegrationTestCommand(packagesDir)) + ..addCommand(ListCommand(packagesDir)); - processRunner.runAndStream(pythonTool.path, args).catchError((Object e) { + commandRunner.run(args).catchError((Object e) { final ToolExit toolExit = e as ToolExit; int exitCode = toolExit.exitCode; // This should never happen; this check is here to guarantee that a ToolExit diff --git a/tools/pubspec.yaml b/tools/pubspec.yaml index ef389736e..83ee28522 100644 --- a/tools/pubspec.yaml +++ b/tools/pubspec.yaml @@ -7,5 +7,6 @@ environment: sdk: '>=2.15.0 <3.0.0' dependencies: + args: ^2.1.0 file: ^6.1.0 flutter_plugin_tools: ^0.7.3 From b9cca524144b6202be471fe18409e3ddd1268a92 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Tue, 4 Jan 2022 16:51:12 +0900 Subject: [PATCH 02/10] Update github workflow scripts --- .github/workflows/analyze.yml | 12 +++++------- .github/workflows/build.yml | 4 ++-- .github/workflows/integration_test.yml | 4 ++-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 25aff9b36..a349f79e4 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -3,7 +3,7 @@ name: Analyze on: [push, pull_request] jobs: - dart: + dart_analyze: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -16,11 +16,9 @@ jobs: cd $d flutter pub get done - - name: Verify formatting - run: dart format --output=none --set-exit-if-changed packages - name: Analyze source code run: dart analyze --fatal-infos packages - clang: + format: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -30,6 +28,6 @@ jobs: - name: Install clang-format run: | sudo apt-get update - sudo apt-get install clang-format-11 - - name: Check tidy - run: ./tools/tools_runner.sh tidy --dir packages + sudo apt-get install clang-format + - name: Check format + run: ./tools/tools_runner.sh format --fail-on-change diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5a4d6cc75..5699a99cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: channel: stable - name: Find changed packages run: | - CHANGED_PACKAGES=$(./tools/tools_runner.sh plugins \ + CHANGED_PACKAGES=$(./tools/tools_runner.sh list \ --run-on-changed-packages \ --base-sha=$(git rev-parse HEAD^)) if [[ ! -z $CHANGED_PACKAGES ]]; then @@ -82,6 +82,6 @@ jobs: if: ${{ env.HAS_CHANGED_PACKAGES == 'true' }} run: | export PATH=`pwd`/flutter-tizen/bin:$PATH - ./tools/tools_runner.sh build \ + ./tools/tools_runner.sh build-examples \ --run-on-changed-packages \ --base-sha=$(git rev-parse HEAD^) diff --git a/.github/workflows/integration_test.yml b/.github/workflows/integration_test.yml index 07d34abba..8460786cd 100644 --- a/.github/workflows/integration_test.yml +++ b/.github/workflows/integration_test.yml @@ -26,7 +26,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} run: | export PATH=`pwd`/flutter-tizen/bin:$PATH - ./tools/tools_runner.sh test \ + ./tools/tools_runner.sh integration-test \ --recipe ./.github/recipe.yaml \ --generate-emulators \ --run-on-changed-packages \ @@ -35,6 +35,6 @@ jobs: if: ${{ github.event_name == 'push' }} run: | export PATH=`pwd`/flutter-tizen/bin:$PATH - ./tools/tools_runner.sh test \ + ./tools/tools_runner.sh integration-test \ --recipe ./.github/recipe.yaml \ --generate-emulators From ec6e52f354bc6d2ca678c03998d526d6ac2c6d7e Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Wed, 5 Jan 2022 11:35:13 +0900 Subject: [PATCH 03/10] Register and parse arguments for integration test --- tools/lib/src/integration_test_command.dart | 48 ++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart index a76fb441f..bccf9e70a 100644 --- a/tools/lib/src/integration_test_command.dart +++ b/tools/lib/src/integration_test_command.dart @@ -6,7 +6,53 @@ import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:flutter_plugin_tools/src/common/plugin_command.dart'; class IntegrationTestCommand extends PluginCommand { - IntegrationTestCommand(Directory packagesDir) : super(packagesDir); + IntegrationTestCommand(Directory packagesDir) : super(packagesDir) { + argParser.addFlag( + _generateEmulatorsArg, + help: 'Create and destroy emulators during test.\n\n' + 'Must provide either $_platformsArg or $_recipeArg option to specify which ' + 'platforms to create.', + ); + argParser.addOption( + _platformsArg, + help: 'Run integration test on all connected targets that satisfy ' + '- (ex: wearable-5.5, tv-6.0).\n\n' + 'The selected targets will be used for all plugins, ' + 'if you wish to run different targets for each plugin,\n' + 'use the $_recipeArg option instead.', + valueHelp: '-', + ); + argParser.addOption(_recipeArg, + help: + 'The recipe file path. A recipe refers to a yaml file that defines ' + 'a list of target platforms to test for each plugin.\n\n' + 'Pass this file if you want to select specific target platforms for different\n' + 'plugins. Every package listed in the recipe file will be recognized by the tool\n' + '(same as $_packagesArg option) and those that specify an empty list will be\n' + 'explicitly excluded (same as $_excludeArg option). If $_recipeArg is used,\n' + '$_packagesArg and $_excludeArg options will be ignored.\n\n' + 'plugins:\n' + ' a: [wearable-5.5, tv-6.0]\n' + ' b: [mobile-6.0]\n' + ' c: [wearable-4.0]\n' + ' d: [] # explicitly excluded\n', + valueHelp: 'recipe.yaml'); + argParser.addOption( + _timeoutArg, + help: 'Timeout limit of each integration test in seconds.', + valueHelp: 'seconds', + defaultsTo: '120', + ); + } + + // Copied from PluginCommand. + static const String _excludeArg = 'exclude'; + static const String _packagesArg = 'packages'; + + static const String _generateEmulatorsArg = 'generate-emulators'; + static const String _platformsArg = 'platforms'; + static const String _recipeArg = 'recipe'; + static const String _timeoutArg = 'timeout'; @override String get description => From 55c9e4e1e5641bcc7ef3e864949f4e0e50b5fcf8 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Thu, 6 Jan 2022 09:44:12 +0900 Subject: [PATCH 04/10] Code cleanups and remove .clang-format file --- .clang-format | 183 -------------------- tools/lib/src/build_examples_command.dart | 9 +- tools/lib/src/integration_test_command.dart | 37 ++-- tools/lib/src/main.dart | 3 +- 4 files changed, 30 insertions(+), 202 deletions(-) delete mode 100644 .clang-format diff --git a/.clang-format b/.clang-format deleted file mode 100644 index e0e6dfcaf..000000000 --- a/.clang-format +++ /dev/null @@ -1,183 +0,0 @@ -# This file is generated by the following command -# clang-format(v11.0.1, in vscode v1.55.0) -style=Google -dump-config > .clang-format - ---- -Language: Cpp -# BasedOnStyle: Google -AccessModifierOffset: -1 -AlignAfterOpenBracket: Align -AlignConsecutiveMacros: false -AlignConsecutiveAssignments: false -AlignConsecutiveBitFields: false -AlignConsecutiveDeclarations: false -AlignEscapedNewlines: Left -AlignOperands: Align -AlignTrailingComments: true -AllowAllArgumentsOnNextLine: true -AllowAllConstructorInitializersOnNextLine: true -AllowAllParametersOfDeclarationOnNextLine: true -AllowShortEnumsOnASingleLine: true -AllowShortBlocksOnASingleLine: Never -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: All -AllowShortLambdasOnASingleLine: All -AllowShortIfStatementsOnASingleLine: WithoutElse -AllowShortLoopsOnASingleLine: true -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: true -AlwaysBreakTemplateDeclarations: Yes -BinPackArguments: true -BinPackParameters: true -BraceWrapping: - AfterCaseLabel: false - AfterClass: false - AfterControlStatement: Never - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - AfterExternBlock: false - BeforeCatch: false - BeforeElse: false - BeforeLambdaBody: false - BeforeWhile: false - IndentBraces: false - SplitEmptyFunction: true - SplitEmptyRecord: true - SplitEmptyNamespace: true -BreakBeforeBinaryOperators: None -BreakBeforeBraces: Attach -BreakBeforeInheritanceComma: false -BreakInheritanceList: BeforeColon -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -BreakConstructorInitializers: BeforeColon -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: true -ColumnLimit: 80 -CommentPragmas: "^ IWYU pragma:" -CompactNamespaces: false -ConstructorInitializerAllOnOneLineOrOnePerLine: true -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DeriveLineEnding: true -DerivePointerAlignment: true -DisableFormat: false -ExperimentalAutoDetectBinPacking: false -FixNamespaceComments: true -ForEachMacros: - - foreach - - Q_FOREACH - - BOOST_FOREACH -IncludeBlocks: Regroup -IncludeCategories: - - Regex: '^' - Priority: 2 - SortPriority: 0 - - Regex: '^<.*\.h>' - Priority: 1 - SortPriority: 0 - - Regex: "^<.*" - Priority: 2 - SortPriority: 0 - - Regex: ".*" - Priority: 3 - SortPriority: 0 -IncludeIsMainRegex: "([-_](test|unittest))?$" -IncludeIsMainSourceRegex: "" -IndentCaseLabels: true -IndentCaseBlocks: false -IndentGotoLabels: true -IndentPPDirectives: None -IndentExternBlock: AfterExternBlock -IndentWidth: 2 -IndentWrappedFunctionNames: false -InsertTrailingCommas: None -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: false -MacroBlockBegin: "" -MacroBlockEnd: "" -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCBinPackProtocolList: Never -ObjCBlockIndentWidth: 2 -ObjCBreakBeforeNestedBlockParam: true -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 2 -PenaltyBreakBeforeFirstCallParameter: 1 -PenaltyBreakComment: 300 -PenaltyBreakFirstLessLess: 120 -PenaltyBreakString: 1000 -PenaltyBreakTemplateDeclaration: 10 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 200 -PointerAlignment: Left -RawStringFormats: - - Language: Cpp - Delimiters: - - cc - - CC - - cpp - - Cpp - - CPP - - "c++" - - "C++" - CanonicalDelimiter: "" - BasedOnStyle: google - - Language: TextProto - Delimiters: - - pb - - PB - - proto - - PROTO - EnclosingFunctions: - - EqualsProto - - EquivToProto - - PARSE_PARTIAL_TEXT_PROTO - - PARSE_TEST_PROTO - - PARSE_TEXT_PROTO - - ParseTextOrDie - - ParseTextProtoOrDie - - ParseTestProto - - ParsePartialTestProto - CanonicalDelimiter: "" - BasedOnStyle: google -ReflowComments: true -SortIncludes: true -SortUsingDeclarations: true -SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -SpaceBeforeCpp11BracedList: false -SpaceBeforeCtorInitializerColon: true -SpaceBeforeInheritanceColon: true -SpaceBeforeParens: ControlStatements -SpaceBeforeRangeBasedForLoopColon: true -SpaceInEmptyBlock: false -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 2 -SpacesInAngles: false -SpacesInConditionalStatement: false -SpacesInContainerLiterals: true -SpacesInCStyleCastParentheses: false -SpacesInParentheses: false -SpacesInSquareBrackets: false -SpaceBeforeSquareBrackets: false -Standard: Auto -StatementMacros: - - Q_UNUSED - - QT_REQUIRE_VERSION -TabWidth: 8 -UseCRLF: false -UseTab: Never -WhitespaceSensitiveMacros: - - STRINGIZE - - PP_STRINGIZE - - BOOST_PP_STRINGIZE diff --git a/tools/lib/src/build_examples_command.dart b/tools/lib/src/build_examples_command.dart index 0edc3a062..fe42b6659 100644 --- a/tools/lib/src/build_examples_command.dart +++ b/tools/lib/src/build_examples_command.dart @@ -1,11 +1,16 @@ -// ignore_for_file: public_member_api_docs, implementation_imports +// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: implementation_imports import 'package:file/file.dart'; -import 'package:file/src/interface/directory.dart'; import 'package:flutter_plugin_tools/src/common/package_looping_command.dart'; import 'package:flutter_plugin_tools/src/common/repository_package.dart'; +/// A command to build the example applications for packages. class BuildExamplesCommand extends PackageLoopingCommand { + /// Creates an instance of the build command. BuildExamplesCommand(Directory packagesDir) : super(packagesDir); @override diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart index bccf9e70a..89171a2d6 100644 --- a/tools/lib/src/integration_test_command.dart +++ b/tools/lib/src/integration_test_command.dart @@ -1,35 +1,42 @@ -// ignore_for_file: public_member_api_docs, implementation_imports +// Copyright 2022 Samsung Electronics Co., Ltd. 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:file/file.dart'; +// ignore_for_file: implementation_imports +import 'package:file/file.dart'; import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:flutter_plugin_tools/src/common/plugin_command.dart'; +/// A command that runs integration test of plugin examples. class IntegrationTestCommand extends PluginCommand { + /// Creates an instance of the integration-test command, which runs the + /// integration test of each plugin example on physical targets or emulators. IntegrationTestCommand(Directory packagesDir) : super(packagesDir) { argParser.addFlag( _generateEmulatorsArg, help: 'Create and destroy emulators during test.\n\n' - 'Must provide either $_platformsArg or $_recipeArg option to specify which ' - 'platforms to create.', + 'Must provide either $_platformsArg or $_recipeArg option to specify\n' + 'which platforms to create.', ); argParser.addOption( _platformsArg, - help: 'Run integration test on all connected targets that satisfy ' + help: 'Run integration test on all connected targets that satisfy\n' '- (ex: wearable-5.5, tv-6.0).\n\n' - 'The selected targets will be used for all plugins, ' + 'The selected targets will be used for all plugins,\n' 'if you wish to run different targets for each plugin,\n' 'use the $_recipeArg option instead.', valueHelp: '-', ); argParser.addOption(_recipeArg, help: - 'The recipe file path. A recipe refers to a yaml file that defines ' + 'The recipe file path. A recipe refers to a yaml file that defines\n' 'a list of target platforms to test for each plugin.\n\n' - 'Pass this file if you want to select specific target platforms for different\n' - 'plugins. Every package listed in the recipe file will be recognized by the tool\n' - '(same as $_packagesArg option) and those that specify an empty list will be\n' - 'explicitly excluded (same as $_excludeArg option). If $_recipeArg is used,\n' + 'Pass this file if you want to select specific target platforms\n' + 'for different plugins. Every package listed in the recipe file\n' + 'will be recognized by the tool (same as $_packagesArg option)\n' + 'and those that specify an empty list will be explicitly excluded\n' + '(same as $_excludeArg option). If $_recipeArg is used,\n' '$_packagesArg and $_excludeArg options will be ignored.\n\n' 'plugins:\n' ' a: [wearable-5.5, tv-6.0]\n' @@ -62,21 +69,21 @@ class IntegrationTestCommand extends PluginCommand { @override String get name => 'integration-test'; - File get pythonTool => packagesDir.parent + File get _pythonTool => packagesDir.parent .childDirectory('tools') .childDirectory('tools') .childFile('run_command.py'); @override Future run() async { - if (!pythonTool.existsSync()) { - print('Error: Cannot find ${pythonTool.path}.'); + if (!_pythonTool.existsSync()) { + print('Error: Cannot find ${_pythonTool.path}.'); throw ToolExit(1); } // (TODO: HakkyuKim) Migrate python tool logic to dart. final int exitCode = await processRunner.runAndStream( - pythonTool.path, ['test', ...argResults!.arguments]); + _pythonTool.path, ['test', ...argResults!.arguments]); if (exitCode != 0) { throw ToolExit(exitCode); } diff --git a/tools/lib/src/main.dart b/tools/lib/src/main.dart index 0ecbd4633..80ad7e494 100644 --- a/tools/lib/src/main.dart +++ b/tools/lib/src/main.dart @@ -10,12 +10,11 @@ import 'dart:io' as io; import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/local.dart'; - import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:flutter_plugin_tools/src/format_command.dart'; import 'package:flutter_plugin_tools/src/list_command.dart'; -import 'package:flutter_tizen_plugin_tools/src/build_examples_command.dart'; +import 'build_examples_command.dart'; import 'integration_test_command.dart'; void main(List args) { From bc52d5c524a83ec58215d80fe0248d23c5e08947 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Thu, 6 Jan 2022 11:16:25 +0900 Subject: [PATCH 05/10] Use clang-format-11 --- .github/workflows/analyze.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index a349f79e4..f77259b73 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -28,6 +28,6 @@ jobs: - name: Install clang-format run: | sudo apt-get update - sudo apt-get install clang-format + sudo apt-get install clang-format-11 - name: Check format - run: ./tools/tools_runner.sh format --fail-on-change + run: ./tools/tools_runner.sh format --fail-on-change --clang-format=clang-format-11 From bd7da5423da34ebba536fef09b23d4a1ff09d71c Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Fri, 14 Jan 2022 11:15:11 +0900 Subject: [PATCH 06/10] Restore .clang-format file --- .clang-format | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..34d1b2fd1 --- /dev/null +++ b/.clang-format @@ -0,0 +1,4 @@ +# DON'T delete this file as it helps developers format C++ code in +# IDEs such as VSCode. + +BasedOnStyle: Google From 968c85746aa58d889d8eaa40b1da0db553cedc39 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Fri, 14 Jan 2022 13:14:03 +0900 Subject: [PATCH 07/10] Fix comments and log messages --- tools/analysis_options.yaml | 5 +++++ tools/lib/src/build_examples_command.dart | 6 +----- tools/lib/src/integration_test_command.dart | 18 +++++++++--------- tools/lib/src/main.dart | 4 +--- 4 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 tools/analysis_options.yaml diff --git a/tools/analysis_options.yaml b/tools/analysis_options.yaml new file mode 100644 index 000000000..94e5a7bc9 --- /dev/null +++ b/tools/analysis_options.yaml @@ -0,0 +1,5 @@ +include: ../analysis_options.yaml + +linter: + rules: + implementation_imports: false diff --git a/tools/lib/src/build_examples_command.dart b/tools/lib/src/build_examples_command.dart index fe42b6659..ff9a21edb 100644 --- a/tools/lib/src/build_examples_command.dart +++ b/tools/lib/src/build_examples_command.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore_for_file: implementation_imports - import 'package:file/file.dart'; import 'package:flutter_plugin_tools/src/common/package_looping_command.dart'; import 'package:flutter_plugin_tools/src/common/repository_package.dart'; @@ -38,9 +36,7 @@ class BuildExamplesCommand extends PackageLoopingCommand { getRelativePosixPath(example.directory, from: packagesDir); builtSomething = true; - // (TODO: HakkyuKim) Support different profiles. - final int exitCode = await processRunner.runAndStream('flutter-tizen', - ['build', 'tpk', '--device-profile', 'wearable', '-v'], + // TODO(HakkyuKim): Support different profiles. workingDir: example.directory); if (exitCode != 0) { errors.add(packageName); diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart index 89171a2d6..aad1abb90 100644 --- a/tools/lib/src/integration_test_command.dart +++ b/tools/lib/src/integration_test_command.dart @@ -2,16 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore_for_file: implementation_imports - import 'package:file/file.dart'; import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:flutter_plugin_tools/src/common/plugin_command.dart'; /// A command that runs integration test of plugin examples. class IntegrationTestCommand extends PluginCommand { - /// Creates an instance of the integration-test command, which runs the - /// integration test of each plugin example on physical targets or emulators. + /// Creates an instance of the integration-test command, which runs + /// integration tests of each plugin example on physical or emulator devices. IntegrationTestCommand(Directory packagesDir) : super(packagesDir) { argParser.addFlag( _generateEmulatorsArg, @@ -21,10 +19,10 @@ class IntegrationTestCommand extends PluginCommand { ); argParser.addOption( _platformsArg, - help: 'Run integration test on all connected targets that satisfy\n' + help: 'Run integration test on all connected devices that satisfy\n' '- (ex: wearable-5.5, tv-6.0).\n\n' - 'The selected targets will be used for all plugins,\n' - 'if you wish to run different targets for each plugin,\n' + 'The selected devices will be used to test all plugins,\n' + 'if you wish to run different devices for each plugin,\n' 'use the $_recipeArg option instead.', valueHelp: '-', ); @@ -52,8 +50,10 @@ class IntegrationTestCommand extends PluginCommand { ); } - // Copied from PluginCommand. + /// Copied from [PluginCommand]. static const String _excludeArg = 'exclude'; + + /// Copied from [PluginCommand]. static const String _packagesArg = 'packages'; static const String _generateEmulatorsArg = 'generate-emulators'; @@ -81,7 +81,7 @@ class IntegrationTestCommand extends PluginCommand { throw ToolExit(1); } - // (TODO: HakkyuKim) Migrate python tool logic to dart. + // TODO(HakkyuKim): Migrate python tool logic to dart. final int exitCode = await processRunner.runAndStream( _pythonTool.path, ['test', ...argResults!.arguments]); if (exitCode != 0) { diff --git a/tools/lib/src/main.dart b/tools/lib/src/main.dart index 80ad7e494..4937c29b6 100644 --- a/tools/lib/src/main.dart +++ b/tools/lib/src/main.dart @@ -3,8 +3,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore_for_file: implementation_imports - import 'dart:io' as io; import 'package:args/command_runner.dart'; @@ -33,7 +31,7 @@ void main(List args) { } final CommandRunner commandRunner = CommandRunner( - 'pub global run flutter_tizen_plugin tools', + './tools/tools_runner.sh', 'Productivity utils for hosting multiple plugins within one repository.') ..addCommand(BuildExamplesCommand(packagesDir)) ..addCommand(FormatCommand(packagesDir)) From 20eba933197aad63f66bfb6be0c79e01480ffce0 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Fri, 14 Jan 2022 13:36:40 +0900 Subject: [PATCH 08/10] Format code and log messages --- tools/lib/src/build_examples_command.dart | 42 +++++++++++++------ tools/lib/src/integration_test_command.dart | 45 +++++++++++---------- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/tools/lib/src/build_examples_command.dart b/tools/lib/src/build_examples_command.dart index ff9a21edb..6368fa6c6 100644 --- a/tools/lib/src/build_examples_command.dart +++ b/tools/lib/src/build_examples_command.dart @@ -22,36 +22,54 @@ class BuildExamplesCommand extends PackageLoopingCommand { Future runForPackage(RepositoryPackage package) async { final List errors = []; - if (await processRunner.runAndStream( - 'flutter-tizen', ['pub', 'get'], - workingDir: package.directory) != - 0) { + int exitCode = await processRunner.runAndStream( + 'flutter-tizen', + ['pub', 'get'], + workingDir: package.directory, + ); + if (exitCode != 0) { errors.add('${package.displayName} (pub get failed)'); return PackageResult.fail(errors); } bool builtSomething = false; for (final RepositoryPackage example in package.getExamples()) { - final String packageName = - getRelativePosixPath(example.directory, from: packagesDir); + final String packageName = getRelativePosixPath( + example.directory, + from: packagesDir, + ); builtSomething = true; // TODO(HakkyuKim): Support different profiles. - workingDir: example.directory); + final int exitCode = await processRunner.runAndStream( + 'flutter-tizen', + [ + 'build', + 'tpk', + '--device-profile', + 'wearable', + '-v', + ], + workingDir: example.directory, + ); if (exitCode != 0) { errors.add(packageName); } } - if (await processRunner.runAndStream('flutter-tizen', ['clean'], - workingDir: package.directory) != - 0) { - logWarning('Failed to clean ${package.displayName} after build.'); - } if (!builtSomething) { errors.add('No examples found'); } + exitCode = await processRunner.runAndStream( + 'flutter-tizen', + ['clean'], + workingDir: package.directory, + ); + if (exitCode != 0) { + logWarning('Failed to clean ${package.displayName} after build.'); + } + return errors.isEmpty ? PackageResult.success() : PackageResult.fail(errors); diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart index aad1abb90..a16a8a158 100644 --- a/tools/lib/src/integration_test_command.dart +++ b/tools/lib/src/integration_test_command.dart @@ -14,34 +14,35 @@ class IntegrationTestCommand extends PluginCommand { argParser.addFlag( _generateEmulatorsArg, help: 'Create and destroy emulators during test.\n\n' - 'Must provide either $_platformsArg or $_recipeArg option to specify\n' + 'Must provide either $_platformsArg or $_recipeArg option to specify ' 'which platforms to create.', ); argParser.addOption( _platformsArg, help: 'Run integration test on all connected devices that satisfy\n' '- (ex: wearable-5.5, tv-6.0).\n\n' - 'The selected devices will be used to test all plugins,\n' - 'if you wish to run different devices for each plugin,\n' - 'use the $_recipeArg option instead.', + 'Selected devices will be used to test all plugins, if you wish to\n' + 'run different devices for each plugin, use $_recipeArg instead.', valueHelp: '-', ); - argParser.addOption(_recipeArg, - help: - 'The recipe file path. A recipe refers to a yaml file that defines\n' - 'a list of target platforms to test for each plugin.\n\n' - 'Pass this file if you want to select specific target platforms\n' - 'for different plugins. Every package listed in the recipe file\n' - 'will be recognized by the tool (same as $_packagesArg option)\n' - 'and those that specify an empty list will be explicitly excluded\n' - '(same as $_excludeArg option). If $_recipeArg is used,\n' - '$_packagesArg and $_excludeArg options will be ignored.\n\n' - 'plugins:\n' - ' a: [wearable-5.5, tv-6.0]\n' - ' b: [mobile-6.0]\n' - ' c: [wearable-4.0]\n' - ' d: [] # explicitly excluded\n', - valueHelp: 'recipe.yaml'); + argParser.addOption( + _recipeArg, + help: + 'The recipe file path. A recipe refers to a yaml file that defines\n' + 'a list of target platforms to test for each plugin.\n\n' + 'Pass this file if you want to select specific target platforms\n' + 'for different plugins. Every package listed in the recipe file\n' + 'will be recognized by the tool (same as $_packagesArg option)\n' + 'and those that specify an empty list will be explicitly excluded\n' + '(same as $_excludeArg option). If $_recipeArg is used,\n' + '$_packagesArg and $_excludeArg options will be ignored.\n\n' + 'plugins:\n' + ' a: [wearable-5.5, tv-6.0]\n' + ' b: [mobile-6.0]\n' + ' c: [wearable-4.0]\n' + ' d: [] # explicitly excluded\n', + valueHelp: 'recipe.yaml', + ); argParser.addOption( _timeoutArg, help: 'Timeout limit of each integration test in seconds.', @@ -83,7 +84,9 @@ class IntegrationTestCommand extends PluginCommand { // TODO(HakkyuKim): Migrate python tool logic to dart. final int exitCode = await processRunner.runAndStream( - _pythonTool.path, ['test', ...argResults!.arguments]); + _pythonTool.path, + ['test', ...argResults!.arguments], + ); if (exitCode != 0) { throw ToolExit(exitCode); } From 8c6b24791057f4243d49060389c38c863e8255c5 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Mon, 17 Jan 2022 11:47:19 +0900 Subject: [PATCH 09/10] Remove newlines in help messages --- tools/lib/src/build_examples_command.dart | 2 +- tools/lib/src/integration_test_command.dart | 24 ++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/lib/src/build_examples_command.dart b/tools/lib/src/build_examples_command.dart index 6368fa6c6..b573ad0e8 100644 --- a/tools/lib/src/build_examples_command.dart +++ b/tools/lib/src/build_examples_command.dart @@ -13,7 +13,7 @@ class BuildExamplesCommand extends PackageLoopingCommand { @override String get description => 'Builds all example apps.\n\n' - 'This command requires "flutter-tizen" to be in your path.\n\n'; + 'This command requires "flutter-tizen" to be in your path.'; @override String get name => 'build-examples'; diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart index a16a8a158..d4455d9d8 100644 --- a/tools/lib/src/integration_test_command.dart +++ b/tools/lib/src/integration_test_command.dart @@ -13,28 +13,28 @@ class IntegrationTestCommand extends PluginCommand { IntegrationTestCommand(Directory packagesDir) : super(packagesDir) { argParser.addFlag( _generateEmulatorsArg, - help: 'Create and destroy emulators during test.\n\n' + help: 'Create and destroy emulators during test.\n' 'Must provide either $_platformsArg or $_recipeArg option to specify ' 'which platforms to create.', ); argParser.addOption( _platformsArg, - help: 'Run integration test on all connected devices that satisfy\n' - '- (ex: wearable-5.5, tv-6.0).\n\n' - 'Selected devices will be used to test all plugins, if you wish to\n' + help: 'Run integration test on all connected devices that satisfy ' + 'profile-version (ex: wearable-5.5, tv-6.0).\n' + 'Selected devices will be used to test all plugins, if you wish to ' 'run different devices for each plugin, use $_recipeArg instead.', - valueHelp: '-', + valueHelp: 'profile-version', ); argParser.addOption( _recipeArg, help: - 'The recipe file path. A recipe refers to a yaml file that defines\n' - 'a list of target platforms to test for each plugin.\n\n' - 'Pass this file if you want to select specific target platforms\n' - 'for different plugins. Every package listed in the recipe file\n' - 'will be recognized by the tool (same as $_packagesArg option)\n' - 'and those that specify an empty list will be explicitly excluded\n' - '(same as $_excludeArg option). If $_recipeArg is used,\n' + 'The recipe file path. A recipe refers to a yaml file that defines ' + 'a list of target platforms to test for each plugin.\n' + 'Pass this file if you want to select specific target platforms ' + 'for different plugins. Every package listed in the recipe file ' + 'will be recognized by the tool(same as $_packagesArg option) ' + 'and those that specify an empty list will be explicitly excluded' + '(same as $_excludeArg option). If $_recipeArg is used, ' '$_packagesArg and $_excludeArg options will be ignored.\n\n' 'plugins:\n' ' a: [wearable-5.5, tv-6.0]\n' From 0853d5bc877bc2e993705f68b072e14f16d91e02 Mon Sep 17 00:00:00 2001 From: Hakkyu Kim Date: Tue, 18 Jan 2022 16:47:58 +0900 Subject: [PATCH 10/10] Fix help message --- tools/lib/src/integration_test_command.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/src/integration_test_command.dart b/tools/lib/src/integration_test_command.dart index d4455d9d8..0430343b4 100644 --- a/tools/lib/src/integration_test_command.dart +++ b/tools/lib/src/integration_test_command.dart @@ -21,7 +21,7 @@ class IntegrationTestCommand extends PluginCommand { _platformsArg, help: 'Run integration test on all connected devices that satisfy ' 'profile-version (ex: wearable-5.5, tv-6.0).\n' - 'Selected devices will be used to test all plugins, if you wish to ' + 'Selected devices will be used to test all plugins. If you wish to ' 'run different devices for each plugin, use $_recipeArg instead.', valueHelp: 'profile-version', );