execute method
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;
}