diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart index ab3c0bd4d14..fae08a94223 100644 --- a/packages/flutter_tools/lib/src/version.dart +++ b/packages/flutter_tools/lib/src/version.dart @@ -167,6 +167,20 @@ class FlutterVersion { 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( + ['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 41bf5682b97..331151d146b 100644 --- a/packages/flutter_tools/test/version_test.dart +++ b/packages/flutter_tools/test/version_test.dart @@ -26,11 +26,17 @@ final DateTime _stampOutOfDate = _testClock.agoBy(FlutterVersion.kCheckAgeConsid 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 @@ void main() { await version.checkFlutterVersionFreshness(); _expectVersionMessage(''); }); + + testUsingContext('versions comparison', () async { + when(mockProcessManager.runSync( + ['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( + ['git', 'merge-base', '--is-ancestor', 'abcdef', '123456'], + workingDirectory: any, + )); + }, + overrides: { + FlutterVersion: () => new FlutterVersion(_testClock), + ProcessManager: () => mockProcessManager, + }); }); group('$VersionCheckStamp', () {