SemanticVersion.parse constructor

SemanticVersion.parse(
  1. String? versionString
)

Implementation

factory SemanticVersion.parse(String? versionString) {
  if (versionString == null) return SemanticVersion();

  // Remove any build metadata, denoted by a '+' character and whatever
  // follows.
  final buildMetadataIndex = versionString.indexOf('+');
  if (buildMetadataIndex != -1) {
    versionString = versionString.substring(0, buildMetadataIndex);
  }

  // [versionString] is expected to be of the form for VM.version, Dart, and
  // Flutter, respectively:
  // 2.15.0-233.0.dev (dev) (Mon Oct 18 14:06:26 2021 -0700) on "ios_x64"
  // 2.15.0-178.1.beta
  // 2.6.0-12.0.pre.443
  //
  // So split on the spaces to the version, and then on the dash char to
  // separate the main semantic version from the pre release version.
  final splitOnSpaces = versionString.split(' ');
  final version = splitOnSpaces.first;
  final splitOnDash = version.split('-');
  assert(splitOnDash.length <= 2, 'version: $version');

  final semVersion = splitOnDash.first;
  final versionParts = semVersion.split('.');
  final major =
      versionParts.isNotEmpty ? int.tryParse(versionParts.first) ?? 0 : 0;
  final minor =
      versionParts.length > 1 ? int.tryParse(versionParts[1]) ?? 0 : 0;
  final patch =
      versionParts.length > 2 ? int.tryParse(versionParts[2]) ?? 0 : 0;

  int? preReleaseMajor;
  int? preReleaseMinor;
  if (splitOnDash.length == 2) {
    final preRelease = splitOnDash.last;
    final preReleaseParts = preRelease
        .split('.')
        .map((part) => RegExp(r'\d+').stringMatch(part) ?? '')
        .toList()
      ..removeWhere((part) => part.isEmpty);
    preReleaseMajor = preReleaseParts.isNotEmpty
        ? int.tryParse(preReleaseParts.first) ?? 0
        : 0;
    preReleaseMinor = preReleaseParts.length > 1
        ? int.tryParse(preReleaseParts[1]) ?? 0
        : 0;
  }
  return SemanticVersion(
    major: major,
    minor: minor,
    patch: patch,
    preReleaseMajor: preReleaseMajor,
    preReleaseMinor: preReleaseMinor,
  );
}