@@ -12,6 +12,8 @@ import 'package:analyzer/src/dart/sdk/sdk.dart';
1212import 'package:analyzer/src/generated/sdk.dart' ;
1313import 'package:args/args.dart' ;
1414import 'package:dartdoc/dartdoc.dart' ;
15+ import 'package:dartdoc/src/logging.dart' ;
16+ import 'package:logging/logging.dart' as logging;
1517import 'package:path/path.dart' as path;
1618import 'package:stack_trace/stack_trace.dart' ;
1719
@@ -23,8 +25,8 @@ main(List<String> arguments) async {
2325 try {
2426 args = parser.parse (arguments);
2527 } on FormatException catch (e) {
26- print (e.message);
27- print ('' );
28+ stderr. writeln (e.message);
29+ stderr. writeln ('' );
2830 // http://linux.die.net/include/sysexits.h
2931 // #define EX_USAGE 64 /* command line usage error */
3032 _printUsageAndExit (parser, exitCode: 64 );
@@ -46,12 +48,9 @@ main(List<String> arguments) async {
4648 }
4749
4850 final bool sdkDocs = args['sdk-docs' ];
51+ final bool showProgress = args['show-progress' ];
4952
50- if (args['show-progress' ]) {
51- _showProgress = true ;
52- }
53-
54- var readme = args['sdk-readme' ];
53+ final String readme = args['sdk-readme' ];
5554 if (readme != null && ! (new File (readme).existsSync ())) {
5655 stderr.writeln (
5756 " fatal error: unable to locate the SDK description file at $readme ." );
@@ -123,6 +122,49 @@ main(List<String> arguments) async {
123122 _printUsageAndExit (parser, exitCode: 1 );
124123 }
125124
125+ // By default, get all log output at `progressLevel` or greater.
126+ // This allows us to capture progress events and print `...`.
127+ logging.Logger .root.level = progressLevel;
128+ final stopwatch = new Stopwatch ()..start ();
129+
130+ // Used to track if we're printing `...` to show progress.
131+ // Allows unified new-line tracking
132+ var writingProgress = false ;
133+
134+ logging.Logger .root.onRecord.listen ((record) {
135+ if (record.level == progressLevel) {
136+ if (showProgress && stopwatch.elapsed.inMilliseconds > 250 ) {
137+ writingProgress = true ;
138+ stdout.write ('.' );
139+ stopwatch.reset ();
140+ }
141+ return ;
142+ }
143+
144+ stopwatch.reset ();
145+ if (writingProgress) {
146+ // print a new line after progress dots...
147+ print ('' );
148+ writingProgress = false ;
149+ }
150+ var message = record.message;
151+ assert (message == message.trimRight ());
152+ assert (message.isNotEmpty);
153+
154+ if (record.level < logging.Level .WARNING ) {
155+ if (message.endsWith ('...' )) {
156+ // Assume there may be more progress to print, so omit the trailing
157+ // newline
158+ writingProgress = true ;
159+ stdout.write (message);
160+ } else {
161+ print (message);
162+ }
163+ } else {
164+ stderr.writeln (message);
165+ }
166+ });
167+
126168 PackageMeta packageMeta = sdkDocs
127169 ? new PackageMeta .fromSdk (sdkDir,
128170 sdkReadmePath: readme, useCategories: args['use-categories' ])
@@ -144,9 +186,8 @@ main(List<String> arguments) async {
144186 }
145187 }
146188
147- print ("Generating documentation for '${packageMeta }' into "
189+ logInfo ("Generating documentation for '${packageMeta }' into "
148190 "${outputDir .absolute .path }${Platform .pathSeparator }" );
149- print ('' );
150191
151192 var generators = await initGenerators (url, args['rel-canonical-prefix' ],
152193 headerFilePaths: headerFilePaths,
@@ -157,7 +198,7 @@ main(List<String> arguments) async {
157198 prettyIndexJson: args['pretty-index-json' ]);
158199
159200 for (var generator in generators) {
160- generator.onFileCreated.listen (_onProgress );
201+ generator.onFileCreated.listen (logProgress );
161202 }
162203
163204 DartSdk sdk = new FolderBasedDartSdk (PhysicalResourceProvider .INSTANCE ,
@@ -203,10 +244,10 @@ main(List<String> arguments) async {
203244 outputDir, packageMeta, includeLibraries,
204245 includeExternals: includeExternals);
205246
206- dartdoc.onCheckProgress.listen (_onProgress );
207- Chain .capture (() async {
247+ dartdoc.onCheckProgress.listen (logProgress );
248+ await Chain .capture (() async {
208249 DartDocResults results = await dartdoc.generateDocs ();
209- print ( ' \n Success ! Docs generated into ${results .outDir .absolute .path }' );
250+ logInfo ( 'Success ! Docs generated into ${results .outDir .absolute .path }' );
210251 }, onError: (e, Chain chain) {
211252 if (e is DartDocFailure ) {
212253 stderr.writeln ('\n Generation failed: ${e }.' );
@@ -218,8 +259,6 @@ main(List<String> arguments) async {
218259 });
219260}
220261
221- bool _showProgress = false ;
222-
223262ArgParser _createArgsParser () {
224263 var parser = new ArgParser ();
225264 parser.addFlag ('help' ,
@@ -232,7 +271,8 @@ ArgParser _createArgsParser() {
232271 defaultsTo: false );
233272 parser.addFlag ('sdk-docs' ,
234273 help: 'Generate ONLY the docs for the Dart SDK.' , negatable: false );
235- parser.addFlag ('show-warnings' , help: 'Display warnings.' , negatable: false );
274+ parser.addFlag ('show-warnings' ,
275+ help: 'Display warnings.' , negatable: false , defaultsTo: false );
236276 parser.addFlag ('show-progress' ,
237277 help: 'Display progress indications to console stdout' , negatable: false );
238278 parser.addOption ('sdk-readme' ,
@@ -318,15 +358,6 @@ ArgParser _createArgsParser() {
318358 return parser;
319359}
320360
321- int _progressCounter = 0 ;
322-
323- void _onProgress (var file) {
324- if (_showProgress && _progressCounter % 5 == 0 ) {
325- stdout.write ('.' );
326- }
327- _progressCounter += 1 ;
328- }
329-
330361/// Print help if we are passed the help option.
331362void _printHelpAndExit (ArgParser parser, {int exitCode: 0 }) {
332363 print ('Generate HTML documentation for Dart libraries.\n ' );
0 commit comments