Unverified Commit 6f71ce26 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Place terminalUi flag on terminal interface (#39214)

parent a37239e5
......@@ -448,7 +448,6 @@ class AndroidDevice extends Device {
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool ipv6 = false,
bool usesTerminalUi = true,
}) async {
if (!await _checkForSupportedAdbVersion() || !await _checkForSupportedAndroidVersion())
return LaunchResult.failed();
......
......@@ -110,6 +110,11 @@ class AnsiTerminal {
bool get supportsColor => platform.stdoutSupportsAnsi ?? false;
final RegExp _boldControls = RegExp('(${RegExp.escape(resetBold)}|${RegExp.escape(bold)})');
/// Whether we are interacting with the flutter tool via the terminal.
///
/// If not set, defaults to false.
bool usesTerminalUi = false;
String bolden(String message) {
assert(message != null);
if (!supportsColor || message.isEmpty)
......@@ -186,6 +191,8 @@ class AnsiTerminal {
/// null, and the user presses enter without any other input, the return value
/// will be the character in `acceptedCharacters` at the index given by
/// `defaultChoiceIndex`.
///
/// If [usesTerminalUi] is false, throws a [StateError].
Future<String> promptForCharInput(
List<String> acceptedCharacters, {
String prompt,
......@@ -196,6 +203,9 @@ class AnsiTerminal {
assert(acceptedCharacters.isNotEmpty);
assert(prompt == null || prompt.isNotEmpty);
assert(displayAcceptedCharacters != null);
if (!usesTerminalUi) {
throw StateError('cannot prompt without a terminal ui');
}
List<String> charactersToDisplay = acceptedCharacters;
if (defaultChoiceIndex != null) {
assert(defaultChoiceIndex >= 0 && defaultChoiceIndex < acceptedCharacters.length);
......
......@@ -60,7 +60,6 @@ class ResidentWebRunner extends ResidentRunner {
target: target,
debuggingOptions: debuggingOptions,
ipv6: ipv6,
usesTerminalUi: true,
stayResident: true,
);
......
......@@ -11,6 +11,7 @@ import '../base/common.dart';
import '../base/context.dart';
import '../base/file_system.dart';
import '../base/io.dart';
import '../base/terminal.dart';
import '../base/utils.dart';
import '../cache.dart';
import '../commands/daemon.dart';
......@@ -269,13 +270,13 @@ class AttachCommand extends FlutterCommand {
flutterDevice.observatoryUris = <Uri>[ observatoryUri ];
final List<FlutterDevice> flutterDevices = <FlutterDevice>[flutterDevice];
final DebuggingOptions debuggingOptions = DebuggingOptions.enabled(getBuildInfo());
terminal.usesTerminalUi = daemon == null;
final ResidentRunner runner = useHot ?
hotRunnerFactory.build(
flutterDevices,
target: targetFile,
debuggingOptions: debuggingOptions,
packagesFilePath: globalResults['packages'],
usesTerminalUi: daemon == null,
projectRootPath: argResults['project-root'],
dillOutputPath: argResults['output-dill'],
ipv6: usesIpv6,
......@@ -356,7 +357,6 @@ class HotRunnerFactory {
List<FlutterDevice> devices, {
String target,
DebuggingOptions debuggingOptions,
bool usesTerminalUi = true,
bool benchmarkMode = false,
File applicationBinary,
bool hostIsIde = false,
......@@ -370,7 +370,6 @@ class HotRunnerFactory {
devices,
target: target,
debuggingOptions: debuggingOptions,
usesTerminalUi: usesTerminalUi,
benchmarkMode: benchmarkMode,
applicationBinary: applicationBinary,
hostIsIde: hostIsIde,
......
......@@ -426,7 +426,6 @@ class AppDomain extends Domain {
<FlutterDevice>[flutterDevice],
target: target,
debuggingOptions: options,
usesTerminalUi: false,
applicationBinary: applicationBinary,
projectRootPath: projectRootPath,
packagesFilePath: packagesFilePath,
......@@ -440,7 +439,6 @@ class AppDomain extends Domain {
target: target,
debuggingOptions: options,
applicationBinary: applicationBinary,
usesTerminalUi: false,
ipv6: ipv6,
);
}
......
......@@ -270,7 +270,6 @@ Future<LaunchResult> _startApp(DriveCommand command) async {
),
platformArgs: platformArgs,
prebuiltApplication: !command.shouldBuild,
usesTerminalUi: false,
);
if (!result.started) {
......
......@@ -8,6 +8,7 @@ import 'package:args/command_runner.dart';
import '../base/common.dart';
import '../base/file_system.dart';
import '../base/terminal.dart';
import '../base/time.dart';
import '../base/utils.dart';
import '../build_info.dart';
......@@ -334,6 +335,7 @@ class RunCommand extends RunCommandBase {
endTimeOverride: appStartedTime,
);
}
terminal.usesTerminalUi = true;
if (argResults['dart-flags'] != null && !FlutterVersion.instance.isMaster) {
throw UsageException('--dart-flags is not available on the stable '
......
......@@ -381,11 +381,6 @@ abstract class Device {
///
/// [platformArgs] allows callers to pass platform-specific arguments to the
/// start call. The build mode is not used by all platforms.
///
/// If [usesTerminalUi] is true, Flutter Tools may attempt to prompt the
/// user to resolve fixable issues such as selecting a signing certificate
/// for iOS device deployment. Set to false if stdin cannot be read from while
/// attempting to start the app.
Future<LaunchResult> startApp(
ApplicationPackage package, {
String mainPath,
......@@ -394,7 +389,6 @@ abstract class Device {
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool ipv6 = false,
bool usesTerminalUi = true,
});
/// Whether this device implements support for hot reload.
......
......@@ -226,7 +226,6 @@ class FuchsiaDevice extends Device {
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
if (!prebuiltApplication) {
......
......@@ -94,7 +94,6 @@ final RegExp _certificateOrganizationalUnitExtractionPattern = RegExp(r'OU=([a-z
/// project has a development team set in the project's build settings.
Future<Map<String, String>> getCodeSigningIdentityDevelopmentTeam({
BuildableIOSApp iosApp,
bool usesTerminalUi = true,
}) async {
final Map<String, String> buildSettings = iosApp.project.buildSettings;
if (buildSettings == null)
......@@ -140,7 +139,7 @@ Future<Map<String, String>> getCodeSigningIdentityDevelopmentTeam({
.toSet() // Unique.
.toList();
final String signingIdentity = await _chooseSigningIdentity(validCodeSigningIdentities, usesTerminalUi);
final String signingIdentity = await _chooseSigningIdentity(validCodeSigningIdentities);
// If none are chosen, return null.
if (signingIdentity == null)
......@@ -185,7 +184,7 @@ Future<Map<String, String>> getCodeSigningIdentityDevelopmentTeam({
};
}
Future<String> _chooseSigningIdentity(List<String> validCodeSigningIdentities, bool usesTerminalUi) async {
Future<String> _chooseSigningIdentity(List<String> validCodeSigningIdentities) async {
// The user has no valid code signing identities.
if (validCodeSigningIdentities.isEmpty) {
printError(noCertificatesInstruction, emphasis: true);
......@@ -209,7 +208,7 @@ Future<String> _chooseSigningIdentity(List<String> validCodeSigningIdentities, b
// If terminal UI can't be used, just attempt with the first valid certificate
// since we can't ask the user.
if (!usesTerminalUi)
if (!terminal.usesTerminalUi)
return validCodeSigningIdentities.first;
final int count = validCodeSigningIdentities.length;
......
......@@ -263,7 +263,6 @@ class IOSDevice extends Device {
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
if (!prebuiltApplication) {
......@@ -279,7 +278,6 @@ class IOSDevice extends Device {
buildInfo: debuggingOptions.buildInfo,
targetOverride: mainPath,
buildForDevice: true,
usesTerminalUi: usesTerminalUi,
activeArch: iosArch,
);
if (!buildResult.success) {
......
......@@ -267,7 +267,7 @@ Future<XcodeBuildResult> buildXcodeProject({
bool buildForDevice,
DarwinArch activeArch,
bool codesign = true,
bool usesTerminalUi = true,
}) async {
if (!upgradePbxProjWithFlutterAssets(app.project))
return XcodeBuildResult(success: false);
......@@ -324,7 +324,7 @@ Future<XcodeBuildResult> buildXcodeProject({
Map<String, String> autoSigningConfigs;
if (codesign && buildForDevice)
autoSigningConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app, usesTerminalUi: usesTerminalUi);
autoSigningConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app);
// Before the build, all service definitions must be updated and the dylibs
// copied over to a location that is suitable for Xcodebuild to find them.
......
......@@ -329,14 +329,13 @@ class IOSSimulator extends Device {
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
if (!prebuiltApplication && package is BuildableIOSApp) {
printTrace('Building ${package.name} for $id.');
try {
await _setupUpdatedApplicationBundle(package, debuggingOptions.buildInfo, mainPath, usesTerminalUi);
await _setupUpdatedApplicationBundle(package, debuggingOptions.buildInfo, mainPath);
} on ToolExit catch (e) {
printError(e.message);
return LaunchResult.failed();
......@@ -406,7 +405,7 @@ class IOSSimulator extends Device {
}
}
Future<void> _setupUpdatedApplicationBundle(covariant BuildableIOSApp app, BuildInfo buildInfo, String mainPath, bool usesTerminalUi) async {
Future<void> _setupUpdatedApplicationBundle(covariant BuildableIOSApp app, BuildInfo buildInfo, String mainPath) async {
await _sideloadUpdatedAssetsForInstalledApplicationBundle(app, buildInfo, mainPath);
// Step 1: Build the Xcode project.
......@@ -422,7 +421,6 @@ class IOSSimulator extends Device {
buildInfo: debugBuildInfo,
targetOverride: mainPath,
buildForDevice: false,
usesTerminalUi: usesTerminalUi,
);
if (!buildResult.success)
throwToolExit('Could not build the application for the simulator.');
......
......@@ -76,7 +76,6 @@ class LinuxDevice extends Device {
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
_lastBuiltMode = debuggingOptions.buildInfo.mode;
......
......@@ -77,7 +77,6 @@ class MacOSDevice extends Device {
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
// Stop any running applications with the same executable.
......
......@@ -382,7 +382,6 @@ class FlutterDevice {
platformArgs: platformArgs,
route: route,
prebuiltApplication: prebuiltMode,
usesTerminalUi: hotRunner.usesTerminalUi,
ipv6: hotRunner.ipv6,
);
......@@ -443,7 +442,6 @@ class FlutterDevice {
platformArgs: platformArgs,
route: route,
prebuiltApplication: prebuiltMode,
usesTerminalUi: coldRunner.usesTerminalUi,
ipv6: coldRunner.ipv6,
);
......@@ -536,7 +534,6 @@ abstract class ResidentRunner {
String projectRootPath,
String packagesFilePath,
this.ipv6,
this.usesTerminalUi = true,
this.stayResident = true,
this.hotMode = true,
this.dillOutputPath,
......@@ -563,7 +560,6 @@ abstract class ResidentRunner {
final List<FlutterDevice> flutterDevices;
final String target;
final DebuggingOptions debuggingOptions;
final bool usesTerminalUi;
final bool stayResident;
final bool ipv6;
final Completer<int> _finished = Completer<int>();
......
......@@ -23,13 +23,11 @@ class ColdRunner extends ResidentRunner {
this.awaitFirstFrameWhenTracing = true,
this.applicationBinary,
bool ipv6 = false,
bool usesTerminalUi = false,
bool stayResident = true,
}) : super(devices,
target: target,
debuggingOptions: debuggingOptions,
hotMode: false,
usesTerminalUi: usesTerminalUi,
stayResident: stayResident,
ipv6: ipv6);
......
......@@ -58,7 +58,6 @@ class HotRunner extends ResidentRunner {
List<FlutterDevice> devices, {
String target,
DebuggingOptions debuggingOptions,
bool usesTerminalUi = true,
this.benchmarkMode = false,
this.applicationBinary,
this.hostIsIde = false,
......@@ -70,7 +69,6 @@ class HotRunner extends ResidentRunner {
}) : super(devices,
target: target,
debuggingOptions: debuggingOptions,
usesTerminalUi: usesTerminalUi,
projectRootPath: projectRootPath,
packagesFilePath: packagesFilePath,
stayResident: stayResident,
......
......@@ -105,7 +105,6 @@ class FlutterTesterDevice extends Device {
@required DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
final BuildInfo buildInfo = debuggingOptions.buildInfo;
......
......@@ -123,7 +123,6 @@ class ChromeDevice extends Device {
DebuggingOptions debuggingOptions,
Map<String, Object> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
// See [ResidentWebRunner.run] in flutter_tools/lib/src/resident_web_runner.dart
......
......@@ -78,7 +78,6 @@ class WindowsDevice extends Device {
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool usesTerminalUi = true,
bool ipv6 = false,
}) async {
if (!prebuiltApplication) {
......
......@@ -123,7 +123,15 @@ void main() {
terminalUnderTest = TestTerminal();
});
testUsingContext('character prompt throws if usesTerminalUi is false', () async {
expect(terminalUnderTest.promptForCharInput(
<String>['a', 'b', 'c'],
prompt: 'Please choose something',
), throwsA(isInstanceOf<StateError>()));
});
testUsingContext('character prompt', () async {
terminalUnderTest.usesTerminalUi = true;
mockStdInStream = Stream<String>.fromFutures(<Future<String>>[
Future<String>.value('d'), // Not in accepted list.
Future<String>.value('\n'), // Not in accepted list
......@@ -143,6 +151,7 @@ void main() {
});
testUsingContext('default character choice without displayAcceptedCharacters', () async {
terminalUnderTest.usesTerminalUi = true;
mockStdInStream = Stream<String>.fromFutures(<Future<String>>[
Future<String>.value('\n'), // Not in accepted list
]).asBroadcastStream();
......
......@@ -147,7 +147,6 @@ void main() {
dillOutputPath: anyNamed('dillOutputPath'),
debuggingOptions: anyNamed('debuggingOptions'),
packagesFilePath: anyNamed('packagesFilePath'),
usesTerminalUi: anyNamed('usesTerminalUi'),
flutterProject: anyNamed('flutterProject'),
ipv6: false,
),
......@@ -179,7 +178,6 @@ void main() {
dillOutputPath: outputDill,
debuggingOptions: anyNamed('debuggingOptions'),
packagesFilePath: anyNamed('packagesFilePath'),
usesTerminalUi: anyNamed('usesTerminalUi'),
flutterProject: anyNamed('flutterProject'),
ipv6: false,
),
......@@ -269,7 +267,6 @@ void main() {
target: anyNamed('target'),
debuggingOptions: anyNamed('debuggingOptions'),
packagesFilePath: anyNamed('packagesFilePath'),
usesTerminalUi: anyNamed('usesTerminalUi'),
flutterProject: anyNamed('flutterProject'),
ipv6: false,
)).thenReturn(mockHotRunner);
......@@ -299,7 +296,6 @@ void main() {
target: foo.path,
debuggingOptions: anyNamed('debuggingOptions'),
packagesFilePath: anyNamed('packagesFilePath'),
usesTerminalUi: anyNamed('usesTerminalUi'),
flutterProject: anyNamed('flutterProject'),
ipv6: false,
)).called(1);
......
......@@ -338,7 +338,6 @@ void main() {
debuggingOptions: anyNamed('debuggingOptions'),
platformArgs: anyNamed('platformArgs'),
prebuiltApplication: anyNamed('prebuiltApplication'),
usesTerminalUi: false,
)).thenAnswer((_) => Future<LaunchResult>.value(mockLaunchResult));
when(mockDevice.isAppInstalled(any)).thenAnswer((_) => Future<bool>.value(false));
......@@ -380,7 +379,6 @@ void main() {
debuggingOptions: anyNamed('debuggingOptions'),
platformArgs: anyNamed('platformArgs'),
prebuiltApplication: false,
usesTerminalUi: false,
));
}, overrides: <Type, Generator>{
FileSystem: () => fs,
......@@ -407,7 +405,6 @@ void main() {
debuggingOptions: anyNamed('debuggingOptions'),
platformArgs: anyNamed('platformArgs'),
prebuiltApplication: false,
usesTerminalUi: false,
));
}, overrides: <Type, Generator>{
FileSystem: () => fs,
......@@ -434,7 +431,6 @@ void main() {
debuggingOptions: anyNamed('debuggingOptions'),
platformArgs: anyNamed('platformArgs'),
prebuiltApplication: true,
usesTerminalUi: false,
));
}, overrides: <Type, Generator>{
FileSystem: () => fs,
......
......@@ -35,6 +35,7 @@ void main() {
'For our purposes': 'a non-empty build settings map is valid',
});
testTerminal = TestTerminal();
testTerminal.usesTerminalUi = true;
app = BuildableIOSApp(mockIosProject);
});
......@@ -296,6 +297,7 @@ void main() {
});
testUsingContext('Test multiple identity in machine mode works', () async {
testTerminal.usesTerminalUi = false;
when(mockProcessManager.runSync(<String>['which', 'security']))
.thenReturn(exitsHappy);
when(mockProcessManager.runSync(<String>['which', 'openssl']))
......@@ -347,7 +349,7 @@ void main() {
when(mockOpenSslProcess.stderr).thenAnswer((Invocation invocation) => mockOpenSslStdErr);
when(mockOpenSslProcess.exitCode).thenAnswer((_) => Future<int>.value(0));
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app, usesTerminalUi: false);
final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app);
expect(
testLogger.statusText,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment