verifyRelease method

Future<String> verifyRelease(
  1. String projectPath
)

Verifies artifact and release state integrity without mutating project state.

Implementation

Future<String> verifyRelease(String projectPath) async {
  final buffer = StringBuffer();
  buffer.writeln('=== RELEASE INTEGRITY VERIFICATION ===');

  final metadata = await _metadataManager.getLatestMetadata(projectPath);
  if (metadata == null) {
    buffer.writeln(
        'Status: ✗ No release manifest found in .flutter_setup/releases/');
    buffer.writeln('======================================');
    return buffer.toString();
  }

  buffer.writeln(
      'Release: ${metadata.versionName}+${metadata.buildNumber} (${metadata.releaseMode})');
  buffer.writeln('Timestamp: ${metadata.timestamp}');

  // Verify Artifacts
  if (metadata.artifacts.isNotEmpty) {
    buffer.writeln('\nArtifact Verification:');
    for (final entry in metadata.artifacts.entries) {
      final artifactValid =
          await _artifactIntegrity.verifyArtifact(artifactPath: entry.value);
      if (artifactValid) {
        final hash = await _artifactIntegrity.computeSha256(entry.value);
        buffer.writeln('  ✓ ${entry.key}: Valid (${entry.value})');
        buffer.writeln('    SHA-256: $hash');
      } else {
        buffer.writeln(
            '  ✗ ${entry.key}: Missing or corrupt at "${entry.value}"');
      }
    }
  }

  // Verify Git Tag
  if (metadata.tag != null) {
    final isRepo = await _gitClient.isGitRepository(projectPath);
    if (isRepo) {
      final tagExists =
          await _gitClient.tagExists(projectPath, metadata.tag!);
      if (tagExists) {
        buffer.writeln('\nGit Tag: ✓ ${metadata.tag} verified in repository');
      } else {
        buffer.writeln(
            '\nGit Tag: ✗ ${metadata.tag} missing from repository tags');
      }
    }
  }

  buffer.writeln('\nStatus: Verification completed cleanly.');
  buffer.writeln('======================================');
  return buffer.toString();
}