run method

  1. @override
Future<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<void> run() async {
  final isDryRun = argResults?['dry-run'] == true;
  final steps = [
    ['learmond', 'fix'],
    ['learmond', 'analyze'],
    ['learmond', 'test'],
    ['learmond', 'format'],
    ['learmond', 'doctor'],
    ['learmond', 'license'],
    ['learmond', 'changelog'],
    ['learmond', 'push'],
  ];

  for (final step in steps) {
    final process = await Process.start(step[0], step.sublist(1));
    stdout.addStream(process.stdout);
    stderr.addStream(process.stderr);
    final exitCode = await process.exitCode;
    if (exitCode != 0) {
      stderr.writeln(
        'Error: command "${step.join(' ')}" failed with exit code $exitCode.',
      );
      exit(exitCode);
    }
  }

  if (isDryRun) {
    stdout.write('Dry run successful. Do you want to publish now? (yes/no) ');
    // Read user input interactively.
    String? answer = stdin.readLineSync();
    if (answer == null || answer.trim().toLowerCase() != 'yes') {
      stdout.writeln('Exiting without publishing.');
      return;
    }
  }

  // Detect project type
  final isFlutterOrDart = await _isFlutterOrDartProject();
  final isNpm = await _isNpmProject();
  final isRuby = await _isRubyProject();

  if (isFlutterOrDart) {
    final process = await Process.start('flutter', [
      'pub',
      'publish',
    ], mode: ProcessStartMode.inheritStdio);

    final exitCode = await process.exitCode;
    if (exitCode != 0) {
      stderr.writeln(
        'Error: flutter pub publish failed with exit code $exitCode.',
      );
      exit(exitCode);
    }
  } else if (isNpm) {
    final process = await Process.start('npm', ['publish']);
    stdout.addStream(process.stdout);
    stderr.addStream(process.stderr);
    final exitCode = await process.exitCode;
    if (exitCode != 0) {
      stderr.writeln('Error: npm publish failed with exit code $exitCode.');
      exit(exitCode);
    }
  } else if (isRuby) {
    final gemspec = await _findGemspec();
    if (gemspec == null) {
      stderr.writeln('Error: No gemspec file found for Ruby project.');
      exit(1);
    }
    final process = await Process.start('gem', ['push', gemspec]);
    stdout.addStream(process.stdout);
    stderr.addStream(process.stderr);
    final exitCode = await process.exitCode;
    if (exitCode != 0) {
      stderr.writeln('Error: gem push failed with exit code $exitCode.');
      exit(exitCode);
    }
  } else {
    stderr.writeln('Error: Could not detect project type for publishing.');
    exit(1);
  }
}