cleanProject method
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,
);
}