execute method

  1. @override
Future<int> execute(
  1. List<String> arguments
)
override

Executes the command with the provided arguments. Returns an integer exit code (0 for success).

Implementation

@override
Future<int> execute(List<String> arguments) async {
  final ArgResults results;
  try {
    results = _argParser.parse(arguments);
  } on FormatException catch (e) {
    throw ValidationException(
      'Error: ${e.message}\n\nUsage:\n  flutter_setup deploy [--platform android|ios|all] [--artifact <path>] [--lane <lane>] [--dry-run]',
    );
  }

  final targetPath = results['path'] as String? ?? '.';
  final dryRun = results['dry-run'] as bool? ?? false;
  final retry = results['retry'] as bool? ?? false;

  if (retry) {
    final recoveryManager = _recoveryManager ??
        ReleaseRecoveryManager(output: _output, deploymentManager: _manager);
    final success = await recoveryManager.recoverRelease(targetPath,
        stage: 'deployment', dryRun: dryRun);
    return success ? 0 : 1;
  }

  final platformRaw = results['platform'] as String? ?? 'android';
  final artifactPath = results['artifact'] as String?;
  final lane = results['lane'] as String?;

  final envArg =
      results['environment'] as String? ?? results['env'] as String?;
  final resolver = const EnvironmentResolver();
  final envConfig = resolver.resolve(
    cliEnvironment: envArg,
    cliFlavor: results['flavor'] as String?,
    envVars: Platform.environment,
  );

  Validators.validateExistingFlutterProject(Directory(targetPath));

  final platform = BuildPlatform.parse(platformRaw);
  final context = DeploymentContext(
    projectPath: targetPath,
    platform: platform,
    artifactPath: artifactPath,
    lane: lane ?? envConfig.lane,
    flavor: envConfig.flavor,
    dryRun: dryRun,
  );

  final deployResults = await _manager.deploy(context);
  final allSuccessful = deployResults.every((r) => r.success);

  for (final res in deployResults) {
    if (dryRun) {
      _output.info('--- DRY RUN DEPLOYMENT PREVIEW ---');
      _output.info('Platform:        ${res.platform.name}');
      _output.info('Artifact:        ${res.artifactPath ?? 'Auto-discover'}');
      _output.info('Lane:            ${res.lane}');
      if (res.commandString != null) {
        _output.info('Command Preview: ${res.commandString}');
      }
      _output.info('----------------------------------');
    } else if (res.success) {
      _output.success(res.message);
    }

    for (final step in res.executedSteps) {
      _output.info('  • $step');
    }

    for (final warning in res.warnings) {
      _output.warning('Warning: $warning');
    }

    if (!res.success) {
      for (final error in res.errors) {
        _output.error('Error: $error');
      }
    }
  }

  return allSuccessful ? 0 : 1;
}