calculateNextVersion method

Future<ProjectVersion> calculateNextVersion({
  1. required String projectPath,
  2. required VersionBumpMode mode,
  3. ReleaseType releaseType = ReleaseType.normal,
  4. String? explicitVersionName,
  5. int? explicitBuildNumber,
})

Calculates next version based on mode, releaseType, and optional explicit inputs.

Important rule: If releaseType is ReleaseType.shorebirdPatch, versioning is NOT performed.

Implementation

Future<ProjectVersion> calculateNextVersion({
  required String projectPath,
  required VersionBumpMode mode,
  ReleaseType releaseType = ReleaseType.normal,
  String? explicitVersionName,
  int? explicitBuildNumber,
}) async {
  final current = getCurrentVersion(projectPath);

  // Shorebird Patch targets existing releases and MUST NOT increment store version/build number
  if (releaseType == ReleaseType.shorebirdPatch) {
    return current;
  }

  if (mode == VersionBumpMode.none &&
      explicitVersionName == null &&
      explicitBuildNumber == null) {
    return current;
  }

  final int targetBuildNumber = await _buildNumberStrategy.resolveBuildNumber(
    projectPath: projectPath,
    currentVersion: current,
    explicitBuildNumber: explicitBuildNumber,
  );

  switch (mode) {
    case VersionBumpMode.patch:
      return current.bumpPatch(nextBuildNumber: targetBuildNumber);
    case VersionBumpMode.minor:
      return current.bumpMinor(nextBuildNumber: targetBuildNumber);
    case VersionBumpMode.major:
      return current.bumpMajor(nextBuildNumber: targetBuildNumber);
    case VersionBumpMode.explicit:
      if (explicitVersionName == null || explicitVersionName.isEmpty) {
        throw ArgumentError(
            'Explicit version name must be provided when mode is explicit.');
      }
      return current.withVersionName(explicitVersionName,
          newBuildNumber: targetBuildNumber);
    case VersionBumpMode.buildNumberOnly:
      return current.withBuildNumber(targetBuildNumber);
    case VersionBumpMode.none:
      if (explicitVersionName != null && explicitVersionName.isNotEmpty) {
        return current.withVersionName(explicitVersionName,
            newBuildNumber: targetBuildNumber);
      }
      return current.withBuildNumber(targetBuildNumber);
  }
}