calculateNextVersion method
Future<ProjectVersion>
calculateNextVersion({
- required String projectPath,
- required VersionBumpMode mode,
- ReleaseType releaseType = ReleaseType.normal,
- String? explicitVersionName,
- 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);
}
}