Improve flutter test startup time (#29404)
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart index e1b9923..3df1df0 100644 --- a/packages/flutter_tools/lib/src/version.dart +++ b/packages/flutter_tools/lib/src/version.dart
@@ -20,28 +20,17 @@ class FlutterVersion { @visibleForTesting FlutterVersion([this._clock = const SystemClock()]) { - _channel = _runGit('git rev-parse --abbrev-ref --symbolic @{u}'); - final String branch = _runGit('git rev-parse --abbrev-ref HEAD'); - _branch = branch == 'HEAD' ? _channel : branch; - - final int slash = _channel.indexOf('/'); - if (slash != -1) { - final String remote = _channel.substring(0, slash); - _repositoryUrl = _runGit('git ls-remote --get-url $remote'); - _channel = _channel.substring(slash + 1); - } else if (_channel.isEmpty) { - _channel = 'unknown'; - } - _frameworkRevision = _runGit('git log -n 1 --pretty=format:%H'); - _frameworkAge = _runGit('git log -n 1 --pretty=format:%ar'); _frameworkVersion = GitTagVersion.determine().frameworkVersionFor(_frameworkRevision); } final SystemClock _clock; String _repositoryUrl; - String get repositoryUrl => _repositoryUrl; + String get repositoryUrl { + final String _ = channel; + return _repositoryUrl; + } static const Set<String> officialChannels = <String>{ 'master', @@ -64,7 +53,22 @@ String _channel; /// The channel is the upstream branch. /// `master`, `dev`, `beta`, `stable`; or old ones, like `alpha`, `hackathon`, ... - String get channel => _channel; + String get channel { + if (_channel == null) { + final String channel = _runGit('git rev-parse --abbrev-ref --symbolic @{u}'); + final int slash = channel.indexOf('/'); + if (slash != -1) { + final String remote = channel.substring(0, slash); + _repositoryUrl = _runGit('git ls-remote --get-url $remote'); + _channel = channel.substring(slash + 1); + } else if (channel.isEmpty) { + _channel = 'unknown'; + } else { + _channel = channel; + } + } + return _channel; + } /// The name of the local branch. /// Use getBranchName() to read this. @@ -75,7 +79,9 @@ String get frameworkRevisionShort => _shortGitRevision(frameworkRevision); String _frameworkAge; - String get frameworkAge => _frameworkAge; + String get frameworkAge { + return _frameworkAge ??= _runGit('git log -n 1 --pretty=format:%ar'); + } String _frameworkVersion; String get frameworkVersion => _frameworkVersion; @@ -182,6 +188,10 @@ /// If [redactUnknownBranches] is true and the branch is unknown, /// the branch name will be returned as `'[user-branch]'`. String getBranchName({ bool redactUnknownBranches = false }) { + _branch ??= () { + final String branch = _runGit('git rev-parse --abbrev-ref HEAD'); + return branch == 'HEAD' ? channel : branch; + }(); if (redactUnknownBranches || _branch.isEmpty) { // Only return the branch names we know about; arbitrary branch names might contain PII. if (!officialChannels.contains(_branch) && !obsoleteBranches.containsKey(_branch)) @@ -266,7 +276,7 @@ /// writes shared cache files. Future<void> checkFlutterVersionFreshness() async { // Don't perform update checks if we're not on an official channel. - if (!officialChannels.contains(_channel)) { + if (!officialChannels.contains(channel)) { return; } @@ -359,7 +369,7 @@ // Cache is empty or it's been a while since the last server ping. Ping the server. try { - final DateTime remoteFrameworkCommitDate = DateTime.parse(await FlutterVersion.fetchRemoteFrameworkCommitDate(_channel)); + final DateTime remoteFrameworkCommitDate = DateTime.parse(await FlutterVersion.fetchRemoteFrameworkCommitDate(channel)); await versionCheckStamp.store( newTimeVersionWasChecked: _clock.now(), newKnownRemoteVersion: remoteFrameworkCommitDate,