Merge pull request #4998 from johnmccutchan/hot_catch_reload_failures

Fix hot reload failure handling
This commit is contained in:
John McCutchan 2016-07-22 11:12:54 -07:00 committed by GitHub
commit 3871b0eb2a
3 changed files with 13 additions and 16 deletions

View File

@ -211,7 +211,7 @@ ZipEntry _obtainLicenses(
// splitting each one into each component license (so that we can // splitting each one into each component license (so that we can
// de-dupe if possible). // de-dupe if possible).
final Set<String> packageLicenses = new Set<String>(); final Set<String> packageLicenses = new Set<String>();
final List<Uri> packages = packageMap.map.values; final Iterable<Uri> packages = packageMap.map.values;
for (Uri package in packages) { for (Uri package in packages) {
if (package != null && package.scheme == 'file') { if (package != null && package.scheme == 'file') {
final File file = new File.fromUri(package.resolve('../LICENSE')); final File file = new File.fromUri(package.resolve('../LICENSE'));

View File

@ -114,17 +114,13 @@ class Observatory {
}); });
} }
Future<Response> reloadSources(String isolateId) async { Future<Null> reloadSources(String isolateId) async {
Completer<Event> whenIsolateReloads = new Completer<Event>();
StreamSubscription<Event> sub = onIsolateEvent
.where((Event event) => event.kind == 'IsolateReload')
.listen((Event event) => whenIsolateReloads.complete(event));
try { try {
await sendRequest('_reloadSources', <String, dynamic>{ 'isolateId': isolateId }); await sendRequest('_reloadSources',
return await whenIsolateReloads.future.timeout(new Duration(seconds: 20)); <String, dynamic>{ 'isolateId': isolateId });
} finally { return null;
await sub.cancel(); } catch (e) {
return new Future<Null>.error(e.data['details']);
} }
} }

View File

@ -378,13 +378,14 @@ class RunAndStayResident {
await _updateDevFS(); await _updateDevFS();
} }
Status reloadStatus = logger.startProgress('Performing hot reload'); Status reloadStatus = logger.startProgress('Performing hot reload');
Event result = await observatory.reloadSources(observatory.firstIsolateId); try {
reloadStatus.stop(showElapsedTime: true); await observatory.reloadSources(observatory.firstIsolateId);
dynamic error = result.response['reloadError']; } catch (errorMessage) {
if (error != null) { reloadStatus.stop(showElapsedTime: true);
printError('Error reloading application sources: $error'); printError('Hot reload was rejected:\n$errorMessage');
return false; return false;
} }
reloadStatus.stop(showElapsedTime: true);
Status reassembleStatus = Status reassembleStatus =
logger.startProgress('Reassembling application'); logger.startProgress('Reassembling application');
await observatory.flutterReassemble(observatory.firstIsolateId); await observatory.flutterReassemble(observatory.firstIsolateId);