Skip to content

Commit 635f26e

Browse files
HixieInconnu08
authored andcommitted
Be more verbose when pub fails (flutter#42187)
1 parent 9149908 commit 635f26e

File tree

2 files changed

+83
-45
lines changed

2 files changed

+83
-45
lines changed

packages/flutter_tools/lib/src/dart/pub.dart

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@ abstract class Pub {
114114
/// understand usage.
115115
Future<void> batch(
116116
List<String> arguments, {
117-
@required PubContext context,
118-
String directory,
119-
MessageFilter filter,
120-
String failureMessage = 'pub failed',
121-
@required bool retry,
122-
bool showTraceForErrors,
123-
});
117+
@required PubContext context,
118+
String directory,
119+
MessageFilter filter,
120+
String failureMessage = 'pub failed',
121+
@required bool retry,
122+
bool showTraceForErrors,
123+
});
124124

125125

126126
/// Runs pub in 'interactive' mode.
@@ -129,8 +129,8 @@ abstract class Pub {
129129
/// stdout/stderr stream of pub to the corresponding streams of this process.
130130
Future<void> interactively(
131131
List<String> arguments, {
132-
String directory,
133-
});
132+
String directory,
133+
});
134134
}
135135

136136
class _DefaultPub implements Pub {
@@ -201,17 +201,19 @@ class _DefaultPub implements Pub {
201201
@override
202202
Future<void> batch(
203203
List<String> arguments, {
204-
@required PubContext context,
205-
String directory,
206-
MessageFilter filter,
207-
String failureMessage = 'pub failed',
208-
@required bool retry,
209-
bool showTraceForErrors,
210-
}) async {
204+
@required PubContext context,
205+
String directory,
206+
MessageFilter filter,
207+
String failureMessage = 'pub failed',
208+
@required bool retry,
209+
bool showTraceForErrors,
210+
}) async {
211211
showTraceForErrors ??= isRunningOnBot;
212212

213+
String lastPubMessage = 'no message';
213214
bool versionSolvingFailed = false;
214215
String filterWrapper(String line) {
216+
lastPubMessage = line;
215217
if (line.contains('version solving failed')) {
216218
versionSolvingFailed = true;
217219
}
@@ -227,19 +229,25 @@ class _DefaultPub implements Pub {
227229
int attempts = 0;
228230
int duration = 1;
229231
int code;
230-
while (true) {
232+
loop: while (true) {
231233
attempts += 1;
232234
code = await processUtils.stream(
233235
_pubCommand(arguments),
234236
workingDirectory: directory,
235-
mapFunction: filterWrapper,
237+
mapFunction: filterWrapper, // may set versionSolvingFailed, lastPubMessage
236238
environment: _createPubEnvironment(context),
237239
);
238-
if (code != 69) { // UNAVAILABLE in https://github.com/dart-lang/pub/blob/master/lib/src/exit_codes.dart
239-
break;
240+
String message;
241+
switch (code) {
242+
case 69: // UNAVAILABLE in https://github.com/dart-lang/pub/blob/master/lib/src/exit_codes.dart
243+
message = 'server unavailable';
244+
break;
245+
default:
246+
break loop;
240247
}
248+
assert(message != null);
241249
versionSolvingFailed = false;
242-
printStatus('$failureMessage ($code) -- attempting retry $attempts in $duration second${ duration == 1 ? "" : "s"}...');
250+
printStatus('$failureMessage ($message) -- attempting retry $attempts in $duration second${ duration == 1 ? "" : "s"}...');
243251
await Future<void>.delayed(Duration(seconds: duration));
244252
if (duration < 64) {
245253
duration *= 2;
@@ -259,14 +267,14 @@ class _DefaultPub implements Pub {
259267
).send();
260268

261269
if (code != 0) {
262-
throwToolExit('$failureMessage ($code)', exitCode: code);
270+
throwToolExit('$failureMessage ($code; $lastPubMessage)', exitCode: code);
263271
}
264272
}
265273

266274
@override
267275
Future<void> interactively(
268276
List<String> arguments, {
269-
String directory,
277+
String directory,
270278
}) async {
271279
Cache.releaseLockEarly();
272280
final io.Process process = await processUtils.start(

packages/flutter_tools/test/general.shard/dart/pub_get_test.dart

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,46 +44,46 @@ void main() {
4444
time.elapse(const Duration(milliseconds: 500));
4545
expect(testLogger.statusText,
4646
'Running "flutter pub get" in /...\n'
47-
'pub get failed (69) -- attempting retry 1 in 1 second...\n',
47+
'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n',
4848
);
4949
expect(processMock.lastPubEnvironment, contains('flutter_cli:flutter_tests'));
5050
expect(processMock.lastPubCache, isNull);
5151
time.elapse(const Duration(milliseconds: 500));
5252
expect(testLogger.statusText,
5353
'Running "flutter pub get" in /...\n'
54-
'pub get failed (69) -- attempting retry 1 in 1 second...\n'
55-
'pub get failed (69) -- attempting retry 2 in 2 seconds...\n',
54+
'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n'
55+
'pub get failed (server unavailable) -- attempting retry 2 in 2 seconds...\n',
5656
);
5757
time.elapse(const Duration(seconds: 1));
5858
expect(testLogger.statusText,
5959
'Running "flutter pub get" in /...\n'
60-
'pub get failed (69) -- attempting retry 1 in 1 second...\n'
61-
'pub get failed (69) -- attempting retry 2 in 2 seconds...\n',
60+
'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n'
61+
'pub get failed (server unavailable) -- attempting retry 2 in 2 seconds...\n',
6262
);
6363
time.elapse(const Duration(seconds: 100)); // from t=0 to t=100
6464
expect(testLogger.statusText,
6565
'Running "flutter pub get" in /...\n'
66-
'pub get failed (69) -- attempting retry 1 in 1 second...\n'
67-
'pub get failed (69) -- attempting retry 2 in 2 seconds...\n'
68-
'pub get failed (69) -- attempting retry 3 in 4 seconds...\n' // at t=1
69-
'pub get failed (69) -- attempting retry 4 in 8 seconds...\n' // at t=5
70-
'pub get failed (69) -- attempting retry 5 in 16 seconds...\n' // at t=13
71-
'pub get failed (69) -- attempting retry 6 in 32 seconds...\n' // at t=29
72-
'pub get failed (69) -- attempting retry 7 in 64 seconds...\n', // at t=61
66+
'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n'
67+
'pub get failed (server unavailable) -- attempting retry 2 in 2 seconds...\n'
68+
'pub get failed (server unavailable) -- attempting retry 3 in 4 seconds...\n' // at t=1
69+
'pub get failed (server unavailable) -- attempting retry 4 in 8 seconds...\n' // at t=5
70+
'pub get failed (server unavailable) -- attempting retry 5 in 16 seconds...\n' // at t=13
71+
'pub get failed (server unavailable) -- attempting retry 6 in 32 seconds...\n' // at t=29
72+
'pub get failed (server unavailable) -- attempting retry 7 in 64 seconds...\n', // at t=61
7373
);
7474
time.elapse(const Duration(seconds: 200)); // from t=0 to t=200
7575
expect(testLogger.statusText,
7676
'Running "flutter pub get" in /...\n'
77-
'pub get failed (69) -- attempting retry 1 in 1 second...\n'
78-
'pub get failed (69) -- attempting retry 2 in 2 seconds...\n'
79-
'pub get failed (69) -- attempting retry 3 in 4 seconds...\n'
80-
'pub get failed (69) -- attempting retry 4 in 8 seconds...\n'
81-
'pub get failed (69) -- attempting retry 5 in 16 seconds...\n'
82-
'pub get failed (69) -- attempting retry 6 in 32 seconds...\n'
83-
'pub get failed (69) -- attempting retry 7 in 64 seconds...\n'
84-
'pub get failed (69) -- attempting retry 8 in 64 seconds...\n' // at t=39
85-
'pub get failed (69) -- attempting retry 9 in 64 seconds...\n' // at t=103
86-
'pub get failed (69) -- attempting retry 10 in 64 seconds...\n', // at t=167
77+
'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n'
78+
'pub get failed (server unavailable) -- attempting retry 2 in 2 seconds...\n'
79+
'pub get failed (server unavailable) -- attempting retry 3 in 4 seconds...\n'
80+
'pub get failed (server unavailable) -- attempting retry 4 in 8 seconds...\n'
81+
'pub get failed (server unavailable) -- attempting retry 5 in 16 seconds...\n'
82+
'pub get failed (server unavailable) -- attempting retry 6 in 32 seconds...\n'
83+
'pub get failed (server unavailable) -- attempting retry 7 in 64 seconds...\n'
84+
'pub get failed (server unavailable) -- attempting retry 8 in 64 seconds...\n' // at t=39
85+
'pub get failed (server unavailable) -- attempting retry 9 in 64 seconds...\n' // at t=103
86+
'pub get failed (server unavailable) -- attempting retry 10 in 64 seconds...\n', // at t=167
8787
);
8888
});
8989
expect(testLogger.errorText, isEmpty);
@@ -97,6 +97,33 @@ void main() {
9797
Pub: () => const Pub(),
9898
});
9999

100+
testUsingContext('pub get 66 shows message from pub', () async {
101+
try {
102+
await pub.get(context: PubContext.flutterTests, checkLastModified: false);
103+
throw AssertionError('pubGet did not fail');
104+
} on ToolExit catch (error) {
105+
expect(error.message, 'pub get failed (66; err3)');
106+
}
107+
expect(testLogger.statusText,
108+
'Running "flutter pub get" in /...\n'
109+
'out1\n'
110+
'out2\n'
111+
'out3\n'
112+
);
113+
expect(testLogger.errorText,
114+
'err1\n'
115+
'err2\n'
116+
'err3\n'
117+
);
118+
}, overrides: <Type, Generator>{
119+
ProcessManager: () => MockProcessManager(66, stderr: 'err1\nerr2\nerr3\n', stdout: 'out1\nout2\nout3\n'),
120+
FileSystem: () => MockFileSystem(),
121+
Platform: () => FakePlatform(
122+
environment: UnmodifiableMapView<String, String>(<String, String>{}),
123+
),
124+
Pub: () => const Pub(),
125+
});
126+
100127
testUsingContext('pub cache in root is used', () async {
101128
String error;
102129

@@ -218,10 +245,12 @@ typedef StartCallback = void Function(List<dynamic> command);
218245

219246
class MockProcessManager implements ProcessManager {
220247
MockProcessManager(this.fakeExitCode, {
248+
this.stdout = '',
221249
this.stderr = '',
222250
});
223251

224252
final int fakeExitCode;
253+
final String stdout;
225254
final String stderr;
226255

227256
String lastPubEnvironment;
@@ -240,6 +269,7 @@ class MockProcessManager implements ProcessManager {
240269
lastPubCache = environment['PUB_CACHE'];
241270
return Future<Process>.value(mocks.createMockProcess(
242271
exitCode: fakeExitCode,
272+
stdout: stdout,
243273
stderr: stderr,
244274
));
245275
}

0 commit comments

Comments
 (0)