clearDerivedData method
Deletes Derived Data and recreates an empty directory.
When the folder is already missing, returns success with a soft message.
Implementation
Future<XcodeCacheClearResult> clearDerivedData() async {
if (!Platform.isMacOS) {
return const XcodeCacheClearResult(
success: false,
message: 'Xcode Derived Data is only available on macOS',
);
}
final path = derivedDataPath;
if (path == null) {
return const XcodeCacheClearResult(
success: false,
message:
'Home directory is unavailable (set HOME or pass homeDirectory)',
);
}
final sizeBefore = await getDerivedDataSizeBytes();
try {
final rm = await _exec.run('rm', arguments: ['-rf', path]);
if (!rm.success) {
final detail = rm.stderr.trim().isNotEmpty
? rm.stderr.trim()
: 'rm failed (exit ${rm.exitCode})';
return XcodeCacheClearResult(
success: false,
message: 'Failed to clear Derived Data: $detail',
freedBytes: sizeBefore,
);
}
final mkdir = await _exec.run('mkdir', arguments: ['-p', path]);
if (!mkdir.success) {
final detail = mkdir.stderr.trim().isNotEmpty
? mkdir.stderr.trim()
: 'mkdir failed (exit ${mkdir.exitCode})';
return XcodeCacheClearResult(
success: false,
message:
'Derived Data was removed but the folder could not be recreated: $detail',
freedBytes: sizeBefore,
);
}
if (sizeBefore == null || sizeBefore == 0) {
return const XcodeCacheClearResult(
success: true,
message: 'Derived Data was already empty or missing',
freedBytes: 0,
);
}
return XcodeCacheClearResult(
success: true,
message: 'Cleared ${sizeBefore.formatBytes} of Derived Data',
freedBytes: sizeBefore,
);
} catch (e) {
return XcodeCacheClearResult(
success: false,
message: 'Failed to clear Derived Data: $e',
freedBytes: sizeBefore,
);
}
}