OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 import 'dart:convert'; |
1 import 'dart:io'; | 6 import 'dart:io'; |
2 | 7 |
3 import 'package:args/args.dart'; | 8 import 'package:args/args.dart'; |
| 9 import 'package:dart_style/src/dart_formatter.dart'; |
| 10 import 'package:dart_style/src/formatter_exception.dart'; |
4 import 'package:dart_style/src/formatter_options.dart'; | 11 import 'package:dart_style/src/formatter_options.dart'; |
5 import 'package:dart_style/src/io.dart'; | 12 import 'package:dart_style/src/io.dart'; |
6 | 13 |
7 void main(List<String> args) { | 14 void main(List<String> args) { |
8 var parser = new ArgParser(allowTrailingOptions: true); | 15 var parser = new ArgParser(allowTrailingOptions: true); |
9 | 16 |
10 parser.addFlag("help", abbr: "h", negatable: false, | 17 parser.addFlag("help", abbr: "h", negatable: false, |
11 help: "Shows usage information."); | 18 help: "Shows usage information."); |
12 parser.addOption("line-length", abbr: "l", | 19 parser.addOption("line-length", abbr: "l", |
13 help: "Wrap lines longer than this.", | 20 help: "Wrap lines longer than this.", |
14 defaultsTo: "80"); | 21 defaultsTo: "80"); |
15 parser.addFlag("dry-run", abbr: "n", negatable: false, | 22 parser.addFlag("dry-run", abbr: "n", negatable: false, |
16 help: "Show which files would be modified but make no changes."); | 23 help: "Show which files would be modified but make no changes."); |
17 parser.addFlag("overwrite", abbr: "w", negatable: false, | 24 parser.addFlag("overwrite", abbr: "w", negatable: false, |
18 help: "Overwrite input files with formatted output.\n" | 25 help: "Overwrite input files with formatted output."); |
19 "If unset, prints results to standard output."); | 26 parser.addFlag("machine", abbr: "m", negatable: false, |
| 27 help: "Produce machine-readable JSON output."); |
20 parser.addFlag("follow-links", negatable: false, | 28 parser.addFlag("follow-links", negatable: false, |
21 help: "Follow links to files and directories.\n" | 29 help: "Follow links to files and directories.\n" |
22 "If unset, links will be ignored."); | 30 "If unset, links will be ignored."); |
23 parser.addFlag("machine", abbr: "m", negatable: false, | |
24 help: "Produce machine-readable JSON output."); | |
25 parser.addFlag("transform", abbr: "t", negatable: false, | 31 parser.addFlag("transform", abbr: "t", negatable: false, |
26 help: "Unused flag for compability with the old formatter."); | 32 help: "Unused flag for compability with the old formatter."); |
27 | 33 |
28 var argResults; | 34 var argResults; |
29 try { | 35 try { |
30 argResults = parser.parse(args); | 36 argResults = parser.parse(args); |
31 } on FormatException catch (err) { | 37 } on FormatException catch (err) { |
32 printUsage(parser, err.message); | 38 printUsage(parser, err.message); |
33 exitCode = 64; | 39 exitCode = 64; |
34 return; | 40 return; |
35 } | 41 } |
36 | 42 |
37 if (argResults["help"]) { | 43 if (argResults["help"]) { |
38 printUsage(parser); | 44 printUsage(parser); |
39 return; | 45 return; |
40 } | 46 } |
41 | 47 |
42 if (argResults["dry-run"] && argResults["overwrite"]) { | 48 if (argResults["dry-run"] && argResults["overwrite"]) { |
43 printUsage(parser, | 49 printUsage(parser, |
44 "Cannot use --dry-run and --overwrite at the same time."); | 50 "Cannot use --dry-run and --overwrite at the same time."); |
45 exitCode = 64; | 51 exitCode = 64; |
46 return; | 52 return; |
47 } | 53 } |
48 | 54 |
49 checkForReporterCollision(String chosen, String other) { | 55 checkForReporterCollision(String chosen, String other) { |
50 if (argResults[other]) { | 56 if (!argResults[other]) return false; |
51 printUsage(parser, | 57 |
52 "Cannot use --$chosen and --$other at the same time."); | 58 printUsage(parser, |
53 exitCode = 64; | 59 "Cannot use --$chosen and --$other at the same time."); |
54 return; | 60 exitCode = 64; |
55 } | 61 return true; |
56 } | 62 } |
57 | 63 |
58 var reporter = OutputReporter.print; | 64 var reporter = OutputReporter.print; |
59 if (argResults["dry-run"]) { | 65 if (argResults["dry-run"]) { |
60 checkForReporterCollision("dry-run", "overwrite"); | 66 if (checkForReporterCollision("dry-run", "overwrite")) return; |
61 checkForReporterCollision("dry-run", "machine"); | 67 if (checkForReporterCollision("dry-run", "machine")) return; |
62 | 68 |
63 reporter = OutputReporter.dryRun; | 69 reporter = OutputReporter.dryRun; |
64 } else if (argResults["overwrite"]) { | 70 } else if (argResults["overwrite"]) { |
65 checkForReporterCollision("overwrite", "machine"); | 71 if (checkForReporterCollision("overwrite", "machine")) return; |
| 72 |
| 73 if (argResults.rest.isEmpty) { |
| 74 printUsage(parser, |
| 75 "Cannot use --overwrite without providing any paths to format."); |
| 76 exitCode = 64; |
| 77 return; |
| 78 } |
66 | 79 |
67 reporter = OutputReporter.overwrite; | 80 reporter = OutputReporter.overwrite; |
68 } else if (argResults["machine"]) { | 81 } else if (argResults["machine"]) { |
69 reporter = OutputReporter.printJson; | 82 reporter = OutputReporter.printJson; |
70 } | 83 } |
71 | 84 |
72 var pageWidth; | 85 var pageWidth; |
73 | 86 |
74 try { | 87 try { |
75 pageWidth = int.parse(argResults["line-length"]); | 88 pageWidth = int.parse(argResults["line-length"]); |
76 } on FormatException catch (_) { | 89 } on FormatException catch (_) { |
77 printUsage(parser, '--line-length must be an integer, was ' | 90 printUsage(parser, '--line-length must be an integer, was ' |
78 '"${argResults['line-length']}".'); | 91 '"${argResults['line-length']}".'); |
79 exitCode = 64; | 92 exitCode = 64; |
80 return; | 93 return; |
81 } | 94 } |
82 | 95 |
83 var followLinks = argResults["follow-links"]; | 96 var followLinks = argResults["follow-links"]; |
84 | 97 |
85 if (argResults.rest.isEmpty) { | |
86 printUsage(parser, | |
87 "Please provide at least one directory or file to format."); | |
88 exitCode = 64; | |
89 return; | |
90 } | |
91 | |
92 var options = new FormatterOptions(reporter, | 98 var options = new FormatterOptions(reporter, |
93 pageWidth: pageWidth, followLinks: followLinks); | 99 pageWidth: pageWidth, followLinks: followLinks); |
94 | 100 |
95 for (var path in argResults.rest) { | 101 if (argResults.rest.isEmpty) { |
| 102 formatStdin(options); |
| 103 } else { |
| 104 formatPaths(options, argResults.rest); |
| 105 } |
| 106 } |
| 107 |
| 108 /// Reads input from stdin until it's closed, and the formats it. |
| 109 void formatStdin(FormatterOptions options) { |
| 110 var input = new StringBuffer(); |
| 111 stdin.transform(new Utf8Decoder()).listen(input.write, onDone: () { |
| 112 var formatter = new DartFormatter(pageWidth: options.pageWidth); |
| 113 try { |
| 114 var source = input.toString(); |
| 115 var output = formatter.format(source, uri: "stdin"); |
| 116 options.reporter.showFile(null, "<stdin>", output, |
| 117 changed: source != output); |
| 118 return true; |
| 119 } on FormatterException catch (err) { |
| 120 stderr.writeln(err.message()); |
| 121 } catch (err, stack) { |
| 122 stderr.writeln('''Hit a bug in the formatter when formatting stdin. |
| 123 Please report at: github.com/dart-lang/dart_style/issues |
| 124 $err |
| 125 $stack'''); |
| 126 } |
| 127 }); |
| 128 } |
| 129 |
| 130 /// Formats all of the files and directories given by [paths]. |
| 131 void formatPaths(FormatterOptions options, List<String> paths) { |
| 132 for (var path in paths) { |
96 var directory = new Directory(path); | 133 var directory = new Directory(path); |
97 if (directory.existsSync()) { | 134 if (directory.existsSync()) { |
98 if (!processDirectory(options, directory)) { | 135 if (!processDirectory(options, directory)) { |
99 exitCode = 65; | 136 exitCode = 65; |
100 } | 137 } |
101 continue; | 138 continue; |
102 } | 139 } |
103 | 140 |
104 var file = new File(path); | 141 var file = new File(path); |
105 if (file.existsSync()) { | 142 if (file.existsSync()) { |
(...skipping 10 matching lines...) Expand all Loading... |
116 var output = stdout; | 153 var output = stdout; |
117 | 154 |
118 var message = "Reformats whitespace in Dart source files."; | 155 var message = "Reformats whitespace in Dart source files."; |
119 if (error != null) { | 156 if (error != null) { |
120 message = error; | 157 message = error; |
121 output = stdout; | 158 output = stdout; |
122 } | 159 } |
123 | 160 |
124 output.write("""$message | 161 output.write("""$message |
125 | 162 |
126 Usage: dartformat [-w] <files or directories...> | 163 Usage: dartformat [-n|-w] [files or directories...] |
127 | 164 |
128 ${parser.usage} | 165 ${parser.usage} |
129 """); | 166 """); |
130 } | 167 } |
OLD | NEW |