clearDerivedData method

Future<XcodeCacheClearResult> clearDerivedData()

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