SemanticVersion.parse constructor
SemanticVersion.parse(
- 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,
);
}