runCommand method

  1. @override
Future<int> runCommand()
override

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