cleanup list of fixes in dartfix help text

This CL cleans up the displayed help text, better organizes and displays
the list of fixes that are or can be applied, and addresses
a comment in https://dart-review.googlesource.com/c/sdk/+/105002

Change-Id: I2e71001ae7eda61b3b01ce999cb9fdca968a9b93
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105322
Commit-Queue: Dan Rubel <danrubel@google.com>
Auto-Submit: Dan Rubel <danrubel@google.com>
Reviewed-by: Devon Carew <devoncarew@google.com>
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
index 78951b1..d999d83 100644
--- a/pkg/dartfix/lib/src/driver.dart
+++ b/pkg/dartfix/lib/src/driver.dart
@@ -69,7 +69,7 @@
       } finally {
         await server.stop();
       }
-      context.exit(1);
+      context.exit(0);
     }
 
     Future serverStopped;
@@ -269,23 +269,34 @@
     final fixes = new List<DartFix>.from(result.fixes)
       ..sort((f1, f2) => f1.name.compareTo(f2.name));
 
-    for (DartFix fix in fixes) {
-      String line = fix.name;
-      if (fix.isRequired == true) {
-        line = '$line (required)';
-      }
-      logger.stdout('');
-      logger.stdout(line);
-      if (fix.description != null) {
-        for (String line in indentAndWrapDescription(fix.description)) {
-          logger.stdout(line);
-        }
-      }
-    }
+    logger.stdout('''
+
+These fixes are automatically applied unless at least one
+--$includeOption option is specified and --$requiredOption is not specified.
+They may be individually disabled using --$excludeOption.''');
+
+    fixes.where((fix) => fix.isRequired).forEach(showFix);
+
+    logger.stdout('''
+
+These fixes are NOT automatically applied, but may be enabled using --$includeOption.''');
+
+    fixes.where((fix) => !fix.isRequired).forEach(showFix);
 
     return result;
   }
 
+  void showFix(DartFix fix) {
+    logger.stdout('''
+
+* ${fix.name}''');
+    if (fix.description != null) {
+      for (String line in indentAndWrapDescription(fix.description)) {
+        logger.stdout(line);
+      }
+    }
+  }
+
   List<String> indentAndWrapDescription(String description) =>
       description.split('\n').map((line) => '    $line').toList();
 }
diff --git a/pkg/dartfix/lib/src/options.dart b/pkg/dartfix/lib/src/options.dart
index d8653e3..a4d8923 100644
--- a/pkg/dartfix/lib/src/options.dart
+++ b/pkg/dartfix/lib/src/options.dart
@@ -173,20 +173,17 @@
 
   static _showUsage(ArgParser parser, Logger logger,
       {bool showHelpHint = true}) {
-    logger.stderr('Usage: $_binaryName [options...] <directory paths>');
-    logger.stderr('');
-    logger.stderr(parser.usage);
-    logger.stderr('''
-
-If neither --$includeOption nor --$requiredOption is specified, then all fixes will be
-applied. Any fixes specified using --$excludeOption will not be applied regardless
-of whether they are required or specifed using --$includeOption.''');
-    if (showHelpHint) {
-      logger.stderr('''
-
+    Function(String message) out = showHelpHint ? logger.stderr : logger.stdout;
+    // show help on stdout when showHelp is true and showHelpHint is false
+    out('''
+Usage: $_binaryName [options...] <directory paths>
+''');
+    out(parser.usage);
+    out(showHelpHint
+        ? '''
 Use --$_helpOption to display the fixes that can be specified using either
---$includeOption or --$excludeOption.''');
-    }
+--$includeOption or --$excludeOption.'''
+        : '');
   }
 }
 
diff --git a/pkg/dartfix/test/all.dart b/pkg/dartfix/test/all.dart
index 704e376..f06cf57 100644
--- a/pkg/dartfix/test/all.dart
+++ b/pkg/dartfix/test/all.dart
@@ -6,8 +6,8 @@
 
 import 'src/client_version_test.dart' as client_version_test;
 import 'src/driver_exclude_test.dart' as driver_exclude_test;
-import 'src/driver_include_test.dart' as driver_include_test;
 import 'src/driver_help_test.dart' as driver_list_test;
+import 'src/driver_include_test.dart' as driver_include_test;
 import 'src/driver_required_test.dart' as driver_required_test;
 import 'src/driver_test.dart' as driver_test;
 import 'src/options_test.dart' as options_test;
diff --git a/pkg/dartfix/test/src/driver_help_test.dart b/pkg/dartfix/test/src/driver_help_test.dart
index 20361b0..b7e944c 100644
--- a/pkg/dartfix/test/src/driver_help_test.dart
+++ b/pkg/dartfix/test/src/driver_help_test.dart
@@ -21,12 +21,13 @@
       );
       fail('expected exception');
     } on TestExit catch (e) {
-      expect(e.code, 1);
+      expect(e.code, 0);
     }
     final errText = testLogger.stderrBuffer.toString();
     final outText = testLogger.stdoutBuffer.toString();
-    expect(errText, contains('--$excludeOption'));
-    expect(errText, isNot(contains('Use --help to display the fixes')));
+    expect(errText, isEmpty);
+    expect(outText, contains('--$excludeOption'));
+    expect(outText, isNot(contains('Use --help to display the fixes')));
     expect(outText, contains('use-mixin'));
   });
 
@@ -42,14 +43,15 @@
       );
       fail('expected exception');
     } on TestExit catch (e) {
-      expect(e.code, 1);
+      expect(e.code, 0);
     }
     final errText = testLogger.stderrBuffer.toString();
     final outText = testLogger.stdoutBuffer.toString();
     print(errText);
     print(outText);
-    expect(errText, contains('--$excludeOption'));
-    expect(errText, isNot(contains('Use --help to display the fixes')));
+    expect(errText, isEmpty);
+    expect(outText, contains('--$excludeOption'));
+    expect(outText, isNot(contains('Use --help to display the fixes')));
     expect(outText, contains('use-mixin'));
   });
 }
diff --git a/pkg/dartfix/test/src/options_test.dart b/pkg/dartfix/test/src/options_test.dart
index b1b2d44..b0b74d7 100644
--- a/pkg/dartfix/test/src/options_test.dart
+++ b/pkg/dartfix/test/src/options_test.dart
@@ -80,11 +80,11 @@
   });
 
   test('help explicit', () {
-    parse(['--help'], errorOut: 'Display this help message', showHelp: true);
+    parse(['--help'], normalOut: 'Display this help message', showHelp: true);
   });
 
   test('help implicit', () {
-    parse([], errorOut: 'Display this help message', showHelp: true);
+    parse([], normalOut: 'Display this help message', showHelp: true);
   });
 
   test('include fix', () {