blob: 8e9b1d42ffde3ff4c9f318c1bc7375c80a6df16c [file] [log] [blame]
// Copyright 2023 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
import 'package:args/command_runner.dart';
import 'package:devtools_tool/model.dart';
import 'package:io/io.dart';
import 'package:path/path.dart' as path;
import '../utils.dart';
const _pubGetFlag = 'pub-get';
const _upgradeFlag = 'upgrade';
class GenerateCodeCommand extends Command {
GenerateCodeCommand() {
argParser
..addFlag(
_pubGetFlag,
defaultsTo: true,
negatable: true,
help:
'Run pub get on the DevTools packages before performing the code generation.',
)
..addFlag(
_upgradeFlag,
negatable: false,
help:
'Run pub upgrade on the DevTools packages before performing the code generation.',
);
}
@override
String get name => 'generate-code';
@override
String get description =>
'Performs code generation by running `build_runner build` for required packages.';
@override
Future run() async {
final repo = DevToolsRepo.getInstance();
final processManager = ProcessManager();
Future<void> runOverPackages(
CliCommand command, {
String? commandDescription,
}) async {
for (final packageName in ['devtools_app', 'devtools_test']) {
if (commandDescription != null) {
print('Running $commandDescription for $packageName...');
}
final directoryPath = path.join(repo.repoPath, 'packages', packageName);
await processManager.runProcess(
command,
workingDirectory: directoryPath,
);
}
}
await runOverPackages(
CliCommand.git(['clean', '-xfd', '.']),
commandDescription: 'git clean',
);
final pubGet = argResults![_pubGetFlag] as bool;
final upgrade = argResults![_upgradeFlag] as bool;
if (pubGet) {
await processManager.runProcess(
CliCommand.tool(['pub-get', if (upgrade) '--upgrade']),
);
}
await runOverPackages(
CliCommand.dart([
'run',
'build_runner',
'build',
'--delete-conflicting-outputs',
]),
commandDescription: 'build_runner build',
);
// Format the generated code so that the dart format check does not fail on
// the CI.
await processManager.runProcess(
CliCommand.dart(['format', path.join('test', 'test_infra', 'scenes')]),
workingDirectory: repo.devtoolsAppDirectoryPath,
);
await processManager.runProcess(
CliCommand.dart([
'format',
path.join('lib', 'src', 'mocks', 'generated.mocks.dart'),
]),
workingDirectory: path.join(repo.repoPath, 'packages', 'devtools_test'),
);
}
}