install method

Future<InstallationResult> install({
  1. required String packageName,
  2. String? version,
})

Implementation

Future<InstallationResult> install({
  required String packageName,
  String? version,
}) async {
  final dryRunResult = await checkCompatibilityOnly(
    packageName: packageName,
    version: version,
  );

  if (!dryRunResult.isCompatible) {
    return InstallationResult(
      installSuccessful: false,
      packageName: packageName,
      version: version,
      warnings: dryRunResult.warnings,
      errorMessage: dryRunResult.errorMessage,
    );
  }

  final backupPath = await _backupPubspec();
  if (backupPath == null) {
    return InstallationResult(
      installSuccessful: false,
      packageName: packageName,
      errorMessage: 'Failed to create backup of pubspec.yaml',
    );
  }

  try {
    final installResult = await processRunner.pubAdd(
      packageName,
      version: version,
    );

    if (!installResult.success) {
      await _restorePubspec(backupPath);

      return InstallationResult(
        installSuccessful: false,
        packageName: packageName,
        version: version,
        warnings: _extractWarnings(installResult.stdout),
        errorMessage: _extractError(installResult.stderr),
      );
    }

    final verifyResult = await processRunner.pubGet();

    if (!verifyResult.success) {
      await _restorePubspec(backupPath);

      return InstallationResult(
        installSuccessful: false,
        packageName: packageName,
        version: version,
        errorMessage: 'Installation verification failed',
        warnings: _extractWarnings(verifyResult.stderr),
      );
    }

    final resolvedVersions = await _getResolvedVersions();
    await _deleteBackup(backupPath);

    return InstallationResult(
      installSuccessful: true,
      packageName: packageName,
      version: version,
      resolvedVersions: resolvedVersions,
      warnings: _extractWarnings(installResult.stdout),
    );
  } catch (e) {
    await _restorePubspec(backupPath);

    return InstallationResult(
      installSuccessful: false,
      packageName: packageName,
      version: version,
      errorMessage: 'Unexpected error: $e',
    );
  }
}