Commit d89f4386 authored by Devon Carew's avatar Devon Carew Committed by GitHub

improve the logger ui a bit for elapsed times (#7960)

* improve the logger ui a bit for elapsed times

* invert param

* update daemon.dart
parent d29a94c3
...@@ -151,7 +151,7 @@ Future<String> ensureGradlew() async { ...@@ -151,7 +151,7 @@ Future<String> ensureGradlew() async {
? <String>[gradle, 'wrapper'] ? <String>[gradle, 'wrapper']
: <String>[gradle, '-q', 'wrapper']; : <String>[gradle, '-q', 'wrapper'];
try { try {
Status status = logger.startProgress('Running \'gradle wrapper\'...'); Status status = logger.startProgress('Running \'gradle wrapper\'...', expectSlowOperation: true);
int exitcode = await runCommandAndStreamOutput( int exitcode = await runCommandAndStreamOutput(
command, command,
workingDirectory: 'android', workingDirectory: 'android',
...@@ -204,7 +204,7 @@ Future<Null> buildGradleProject(BuildMode buildMode) async { ...@@ -204,7 +204,7 @@ Future<Null> buildGradleProject(BuildMode buildMode) async {
Future<Null> buildGradleProjectV1(String gradlew) async { Future<Null> buildGradleProjectV1(String gradlew) async {
// Run 'gradlew build'. // Run 'gradlew build'.
Status status = logger.startProgress('Running \'gradlew build\'...'); Status status = logger.startProgress('Running \'gradlew build\'...', expectSlowOperation: true);
int exitcode = await runCommandAndStreamOutput( int exitcode = await runCommandAndStreamOutput(
<String>[fs.file(gradlew).absolute.path, 'build'], <String>[fs.file(gradlew).absolute.path, 'build'],
workingDirectory: 'android', workingDirectory: 'android',
...@@ -223,7 +223,7 @@ Future<Null> buildGradleProjectV2(String gradlew, String buildModeName) async { ...@@ -223,7 +223,7 @@ Future<Null> buildGradleProjectV2(String gradlew, String buildModeName) async {
String assembleTask = "assemble${toTitleCase(buildModeName)}"; String assembleTask = "assemble${toTitleCase(buildModeName)}";
// Run 'gradlew assemble<BuildMode>'. // Run 'gradlew assemble<BuildMode>'.
Status status = logger.startProgress('Running \'gradlew $assembleTask\'...'); Status status = logger.startProgress('Running \'gradlew $assembleTask\'...', expectSlowOperation: true);
String gradlewPath = fs.file(gradlew).absolute.path; String gradlewPath = fs.file(gradlew).absolute.path;
List<String> command = logger.isVerbose List<String> command = logger.isVerbose
? <String>[gradlewPath, assembleTask] ? <String>[gradlewPath, assembleTask]
......
...@@ -9,6 +9,7 @@ import 'package:stack_trace/stack_trace.dart'; ...@@ -9,6 +9,7 @@ import 'package:stack_trace/stack_trace.dart';
import 'io.dart'; import 'io.dart';
import 'platform.dart'; import 'platform.dart';
import 'utils.dart';
final AnsiTerminal terminal = new AnsiTerminal(); final AnsiTerminal terminal = new AnsiTerminal();
...@@ -38,11 +39,11 @@ abstract class Logger { ...@@ -38,11 +39,11 @@ abstract class Logger {
/// ///
/// [message] is the message to display to the user; [progressId] provides an ID which can be /// [message] is the message to display to the user; [progressId] provides an ID which can be
/// used to identify this type of progress (`hot.reload`, `hot.restart`, ...). /// used to identify this type of progress (`hot.reload`, `hot.restart`, ...).
Status startProgress(String message, { String progressId }); Status startProgress(String message, { String progressId, bool expectSlowOperation: false });
} }
class Status { class Status {
void stop({ bool showElapsedTime: true }) { } void stop() { }
void cancel() { } void cancel() { }
} }
...@@ -81,13 +82,13 @@ class StdoutLogger extends Logger { ...@@ -81,13 +82,13 @@ class StdoutLogger extends Logger {
void printTrace(String message) { } void printTrace(String message) { }
@override @override
Status startProgress(String message, { String progressId }) { Status startProgress(String message, { String progressId, bool expectSlowOperation: false }) {
if (_status != null) { if (_status != null) {
// Ignore nested progresses; return a no-op status object. // Ignore nested progresses; return a no-op status object.
return new Status(); return new Status();
} else { } else {
if (supportsColor) { if (supportsColor) {
_status = new _AnsiStatus(message, () { _status = null; }); _status = new _AnsiStatus(message, expectSlowOperation, () { _status = null; });
return _status; return _status;
} else { } else {
printStatus(message); printStatus(message);
...@@ -124,7 +125,7 @@ class BufferLogger extends Logger { ...@@ -124,7 +125,7 @@ class BufferLogger extends Logger {
void printTrace(String message) => _trace.writeln(message); void printTrace(String message) => _trace.writeln(message);
@override @override
Status startProgress(String message, { String progressId }) { Status startProgress(String message, { String progressId, bool expectSlowOperation: false }) {
printStatus(message); printStatus(message);
return new Status(); return new Status();
} }
...@@ -156,7 +157,7 @@ class VerboseLogger extends Logger { ...@@ -156,7 +157,7 @@ class VerboseLogger extends Logger {
} }
@override @override
Status startProgress(String message, { String progressId }) { Status startProgress(String message, { String progressId, bool expectSlowOperation: false }) {
printStatus(message); printStatus(message);
return new Status(); return new Status();
} }
...@@ -249,10 +250,10 @@ class AnsiTerminal { ...@@ -249,10 +250,10 @@ class AnsiTerminal {
} }
class _AnsiStatus extends Status { class _AnsiStatus extends Status {
_AnsiStatus(this.message, this.onFinish) { _AnsiStatus(this.message, this.expectSlowOperation, this.onFinish) {
stopwatch = new Stopwatch()..start(); stopwatch = new Stopwatch()..start();
stdout.write('${message.padRight(51)} '); stdout.write('${message.padRight(52)} ');
stdout.write('${_progress[0]}'); stdout.write('${_progress[0]}');
timer = new Timer.periodic(new Duration(milliseconds: 100), _callback); timer = new Timer.periodic(new Duration(milliseconds: 100), _callback);
...@@ -261,6 +262,7 @@ class _AnsiStatus extends Status { ...@@ -261,6 +262,7 @@ class _AnsiStatus extends Status {
static final List<String> _progress = <String>['-', r'\', '|', r'/', '-', r'\', '|', '/']; static final List<String> _progress = <String>['-', r'\', '|', r'/', '-', r'\', '|', '/'];
final String message; final String message;
final bool expectSlowOperation;
final _FinishCallback onFinish; final _FinishCallback onFinish;
Stopwatch stopwatch; Stopwatch stopwatch;
Timer timer; Timer timer;
...@@ -273,17 +275,18 @@ class _AnsiStatus extends Status { ...@@ -273,17 +275,18 @@ class _AnsiStatus extends Status {
} }
@override @override
void stop({ bool showElapsedTime: true }) { void stop() {
onFinish(); onFinish();
if (!live) if (!live)
return; return;
live = false; live = false;
if (showElapsedTime) { if (expectSlowOperation) {
print('\b\b\b\b\b${stopwatch.elapsedMilliseconds.toString().padLeft(3)}ms'); double seconds = stopwatch.elapsedMilliseconds / Duration.MILLISECONDS_PER_SECOND;
print('\b\b\b\b\b${seconds.toStringAsFixed(1).padLeft(4)}s');
} else { } else {
print('\b '); print('\b\b\b\b\b${printWithSeparators(stopwatch.elapsedMilliseconds).toString().padLeft(3)}ms');
} }
timer.cancel(); timer.cancel();
......
...@@ -54,6 +54,19 @@ String toTitleCase(String str) { ...@@ -54,6 +54,19 @@ String toTitleCase(String str) {
/// Return the plural of the given word (`cat(s)`). /// Return the plural of the given word (`cat(s)`).
String pluralize(String word, int count) => count == 1 ? word : word + 's'; String pluralize(String word, int count) => count == 1 ? word : word + 's';
/// Return the value printed with commas every 3 digits.
String printWithSeparators(int value) {
String str = '$value';
int index = 3;
while (index < str.length) {
str = str.substring(0, str.length - index) + ',' + str.substring(str.length - index);
index += 4;
}
return str;
}
/// Return the name of an enum item. /// Return the name of an enum item.
String getEnumName(dynamic enumItem) { String getEnumName(dynamic enumItem) {
String name = '$enumItem'; String name = '$enumItem';
......
...@@ -222,7 +222,7 @@ class MaterialFonts { ...@@ -222,7 +222,7 @@ class MaterialFonts {
} }
Future<Null> download() { Future<Null> download() {
Status status = logger.startProgress('Downloading Material fonts...'); Status status = logger.startProgress('Downloading Material fonts...', expectSlowOperation: true);
Directory fontsDir = cache.getArtifactDirectory(kName); Directory fontsDir = cache.getArtifactDirectory(kName);
if (fontsDir.existsSync()) if (fontsDir.existsSync())
...@@ -373,7 +373,7 @@ class FlutterEngine { ...@@ -373,7 +373,7 @@ class FlutterEngine {
} }
Future<Null> _downloadItem(String message, String url, Directory dest) { Future<Null> _downloadItem(String message, String url, Directory dest) {
Status status = logger.startProgress(message); Status status = logger.startProgress(message, expectSlowOperation: true);
return Cache._downloadFileToCache(Uri.parse(url), dest, true).then<Null>((Null value) { return Cache._downloadFileToCache(Uri.parse(url), dest, true).then<Null>((Null value) {
status.stop(); status.stop();
}).whenComplete(() { }).whenComplete(() {
......
...@@ -52,7 +52,8 @@ class BuildAotCommand extends BuildSubCommand { ...@@ -52,7 +52,8 @@ class BuildAotCommand extends BuildSubCommand {
throwToolExit('Unknown platform: $targetPlatform'); throwToolExit('Unknown platform: $targetPlatform');
String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, getBuildMode()).path); String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, getBuildMode()).path);
Status status = logger.startProgress('Building AOT snapshot in ${getModeName(getBuildMode())} mode ($typeName)...'); Status status = logger.startProgress('Building AOT snapshot in ${getModeName(getBuildMode())} mode ($typeName)...',
expectSlowOperation: true);
String outputPath = await buildAotSnapshot( String outputPath = await buildAotSnapshot(
findMainDartFile(targetFile), findMainDartFile(targetFile),
platform, platform,
......
...@@ -534,7 +534,8 @@ Future<Null> buildAndroid( ...@@ -534,7 +534,8 @@ Future<Null> buildAndroid(
throwToolExit('Failure building APK: unable to find components.'); throwToolExit('Failure building APK: unable to find components.');
String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, buildMode).path); String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, buildMode).path);
Status status = logger.startProgress('Building APK in ${getModeName(buildMode)} mode ($typeName)...'); Status status = logger.startProgress('Building APK in ${getModeName(buildMode)} mode ($typeName)...',
expectSlowOperation: true);
if (flxPath != null && flxPath.isNotEmpty) { if (flxPath != null && flxPath.isNotEmpty) {
if (!fs.isFileSync(flxPath)) { if (!fs.isFileSync(flxPath)) {
......
...@@ -65,7 +65,8 @@ class BuildIOSCommand extends BuildSubCommand { ...@@ -65,7 +65,8 @@ class BuildIOSCommand extends BuildSubCommand {
String logTarget = forSimulator ? 'simulator' : 'device'; String logTarget = forSimulator ? 'simulator' : 'device';
String typeName = path.basename(tools.getEngineArtifactsDirectory(TargetPlatform.ios, getBuildMode()).path); String typeName = path.basename(tools.getEngineArtifactsDirectory(TargetPlatform.ios, getBuildMode()).path);
Status status = logger.startProgress('Building $app for $logTarget ($typeName)...'); Status status = logger.startProgress('Building $app for $logTarget ($typeName)...',
expectSlowOperation: true);
XcodeBuildResult result = await buildXcodeProject( XcodeBuildResult result = await buildXcodeProject(
app: app, app: app,
mode: getBuildMode(), mode: getBuildMode(),
......
...@@ -690,7 +690,7 @@ class NotifyingLogger extends Logger { ...@@ -690,7 +690,7 @@ class NotifyingLogger extends Logger {
} }
@override @override
Status startProgress(String message, { String progressId }) { Status startProgress(String message, { String progressId, bool expectSlowOperation: false }) {
printStatus(message); printStatus(message);
return new Status(); return new Status();
} }
...@@ -776,7 +776,7 @@ class _AppRunLogger extends Logger { ...@@ -776,7 +776,7 @@ class _AppRunLogger extends Logger {
Status _status; Status _status;
@override @override
Status startProgress(String message, { String progressId }) { Status startProgress(String message, { String progressId, bool expectSlowOperation: false }) {
// Ignore nested progresses; return a no-op status object. // Ignore nested progresses; return a no-op status object.
if (_status != null) if (_status != null)
return new Status(); return new Status();
...@@ -820,7 +820,7 @@ class _AppLoggerStatus implements Status { ...@@ -820,7 +820,7 @@ class _AppLoggerStatus implements Status {
final String progressId; final String progressId;
@override @override
void stop({ bool showElapsedTime: true }) { void stop() {
logger._status = null; logger._status = null;
_sendFinished(); _sendFinished();
} }
......
...@@ -33,7 +33,7 @@ class UpdatePackagesCommand extends FlutterCommand { ...@@ -33,7 +33,7 @@ class UpdatePackagesCommand extends FlutterCommand {
final bool hidden; final bool hidden;
Future<Null> _downloadCoverageData() async { Future<Null> _downloadCoverageData() async {
Status status = logger.startProgress("Downloading lcov data for package:flutter..."); Status status = logger.startProgress("Downloading lcov data for package:flutter...", expectSlowOperation: true);
final List<int> data = await fetchUrl(Uri.parse('https://storage.googleapis.com/flutter_infra/flutter/coverage/lcov.info')); final List<int> data = await fetchUrl(Uri.parse('https://storage.googleapis.com/flutter_infra/flutter/coverage/lcov.info'));
final String coverageDir = path.join(Cache.flutterRoot, 'packages/flutter/coverage'); final String coverageDir = path.join(Cache.flutterRoot, 'packages/flutter/coverage');
fs.file(path.join(coverageDir, 'lcov.base.info')) fs.file(path.join(coverageDir, 'lcov.base.info'))
......
...@@ -47,7 +47,8 @@ Future<Null> pubGet({ ...@@ -47,7 +47,8 @@ Future<Null> pubGet({
if (!checkLastModified || _shouldRunPubGet(pubSpecYaml: pubSpecYaml, dotPackages: dotPackages)) { if (!checkLastModified || _shouldRunPubGet(pubSpecYaml: pubSpecYaml, dotPackages: dotPackages)) {
String command = upgrade ? 'upgrade' : 'get'; String command = upgrade ? 'upgrade' : 'get';
Status status = logger.startProgress("Running 'flutter packages $command' in ${path.basename(directory)}..."); Status status = logger.startProgress("Running 'flutter packages $command' in ${path.basename(directory)}...",
expectSlowOperation: true);
int code = await runCommandAndStreamOutput( int code = await runCommandAndStreamOutput(
<String>[sdkBinaryName('pub'), '--verbosity=warning', command, '--no-packages-dir', '--no-precompile'], <String>[sdkBinaryName('pub'), '--verbosity=warning', command, '--no-packages-dir', '--no-precompile'],
workingDirectory: directory, workingDirectory: directory,
......
...@@ -6,6 +6,19 @@ import 'package:flutter_tools/src/base/utils.dart'; ...@@ -6,6 +6,19 @@ import 'package:flutter_tools/src/base/utils.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
void main() { void main() {
group('utils', () {
test('printWithSeparators', () {
expect(printWithSeparators(3), '3');
expect(printWithSeparators(33), '33');
expect(printWithSeparators(333), '333');
expect(printWithSeparators(3333), '3,333');
expect(printWithSeparators(33333), '33,333');
expect(printWithSeparators(333333), '333,333');
expect(printWithSeparators(3333333), '3,333,333');
expect(printWithSeparators(33333333), '33,333,333');
});
});
group('SettingsFile', () { group('SettingsFile', () {
test('parse', () { test('parse', () {
SettingsFile file = new SettingsFile.parse(''' SettingsFile file = new SettingsFile.parse('''
......
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