| Index: bin/format.dart | 
| diff --git a/bin/format.dart b/bin/format.dart | 
| index a1644b4602ffb0a420cfb5a6ffe8d5e1007d9a5f..d6be2b9900b37a9427507bc13bda2f708f1e6a2c 100644 | 
| --- a/bin/format.dart | 
| +++ b/bin/format.dart | 
| @@ -1,6 +1,13 @@ | 
| +// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file | 
| +// for details. All rights reserved. Use of this source code is governed by a | 
| +// BSD-style license that can be found in the LICENSE file. | 
| + | 
| +import 'dart:convert'; | 
| import 'dart:io'; | 
|  | 
| import 'package:args/args.dart'; | 
| +import 'package:dart_style/src/dart_formatter.dart'; | 
| +import 'package:dart_style/src/formatter_exception.dart'; | 
| import 'package:dart_style/src/formatter_options.dart'; | 
| import 'package:dart_style/src/io.dart'; | 
|  | 
| @@ -15,13 +22,12 @@ void main(List<String> args) { | 
| parser.addFlag("dry-run", abbr: "n", negatable: false, | 
| help: "Show which files would be modified but make no changes."); | 
| parser.addFlag("overwrite", abbr: "w", negatable: false, | 
| -      help: "Overwrite input files with formatted output.\n" | 
| -            "If unset, prints results to standard output."); | 
| +      help: "Overwrite input files with formatted output."); | 
| +  parser.addFlag("machine", abbr: "m", negatable: false, | 
| +      help: "Produce machine-readable JSON output."); | 
| parser.addFlag("follow-links", negatable: false, | 
| help: "Follow links to files and directories.\n" | 
| "If unset, links will be ignored."); | 
| -  parser.addFlag("machine", abbr: "m", negatable: false, | 
| -      help: "Produce machine-readable JSON output."); | 
| parser.addFlag("transform", abbr: "t", negatable: false, | 
| help: "Unused flag for compability with the old formatter."); | 
|  | 
| @@ -47,22 +53,29 @@ void main(List<String> args) { | 
| } | 
|  | 
| checkForReporterCollision(String chosen, String other) { | 
| -    if (argResults[other]) { | 
| -      printUsage(parser, | 
| -          "Cannot use --$chosen and --$other at the same time."); | 
| -      exitCode = 64; | 
| -      return; | 
| -    } | 
| +    if (!argResults[other]) return false; | 
| + | 
| +    printUsage(parser, | 
| +        "Cannot use --$chosen and --$other at the same time."); | 
| +    exitCode = 64; | 
| +    return true; | 
| } | 
|  | 
| var reporter = OutputReporter.print; | 
| if (argResults["dry-run"]) { | 
| -    checkForReporterCollision("dry-run", "overwrite"); | 
| -    checkForReporterCollision("dry-run", "machine"); | 
| +    if (checkForReporterCollision("dry-run", "overwrite")) return; | 
| +    if (checkForReporterCollision("dry-run", "machine")) return; | 
|  | 
| reporter = OutputReporter.dryRun; | 
| } else if (argResults["overwrite"]) { | 
| -    checkForReporterCollision("overwrite", "machine"); | 
| +    if (checkForReporterCollision("overwrite", "machine")) return; | 
| + | 
| +    if (argResults.rest.isEmpty) { | 
| +      printUsage(parser, | 
| +          "Cannot use --overwrite without providing any paths to format."); | 
| +      exitCode = 64; | 
| +      return; | 
| +    } | 
|  | 
| reporter = OutputReporter.overwrite; | 
| } else if (argResults["machine"]) { | 
| @@ -82,17 +95,41 @@ void main(List<String> args) { | 
|  | 
| var followLinks = argResults["follow-links"]; | 
|  | 
| +  var options = new FormatterOptions(reporter, | 
| +      pageWidth: pageWidth, followLinks: followLinks); | 
| + | 
| if (argResults.rest.isEmpty) { | 
| -    printUsage(parser, | 
| -        "Please provide at least one directory or file to format."); | 
| -    exitCode = 64; | 
| -    return; | 
| +    formatStdin(options); | 
| +  } else { | 
| +    formatPaths(options, argResults.rest); | 
| } | 
| +} | 
|  | 
| -  var options = new FormatterOptions(reporter, | 
| -      pageWidth: pageWidth, followLinks: followLinks); | 
| +/// Reads input from stdin until it's closed, and the formats it. | 
| +void formatStdin(FormatterOptions options) { | 
| +  var input = new StringBuffer(); | 
| +  stdin.transform(new Utf8Decoder()).listen(input.write, onDone: () { | 
| +    var formatter = new DartFormatter(pageWidth: options.pageWidth); | 
| +    try { | 
| +      var source = input.toString(); | 
| +      var output = formatter.format(source, uri: "stdin"); | 
| +      options.reporter.showFile(null, "<stdin>", output, | 
| +          changed: source != output); | 
| +      return true; | 
| +    } on FormatterException catch (err) { | 
| +      stderr.writeln(err.message()); | 
| +    } catch (err, stack) { | 
| +      stderr.writeln('''Hit a bug in the formatter when formatting stdin. | 
| +Please report at: github.com/dart-lang/dart_style/issues | 
| +$err | 
| +$stack'''); | 
| +    } | 
| +  }); | 
| +} | 
|  | 
| -  for (var path in argResults.rest) { | 
| +/// Formats all of the files and directories given by [paths]. | 
| +void formatPaths(FormatterOptions options, List<String> paths) { | 
| +  for (var path in paths) { | 
| var directory = new Directory(path); | 
| if (directory.existsSync()) { | 
| if (!processDirectory(options, directory)) { | 
| @@ -123,7 +160,7 @@ void printUsage(ArgParser parser, [String error]) { | 
|  | 
| output.write("""$message | 
|  | 
| -Usage: dartformat [-w] <files or directories...> | 
| +Usage: dartformat [-n|-w] [files or directories...] | 
|  | 
| ${parser.usage} | 
| """); | 
|  |