calculateNextVersion function

Future<String> calculateNextVersion(
  1. Version version,
  2. ApiChangeMagnitude highestMagnitudeChange,
  3. bool isPreRelease,
  4. Directory gitRoot,
  5. String tagPrefix,
  6. String preReleasePrefix,
)

Implementation

Future<String> calculateNextVersion(
  Version version,
  ApiChangeMagnitude highestMagnitudeChange,
  bool isPreRelease,
  Directory gitRoot,
  String tagPrefix,
  String preReleasePrefix,
) async {
  logger.info('Current version: $version');

  switch (highestMagnitudeChange) {
    case ApiChangeMagnitude.major:
      logger.info('Incrementing major version');
      version = version.nextMajor;
      break;
    case ApiChangeMagnitude.minor:
      logger.info('Incrementing minor version');
      version = version.nextMinor;
      break;
    case ApiChangeMagnitude.patch:
      logger.info('Incrementing patch version');
      version = version.nextPatch;
      break;
    case ApiChangeMagnitude.ignore:
      logger.info('No version increment for ignore magnitude');
      break;
  }

  final newVersion = version.toString();

  logger.info('New version: $newVersion');

  if (isPreRelease) {
    final normalizedPrefix = preReleasePrefix.trim();
    final separator = normalizedPrefix.isEmpty || normalizedPrefix.endsWith('.') ? '' : '.';
    String buildPreReleaseSuffix(int number) {
      if (normalizedPrefix.isEmpty) {
        return '$number';
      }
      return '$normalizedPrefix$separator$number';
    }

    var preReleaseNum = 1;
    while (await GitUtils.gitTagExists('$tagPrefix$newVersion-${buildPreReleaseSuffix(preReleaseNum)}', gitRoot.path)) {
      preReleaseNum++;
    }
    final preReleaseVersion = '$newVersion-${buildPreReleaseSuffix(preReleaseNum)}';
    logger.info('Pre-release version: $preReleaseVersion');
    return preReleaseVersion;
  } else if (await GitUtils.gitTagExists('$tagPrefix$newVersion', gitRoot.path)) {
    logger.err('Version tag $tagPrefix$newVersion already exists');
    throw Exception('Version tag $tagPrefix$newVersion already exists');
  }

  return newVersion;
}