| Index: sdk/lib/_internal/pub/lib/src/command/serve.dart | 
| diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart | 
| index 614436f71b3bb2b59418da5b122ee12acafee24d..f7c140a778f7d45b40f6ae85490627ec882459c9 100644 | 
| --- a/sdk/lib/_internal/pub/lib/src/command/serve.dart | 
| +++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart | 
| @@ -13,7 +13,6 @@ import 'package:path/path.dart' as p; | 
| import '../barback/build_environment.dart'; | 
| import '../barback/pub_package_provider.dart'; | 
| import '../command.dart'; | 
| -import '../exit_codes.dart' as exit_codes; | 
| import '../io.dart'; | 
| import '../log.dart' as log; | 
| import '../utils.dart'; | 
| @@ -33,6 +32,19 @@ class ServeCommand extends PubCommand { | 
|  | 
| String get hostname => commandOptions['hostname']; | 
|  | 
| +  /// The base port for the servers. | 
| +  /// | 
| +  /// This will print a usage error and exit if the specified port is invalid. | 
| +  int get port => parseInt(commandOptions['port'], 'port'); | 
| + | 
| +  /// The port for the admin UI. | 
| +  /// | 
| +  /// This will print a usage error and exit if the specified port is invalid. | 
| +  int get adminPort { | 
| +    var adminPort = commandOptions['admin-port']; | 
| +    return adminPort == null ? null : parseInt(adminPort, 'admin port'); | 
| +  } | 
| + | 
| /// `true` if Dart entrypoints should be compiled to JavaScript. | 
| bool get useDart2JS => commandOptions['dart2js']; | 
|  | 
| @@ -59,6 +71,9 @@ class ServeCommand extends PubCommand { | 
| // Remove this (and always log) when #16954 is fixed. | 
| commandParser.addFlag('log-admin-url', defaultsTo: false, hide: true); | 
|  | 
| +    // TODO(nweiz): Make this public when issue 16954 is fixed. | 
| +    commandParser.addOption('admin-port', hide: true); | 
| + | 
| commandParser.addFlag('dart2js', defaultsTo: true, | 
| help: 'Compile Dart to JavaScript.'); | 
| commandParser.addFlag('force-poll', defaultsTo: false, | 
| @@ -68,14 +83,9 @@ class ServeCommand extends PubCommand { | 
| } | 
|  | 
| Future onRun() { | 
| -    var port; | 
| -    try { | 
| -      port = int.parse(commandOptions['port']); | 
| -    } on FormatException catch (_) { | 
| -      log.error('Could not parse port "${commandOptions['port']}"'); | 
| -      this.printUsage(); | 
| -      return flushThenExit(exit_codes.USAGE); | 
| -    } | 
| +    var port = parseInt(commandOptions['port'], 'port'); | 
| +    var adminPort = commandOptions['admin-port'] == null ? null : | 
| +        parseInt(commandOptions['admin-port'], 'admin port'); | 
|  | 
| var directories = _parseDirectoriesToServe(); | 
|  | 
| @@ -88,7 +98,7 @@ class ServeCommand extends PubCommand { | 
| var directoryLength = directories.map((dir) => dir.length) | 
| .reduce(math.max); | 
|  | 
| -      return environment.startAdminServer().then((server) { | 
| +      return environment.startAdminServer(adminPort).then((server) { | 
| server.results.listen((_) { | 
| // The admin server produces no result values. | 
| assert(false); | 
|  |