cleanProject method

Future<CleanResult> cleanProject(
  1. ProjectInfo project
)

Cleans cache targets from a project. Returns a CleanResult with deleted paths and errors.

Implementation

Future<CleanResult> cleanProject(ProjectInfo project) async {
  verboseLogger?.call('Cleaning project: ${project.path}');
  verboseLogger?.call('  Targets: ${project.targets.length}');

  final deletedPaths = <String>[];
  final failedPaths = <String, String>{};
  int reclaimedSize = 0;

  for (int i = 0; i < project.targets.length; i++) {
    final target = project.targets[i];
    verboseLogger?.call('  [$i/${project.targets.length}] ${target.type}: ${target.path}');

    // Validate deletion safety
    final validationError =
        SafetyUtils.validateDeletion(target, project.path);
    if (validationError != null) {
      verboseLogger?.call('    ❌ Validation failed: $validationError');
      failedPaths[target.path] = validationError;
      continue;
    }

    // Attempt deletion
    final deleteStart = DateTime.now();
    final success = await _deleteTarget(target);
    final deleteTime = DateTime.now().difference(deleteStart);

    if (success) {
      deletedPaths.add(target.path);
      reclaimedSize += target.size;
      verboseLogger?.call('    ✅ Deleted (${_formatSize(target.size)}) in ${deleteTime.inMilliseconds}ms');
    } else {
      verboseLogger?.call('    ❌ Failed to delete');
      failedPaths[target.path] = 'Failed to delete';
    }
  }

  verboseLogger?.call('  Project complete: ${deletedPaths.length} deleted, ${failedPaths.length} failed, ${_formatSize(reclaimedSize)} reclaimed');

  return CleanResult(
    deletedPaths: deletedPaths,
    failedPaths: failedPaths,
    reclaimedSize: reclaimedSize,
  );
}