createBackup method

Future<String?> createBackup(
  1. List<String> filesToBackup,
  2. String operationName
)

Implementation

Future<String?> createBackup(
  List<String> filesToBackup,
  String operationName,
) async {
  if (!context.config.backupEnabled) return null;

  final backupsDir = Directory(
    p.join(context.directory, '.flutter_doctor_pro', 'backups'),
  );
  if (!backupsDir.existsSync()) {
    backupsDir.createSync(recursive: true);
  }

  final timestamp = DateTime.now().millisecondsSinceEpoch;
  final backupId =
      'backup_${timestamp}_${operationName.replaceAll(" ", "_")}';
  final currentBackupDir = Directory(p.join(backupsDir.path, backupId));
  currentBackupDir.createSync();

  final manifest = <String, String>{}; // originalPath -> backupPath
  final checksums = <String, String>{}; // originalPath -> hash

  for (final relativePath in filesToBackup) {
    final file = File(p.join(context.directory, relativePath));
    if (file.existsSync()) {
      final backupFile = File(
        p.join(currentBackupDir.path, 'files', relativePath),
      );
      backupFile.parent.createSync(recursive: true);
      file.copySync(backupFile.path);

      manifest[relativePath] = p.join('files', relativePath);
      final bytes = file.readAsBytesSync();
      checksums[relativePath] = sha256.convert(bytes).toString();
    }
  }

  // Git commit hash
  String gitCommit = 'unknown';
  try {
    final gitResult = Process.runSync('git', [
      'rev-parse',
      'HEAD',
    ], workingDirectory: context.directory);
    if (gitResult.exitCode == 0) {
      gitCommit = gitResult.stdout.toString().trim();
    }
  } catch (_) {}

  final metadata = {
    'id': backupId,
    'timestamp': timestamp,
    'operation': operationName,
    'package_version': '2.0.0', // flutter_doctor_pro version
    'git_commit': gitCommit,
    'checksums': checksums,
  };

  File(
    p.join(currentBackupDir.path, 'metadata.json'),
  ).writeAsStringSync(jsonEncode(metadata));

  File(
    p.join(currentBackupDir.path, 'manifest.json'),
  ).writeAsStringSync(jsonEncode(manifest));

  _cleanupOldBackups(backupsDir);

  context.logger.info('Backup created: $backupId');
  return backupId;
}