execute method

  1. @override
Future<int> execute(
  1. List<String> arguments
)
override

Executes the command with the provided arguments. Returns an integer exit code (0 for success).

Implementation

@override
Future<int> execute(List<String> arguments) async {
  final ArgResults results;
  try {
    results = _argParser.parse(arguments);
  } on FormatException catch (e) {
    throw ValidationException(
      'Error: ${e.message}\n\nUsage:\n  flutter_setup release-summary [--path p] [--format text|json]',
    );
  }

  final targetPath = results['path'] as String? ?? '.';
  Validators.validateExistingFlutterProject(Directory(targetPath));

  final formatRaw = results['format'] as String? ?? 'text';
  final asJson = formatRaw == 'json';

  final metadata = await _metadataManager.getLatestMetadata(targetPath);
  if (metadata == null) {
    _output.info('No release metadata found in .flutter_setup/releases/.');
    return 0;
  }

  final commitRange = await _gitClient.getCommitRange(
    targetPath,
    fromTag: metadata.previousTag ?? metadata.tag,
  );
  final classified = _classifier.classify(commitRange.commits);
  final categoryCounts = <String, int>{};
  for (final c in classified) {
    categoryCounts[c.category.displayName] =
        (categoryCounts[c.category.displayName] ?? 0) + 1;
  }

  Map<String, dynamic>? patchDetails;
  if (metadata.releaseMode == 'shorebird_patch' ||
      metadata.releaseMode == 'patch') {
    final patchAnalysis = await _patchAnalyzer.analyze(targetPath);
    final totalFiles = patchAnalysis.categorizedFiles.values
        .fold<int>(0, (acc, list) => acc + list.length);
    final hasNative = (patchAnalysis
                .categorizedFiles[PatchChangeCategory.nativeAndroid]
                ?.isNotEmpty ??
            false) ||
        (patchAnalysis.categorizedFiles[PatchChangeCategory.nativeIos]
                ?.isNotEmpty ??
            false);
    final hasDep = patchAnalysis
            .categorizedFiles[PatchChangeCategory.dependencies]?.isNotEmpty ??
        false;

    patchDetails = {
      'targetRelease': metadata.versionName,
      'patchEligibility':
          patchAnalysis.isEligible ? 'Eligible' : 'Ineligible',
      'changedFilesCount': totalFiles,
      'hasNativeChanges': hasNative,
      'hasDependencyChanges': hasDep,
      'explanation': patchAnalysis.explanation,
    };
  }

  final summary = _summaryGenerator.fromMetadata(
    metadata,
    commitCount: commitRange.commits.length,
    hasBreakingChanges: classified.any((c) => c.isBreaking),
    categoryCounts: categoryCounts,
    shorebirdPatchDetails: patchDetails,
  );

  _output.info(_summaryGenerator.render(summary, asJson: asJson));
  return 0;
}