runCommand method
Implementation
@override
Future<int> runCommand() async {
final dryRun = argResults!['dry-run'] == true;
final assumeYes = argResults!['yes'] == true;
final interactive = argResults!['interactive'] == true;
if (interactive) {
final menu = InteractiveCleanMenu(context: context, dryRun: dryRun);
return menu.run();
}
final root = p.normalize(p.absolute(argResults!['path'] as String));
final include = (argResults!['include'] as List<String>).toSet();
final config = await context.config.load();
final service = CleaningService(
cleaners: [
FlutterProjectCleaner(root: root, fileSystem: context.fileSystem),
if (include.isEmpty || include.contains('android'))
AndroidCleaner(platform: context.platform, config: config),
if (include.isEmpty || include.contains('apple'))
AppleCleaner(platform: context.platform, config: config),
if (include.isEmpty || include.contains('system'))
SystemCleaner(platform: context.platform, config: config),
],
targetCleaner: TargetCleaner(
fileSystem: context.fileSystem,
process: context.process,
),
);
var targets = await context.terminal.withSpinner(
'Discovering cleanup targets',
service.discoverTargets,
);
targets = _filterTargets(targets, include);
if (targets.isEmpty) {
logger.info('No cleanup targets found.');
return CleanerExitCode.success.code;
}
logger.info(dryRun ? 'Dry run cleanup plan:' : 'Cleanup plan:');
for (final target in targets) {
final size = await context.fileSystem.sizeOf(target.path);
logger.info(' ${target.label}: ${formatBytes(size)}');
logger.detail(' ${target.path}');
}
if (!dryRun &&
!context.terminal.confirm(
'Delete ${targets.length} cleanup targets?',
defaultValue: false,
assumeYes: assumeYes,
)) {
logger.warn('Cleanup cancelled.', tag: 'CLEAN');
return CleanerExitCode.success.code;
}
final summary = await context.terminal.withSpinner(
dryRun ? 'Calculating reclaimable space' : 'Cleaning selected targets',
() => service.cleanTargets(targets, dryRun: dryRun),
);
_printSummary(summary, dryRun: dryRun);
return CleanerExitCode.success.code;
}