execute method
Executes the clean command, removing build artifacts from all packages.
Returns a Future that completes when the cleaning is done. Exits with code 1 if the target directory doesn't exist or isn't a valid project.
Implementation
Future<void> execute() async {
Logger.header('Clean Maloc Project');
// Determine target directory
final target = targetPath ?? Directory.current.path;
final targetDir = Directory(target);
if (!targetDir.existsSync()) {
Logger.error('Directory does not exist: $target');
exit(1);
}
// Check if it's a valid project
final packagesDir = Directory('${targetDir.path}/packages');
if (!packagesDir.existsSync()) {
Logger.error(
'Not a valid Maloc project. "packages" directory not found.');
Logger.info('Make sure you are in the project root directory.');
exit(1);
}
Logger.step('Cleaning all packages...');
print('');
try {
var successCount = 0;
var failCount = 0;
var totalSize = 0;
// Clean packages directory
await for (var entity in packagesDir.list()) {
if (entity is Directory) {
final pubspecFile = File('${entity.path}/pubspec.yaml');
if (await pubspecFile.exists()) {
final packageName = entity.path.split(Platform.pathSeparator).last;
stdout.write(' ▸ $packageName... ');
final size = await _cleanPackage(entity.path);
if (size >= 0) {
print('${Logger.green}✓${Logger.reset} (${_formatSize(size)})');
successCount++;
totalSize += size;
} else {
print('${Logger.red}✗${Logger.reset}');
failCount++;
}
}
}
}
// Clean CLI directory if exists
final cliDir = Directory('${targetDir.path}/cli');
final cliPubspec = File('${targetDir.path}/cli/pubspec.yaml');
if (await cliDir.exists() && await cliPubspec.exists()) {
stdout.write(' ▸ cli... ');
final size = await _cleanPackage(cliDir.path);
if (size >= 0) {
print('${Logger.green}✓${Logger.reset} (${_formatSize(size)})');
successCount++;
totalSize += size;
} else {
print('${Logger.red}✗${Logger.reset}');
failCount++;
}
}
// Clean root level cache
await _cleanRootCache(targetDir.path);
print('');
if (failCount == 0) {
Logger.success(
'All packages cleaned successfully! ($successCount packages, ${_formatSize(totalSize)} freed)');
} else {
Logger.warning(
'Cleaned with errors: $successCount succeeded, $failCount failed');
exit(1);
}
} catch (e) {
Logger.error('Error during clean: $e');
exit(1);
}
}