Add a Flutter version comparison function (#12959) * add git version comparison function * use [] in dartdoc * Make method instance method
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart index ab3c0bd..fae08a9 100644 --- a/packages/flutter_tools/lib/src/version.dart +++ b/packages/flutter_tools/lib/src/version.dart
@@ -167,6 +167,20 @@ return _branch; } + /// Returns true if `tentativeDescendantRevision` is a direct descendant to + /// the `tentativeAncestorRevision` revision on the Flutter framework repo + /// tree. + bool checkRevisionAncestry({ + String tentativeDescendantRevision, + String tentativeAncestorRevision, + }) { + final ProcessResult result = processManager.runSync( + <String>['git', 'merge-base', '--is-ancestor', tentativeAncestorRevision, tentativeDescendantRevision], + workingDirectory: Cache.flutterRoot, + ); + return result.exitCode == 0; + } + /// The amount of time we wait before pinging the server to check for the /// availability of a newer version of Flutter. @visibleForTesting
diff --git a/packages/flutter_tools/test/version_test.dart b/packages/flutter_tools/test/version_test.dart index 41bf568..331151d 100644 --- a/packages/flutter_tools/test/version_test.dart +++ b/packages/flutter_tools/test/version_test.dart
@@ -26,11 +26,17 @@ void main() { group('$FlutterVersion', () { + ProcessManager mockProcessManager; + setUpAll(() { Cache.disableLocking(); FlutterVersion.kPauseToLetUserReadTheMessage = Duration.ZERO; }); + setUp(() { + mockProcessManager = new MockProcessManager(); + }); + testFlutterVersion('prints nothing when Flutter installation looks fresh', () async { fakeData(localCommitDate: _upToDateVersion); await FlutterVersion.instance.checkFlutterVersionFreshness(); @@ -143,6 +149,30 @@ await version.checkFlutterVersionFreshness(); _expectVersionMessage(''); }); + + testUsingContext('versions comparison', () async { + when(mockProcessManager.runSync( + <String>['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'], + workingDirectory: any, + )).thenReturn(new ProcessResult(1, 0, '', '')); + + expect( + FlutterVersion.instance.checkRevisionAncestry( + tentativeDescendantRevision: '123456', + tentativeAncestorRevision: 'abcdef', + ), + true + ); + + verify(mockProcessManager.runSync( + <String>['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'], + workingDirectory: any, + )); + }, + overrides: <Type, Generator>{ + FlutterVersion: () => new FlutterVersion(_testClock), + ProcessManager: () => mockProcessManager, + }); }); group('$VersionCheckStamp', () {