run method

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

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<int> run() async {
  try {
    final project = await _projectService.getProjectInfo();
    final version = await _versionService.getVersionInfo();
    final env = await _environmentService.detectEnvironment(argResults);
    final counter = await _buildCounterService.peekNextBuildNumber(env.name);

    String template = '{project}_{date}_{env}_{counter}';
    String outputDir = 'release';

    // Load config if exists
    final configFile = File('flutter_build_manager.yaml');
    if (configFile.existsSync()) {
      try {
        final doc = loadYaml(configFile.readAsStringSync());
        if (doc is YamlMap && doc['release_manager'] is YamlMap) {
          final rm = doc['release_manager'];
          if (rm['template'] != null) template = rm['template'];
          if (rm['output_directory'] != null) outputDir = rm['output_directory'];

          // Generate organized path if needed
          if (rm['organize_by'] is YamlMap) {
            final org = rm['organize_by'];
            final now = DateTime.now();
            String orgPath = '';
            if (org['year'] == true) orgPath += '${DateFormat('yyyy').format(now)}/';
            if (org['month'] == true) orgPath += '${DateFormat('MMMM').format(now)}/';
            if (org['environment'] == true) orgPath += '${env.name}/';

            if (orgPath.isNotEmpty) {
              outputDir = '$outputDir/$orgPath';
            }
          }
        }
      } catch (_) {
        // ignore yaml parse errors for preview fallback
      }
    }

    final variables = TemplateVariables(
      project: project.name,
      version: version.version,
      flutterBuild: version.buildNumber,
      counter: counter,
      env: env.name,
    );

    final filename = _filenameTemplateService.generateFilename(template, variables);

    // Clean up output dir slashes for display
    outputDir = outputDir.replaceAll('//', '/');
    if (!outputDir.endsWith('/')) {
      outputDir += '/';
    }

    _logger.info('--------------------------------------\n');
    _logger.info('Project : ${project.name}\n');
    _logger.info('Version : ${version.version}\n');
    _logger.info('Environment : ${env.name}\n');
    _logger.info('Counter : $counter\n');
    _logger.info('Filename :\n$filename.apk\n'); // Assuming .apk for preview example
    _logger.info('Output :\n$outputDir\n');
    _logger.info('--------------------------------------');

    return 0;
  } on ReleaseManagerException catch (e) {
    _logger.err(e.message);
    if (e.details != null) _logger.info(e.details.toString());
    return 1;
  } catch (e) {
    _logger.err('An unexpected error occurred during preview: $e');
    return 1;
  }
}