@@ -16,33 +16,12 @@ class FlutterVersion extends SemanticVersion {
1616 @required this .engineRevision,
1717 @required this .dartSdkVersion,
1818 }) {
19- // Flutter versions are expected in the format '2.3.1-16.1-pre', so we split
20- // on the dash char to separate the main semantic version from the pre
21- // release version.
22- final splitOnDash = version.split ('-' );
23- assert (splitOnDash.length <= 2 );
24-
25- final semVersion = splitOnDash.first;
26- final _versionParts = semVersion.split ('.' );
27- major =
28- _versionParts.isNotEmpty ? int .tryParse (_versionParts.first) ?? 0 : 0 ;
29- minor = _versionParts.length > 1 ? int .tryParse (_versionParts[1 ]) ?? 0 : 0 ;
30- patch = _versionParts.length > 2 ? int .tryParse (_versionParts[2 ]) ?? 0 : 0 ;
31-
32- if (splitOnDash.length == 2 ) {
33- final preRelease = splitOnDash.last;
34- final preReleaseParts = preRelease
35- .split ('.' )
36- .map ((part) => RegExp (r'\d+' ).stringMatch (part) ?? '' )
37- .toList ()
38- ..removeWhere ((part) => part.isEmpty);
39- preReleaseMajor = preReleaseParts.isNotEmpty
40- ? int .tryParse (preReleaseParts.first) ?? 0
41- : 0 ;
42- preReleaseMinor = preReleaseParts.length > 1
43- ? int .tryParse (preReleaseParts[1 ]) ?? 0
44- : 0 ;
45- }
19+ final semVer = SemanticVersion .parse (version);
20+ major = semVer.major;
21+ minor = semVer.minor;
22+ patch = semVer.patch;
23+ preReleaseMajor = semVer.preReleaseMajor;
24+ preReleaseMinor = semVer.preReleaseMinor;
4625 }
4726
4827 factory FlutterVersion .parse (Map <String , dynamic > json) {
@@ -53,7 +32,7 @@ class FlutterVersion extends SemanticVersion {
5332 frameworkRevision: json['frameworkRevisionShort' ],
5433 frameworkCommitDate: json['frameworkCommitDate' ],
5534 engineRevision: json['engineRevisionShort' ],
56- dartSdkVersion: json['dartSdkVersion' ],
35+ dartSdkVersion: _parseDartVersion ( json['dartSdkVersion' ]) ,
5736 );
5837 }
5938
@@ -69,7 +48,7 @@ class FlutterVersion extends SemanticVersion {
6948
7049 final String engineRevision;
7150
72- final String dartSdkVersion;
51+ final SemanticVersion dartSdkVersion;
7352
7453 String get flutterVersionSummary => [
7554 if (version != 'unknown' ) version,
@@ -103,6 +82,19 @@ class FlutterVersion extends SemanticVersion {
10382 engineRevision,
10483 dartSdkVersion,
10584 );
85+
86+ static SemanticVersion _parseDartVersion (String versionString) {
87+ if (versionString == null ) return null ;
88+
89+ // Example Dart version string: "2.15.0 (build 2.15.0-178.1.beta)"
90+ const prefix = '(build ' ;
91+ final startIndex = versionString.indexOf (prefix) + prefix.length;
92+ final rawVersion = versionString.substring (
93+ startIndex,
94+ versionString.length - 1 ,
95+ );
96+ return SemanticVersion .parse (rawVersion);
97+ }
10698}
10799
108100class SemanticVersion with CompareMixin {
@@ -114,6 +106,54 @@ class SemanticVersion with CompareMixin {
114106 this .preReleaseMinor,
115107 });
116108
109+ factory SemanticVersion .parse (String versionString) {
110+ // [versionString] is expected to be of the form for VM.version, Dart, and
111+ // Flutter, respectively:
112+ // 2.15.0-233.0.dev (dev) (Mon Oct 18 14:06:26 2021 -0700) on "ios_x64"
113+ // 2.15.0-178.1.beta
114+ // 2.6.0-12.0.pre.443
115+ //
116+ // So split on the spaces to the version, and then on the dash char to
117+ // separate the main semantic version from the pre release version.
118+ final splitOnSpaces = versionString.split (' ' );
119+ final version = splitOnSpaces.first;
120+ final splitOnDash = version.split ('-' );
121+ assert (splitOnDash.length <= 2 , 'version: $version ' );
122+
123+ final semVersion = splitOnDash.first;
124+ final _versionParts = semVersion.split ('.' );
125+ final major =
126+ _versionParts.isNotEmpty ? int .tryParse (_versionParts.first) ?? 0 : 0 ;
127+ final minor =
128+ _versionParts.length > 1 ? int .tryParse (_versionParts[1 ]) ?? 0 : 0 ;
129+ final patch =
130+ _versionParts.length > 2 ? int .tryParse (_versionParts[2 ]) ?? 0 : 0 ;
131+
132+ int preReleaseMajor;
133+ int preReleaseMinor;
134+ if (splitOnDash.length == 2 ) {
135+ final preRelease = splitOnDash.last;
136+ final preReleaseParts = preRelease
137+ .split ('.' )
138+ .map ((part) => RegExp (r'\d+' ).stringMatch (part) ?? '' )
139+ .toList ()
140+ ..removeWhere ((part) => part.isEmpty);
141+ preReleaseMajor = preReleaseParts.isNotEmpty
142+ ? int .tryParse (preReleaseParts.first) ?? 0
143+ : 0 ;
144+ preReleaseMinor = preReleaseParts.length > 1
145+ ? int .tryParse (preReleaseParts[1 ]) ?? 0
146+ : 0 ;
147+ }
148+ return SemanticVersion (
149+ major: major,
150+ minor: minor,
151+ patch: patch,
152+ preReleaseMajor: preReleaseMajor,
153+ preReleaseMinor: preReleaseMinor,
154+ );
155+ }
156+
117157 int major;
118158
119159 int minor;
@@ -134,8 +174,8 @@ class SemanticVersion with CompareMixin {
134174 if (major == other.major &&
135175 minor == other.minor &&
136176 patch == other.patch &&
137- preReleaseMajor == other.preReleaseMajor &&
138- preReleaseMinor == other.preReleaseMinor) {
177+ ( preReleaseMajor ?? 0 ) == ( other.preReleaseMajor ?? 0 ) &&
178+ ( preReleaseMinor ?? 0 ) == ( other.preReleaseMinor ?? 0 ) ) {
139179 return 0 ;
140180 }
141181 if (major > other.major ||
@@ -145,7 +185,7 @@ class SemanticVersion with CompareMixin {
145185 }
146186 if (major == other.major && minor == other.minor && patch == other.patch) {
147187 if (isPreRelease != other.isPreRelease) {
148- return isPreRelease ? 1 : - 1 ;
188+ return isPreRelease ? - 1 : 1 ;
149189 }
150190 if (preReleaseMajor > other.preReleaseMajor ||
151191 (preReleaseMajor == other.preReleaseMajor &&
0 commit comments