OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// The main entrypoint for the pub command line application. | 5 /// The main entrypoint for the pub command line application. |
6 library pub; | 6 library pub; |
7 | 7 |
8 import 'dart:async'; | 8 import 'dart:async'; |
9 import '../../pkg/args/lib/args.dart'; | 9 import '../../pkg/args/lib/args.dart'; |
10 import '../../pkg/path/lib/path.dart' as path; | 10 import '../../pkg/path/lib/path.dart' as path; |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 | 228 |
229 log.error(message); | 229 log.error(message); |
230 if (globalOptions['trace'] && trace != null) { | 230 if (globalOptions['trace'] && trace != null) { |
231 log.error(trace); | 231 log.error(trace); |
232 log.dumpTranscript(); | 232 log.dumpTranscript(); |
233 } | 233 } |
234 | 234 |
235 exit(_chooseExitCode(error)); | 235 exit(_chooseExitCode(error)); |
236 } | 236 } |
237 | 237 |
238 var future = new Future.immediate(null); | 238 defer(() { |
239 if (requiresEntrypoint) { | 239 if (requiresEntrypoint) { |
240 // TODO(rnystrom): Will eventually need better logic to walk up | 240 // TODO(rnystrom): Will eventually need better logic to walk up |
241 // subdirectories until we hit one that looks package-like. For now, just | 241 // subdirectories until we hit one that looks package-like. For now, |
242 // assume the cwd is it. | 242 // just assume the cwd is it. |
243 future = Entrypoint.load(path.current, cache); | 243 entrypoint = new Entrypoint(path.current, cache); |
244 } | 244 } |
245 | 245 |
246 future = future.then((entrypoint) { | 246 var commandFuture = onRun(); |
247 this.entrypoint = entrypoint; | 247 if (commandFuture == null) return true; |
248 try { | |
249 var commandFuture = onRun(); | |
250 if (commandFuture == null) return true; | |
251 | 248 |
252 return commandFuture; | 249 return commandFuture; |
253 } catch (error, trace) { | 250 }).whenComplete(() => cache_.deleteTempDir()).catchError((asyncError) { |
254 handleError(error, trace); | 251 var e = asyncError.error; |
| 252 if (e is PubspecNotFoundException && e.name == null) { |
| 253 e = 'Could not find a file named "pubspec.yaml" in the directory ' |
| 254 '${path.current}.'; |
| 255 } else if (e is PubspecHasNoNameException && e.name == null) { |
| 256 e = 'pubspec.yaml is missing the required "name" field (e.g. "name: ' |
| 257 '${basename(path.current)}").'; |
255 } | 258 } |
256 }); | |
257 | 259 |
258 future | 260 handleError(e, asyncError.stackTrace); |
259 .then((_) => cache_.deleteTempDir()) | 261 }).then((_) { |
260 .catchError((asyncError) { | |
261 var e = asyncError.error; | |
262 if (e is PubspecNotFoundException && e.name == null) { | |
263 e = 'Could not find a file named "pubspec.yaml" in the directory ' | |
264 '${path.current}.'; | |
265 } else if (e is PubspecHasNoNameException && e.name == null) { | |
266 e = 'pubspec.yaml is missing the required "name" field (e.g. "name: ' | |
267 '${basename(path.current)}").'; | |
268 } | |
269 | |
270 handleError(e, asyncError.stackTrace); | |
271 }) | |
272 // Explicitly exit on success to ensure that any dangling dart:io handles | 262 // Explicitly exit on success to ensure that any dangling dart:io handles |
273 // don't cause the process to never terminate. | 263 // don't cause the process to never terminate. |
274 .then((_) => exit(0)); | 264 exit(0); |
| 265 }); |
275 } | 266 } |
276 | 267 |
277 /// Override this to perform the specific command. Return a future that | 268 /// Override this to perform the specific command. Return a future that |
278 /// completes when the command is done or fails if the command fails. If the | 269 /// completes when the command is done or fails if the command fails. If the |
279 /// command is synchronous, it may return `null`. | 270 /// command is synchronous, it may return `null`. |
280 Future onRun(); | 271 Future onRun(); |
281 | 272 |
282 /// Displays usage information for this command. | 273 /// Displays usage information for this command. |
283 void printUsage([String description]) { | 274 void printUsage([String description]) { |
284 if (description == null) description = this.description; | 275 if (description == null) description = this.description; |
(...skipping 16 matching lines...) Expand all Loading... |
301 if (exception is HttpException || exception is HttpParserException || | 292 if (exception is HttpException || exception is HttpParserException || |
302 exception is SocketIOException || exception is PubHttpException) { | 293 exception is SocketIOException || exception is PubHttpException) { |
303 return exit_codes.UNAVAILABLE; | 294 return exit_codes.UNAVAILABLE; |
304 } else if (exception is FormatException) { | 295 } else if (exception is FormatException) { |
305 return exit_codes.DATA; | 296 return exit_codes.DATA; |
306 } else { | 297 } else { |
307 return 1; | 298 return 1; |
308 } | 299 } |
309 } | 300 } |
310 } | 301 } |
OLD | NEW |