Unverified Commit ae805de4 authored by Anurag Roy's avatar Anurag Roy Committed by GitHub

[flutter_tools] Remove usage of globals.flutterGit from version (#100744)

parent fe11f57c
......@@ -75,7 +75,7 @@ class UpgradeCommand extends FlutterCommand {
force: boolArg('force'),
continueFlow: boolArg('continue'),
testFlow: stringArg('working-directory') != null,
gitTagVersion: GitTagVersion.determine(globals.processUtils),
gitTagVersion: GitTagVersion.determine(globals.processUtils, globals.platform),
flutterVersion: stringArg('working-directory') == null
? globals.flutterVersion
: FlutterVersion(workingDirectory: _commandRunner.workingDirectory),
......@@ -243,9 +243,9 @@ class UpgradeCommandRunner {
throwOnError: true,
workingDirectory: workingDirectory,
);
// '@{u}' means upstream HEAD
// Get the latest commit revision of the upstream
final RunResult result = await globals.processUtils.run(
<String>[ 'git', 'rev-parse', '--verify', '@{u}'],
<String>['git', 'rev-parse', '--verify', kGitTrackingUpstream],
throwOnError: true,
workingDirectory: workingDirectory,
);
......
......@@ -46,9 +46,6 @@ import 'reporting/reporting.dart';
import 'runner/local_engine.dart';
import 'version.dart';
/// The flutter GitHub repository.
String get flutterGit => platform.environment['FLUTTER_GIT_URL'] ?? 'https://github.com/flutter/flutter.git';
Artifacts? get artifacts => context.get<Artifacts>();
BuildSystem get buildSystem => context.get<BuildSystem>()!;
Cache get cache => context.get<Cache>()!;
......
......@@ -17,6 +17,11 @@ import 'globals.dart' as globals;
const String _unknownFrameworkVersion = '0.0.0-unknown';
/// A git shortcut for the branch that is being tracked by the current one.
///
/// See `man gitrevisions` for more information.
const String kGitTrackingUpstream = '@{upstream}';
/// This maps old branch names to the names of branches that replaced them.
///
/// For example, in 2021 we deprecated the "dev" channel and transitioned "dev"
......@@ -75,7 +80,7 @@ class FlutterVersion {
globals.processUtils,
_workingDirectory,
);
_gitTagVersion = GitTagVersion.determine(globals.processUtils, workingDirectory: _workingDirectory, gitRef: _frameworkRevision);
_gitTagVersion = GitTagVersion.determine(globals.processUtils, globals.platform, workingDirectory: _workingDirectory, gitRef: _frameworkRevision);
_frameworkVersion = gitTagVersion.frameworkVersionFor(_frameworkRevision);
}
......@@ -89,7 +94,7 @@ class FlutterVersion {
/// user explicitly wants to get the version, e.g. for `flutter --version` or
/// `flutter doctor`.
void fetchTagsAndUpdate() {
_gitTagVersion = GitTagVersion.determine(globals.processUtils, workingDirectory: _workingDirectory, fetchTags: true);
_gitTagVersion = GitTagVersion.determine(globals.processUtils, globals.platform, workingDirectory: _workingDirectory, fetchTags: true);
_frameworkVersion = gitTagVersion.frameworkVersionFor(_frameworkRevision);
}
......@@ -106,7 +111,7 @@ class FlutterVersion {
String? channel = _channel;
if (channel == null) {
final String gitChannel = _runGit(
'git rev-parse --abbrev-ref --symbolic @{u}',
'git rev-parse --abbrev-ref --symbolic $kGitTrackingUpstream',
globals.processUtils,
_workingDirectory,
);
......@@ -195,19 +200,19 @@ class FlutterVersion {
/// A date String describing the last framework commit.
///
/// If a git command fails, this will return a placeholder date.
String get frameworkCommitDate => _latestGitCommitDate(lenient: true);
String get frameworkCommitDate => _gitCommitDate(lenient: true);
// The date of the latest commit on the given branch. If no branch is
// specified, then it is the current local branch.
// The date of the given commit hash as [gitRef]. If no hash is specified,
// then it is the HEAD of the current local branch.
//
// If lenient is true, and the git command fails, a placeholder date is
// returned. Otherwise, the VersionCheckError exception is propagated.
static String _latestGitCommitDate({
String? branch,
static String _gitCommitDate({
String gitRef = 'HEAD',
bool lenient = false,
}) {
final List<String> args = gitLog(<String>[
if (branch != null) branch,
gitRef,
'-n',
'1',
'--pretty=format:%ad',
......@@ -247,7 +252,7 @@ class FlutterVersion {
DateTime localFrameworkCommitDate;
try {
// Don't perform the update check if fetching the latest local commit failed.
localFrameworkCommitDate = DateTime.parse(_latestGitCommitDate());
localFrameworkCommitDate = DateTime.parse(_gitCommitDate());
} on VersionCheckError {
return;
}
......@@ -264,51 +269,18 @@ class FlutterVersion {
).run();
}
/// The name of the temporary git remote used to check for the latest
/// available Flutter framework version.
///
/// In the absence of bugs and crashes a Flutter developer should never see
/// this remote appear in their `git remote` list, but also if it happens to
/// persist we do the proper clean-up for extra robustness.
static const String _versionCheckRemote = '__flutter_version_check__';
/// The date of the latest framework commit in the remote repository.
///
/// Throws [VersionCheckError] if a git command fails, for example, when the
/// remote git repository is not reachable due to a network issue.
static Future<String> fetchRemoteFrameworkCommitDate(String branch) async {
await _removeVersionCheckRemoteIfExists();
try {
await _run(<String>[
'git',
'remote',
'add',
_versionCheckRemote,
globals.flutterGit,
]);
await _run(<String>['git', 'fetch', _versionCheckRemote, branch]);
return _latestGitCommitDate(
branch: '$_versionCheckRemote/$branch',
);
// Fetch upstream branch's commit and tags
await _run(<String>['git', 'fetch', '--tags']);
return _gitCommitDate(gitRef: kGitTrackingUpstream);
} on VersionCheckError catch (error) {
if (globals.platform.environment.containsKey('FLUTTER_GIT_URL')) {
globals.printWarning('Warning: the Flutter git upstream was overridden '
'by the environment variable FLUTTER_GIT_URL = ${globals.flutterGit}');
}
globals.printError(error.toString());
globals.printError(error.message);
rethrow;
} finally {
await _removeVersionCheckRemoteIfExists();
}
}
static Future<void> _removeVersionCheckRemoteIfExists() async {
final List<String> remotes = (await _run(<String>['git', 'remote']))
.split('\n')
.map<String>((String name) => name.trim()) // to account for OS-specific line-breaks
.toList();
if (remotes.contains(_versionCheckRemote)) {
await _run(<String>['git', 'remote', 'remove', _versionCheckRemote]);
}
}
......@@ -728,13 +700,20 @@ class GitTagVersion {
/// The git tag that is this version's closest ancestor.
final String? gitTag;
static GitTagVersion determine(ProcessUtils processUtils, {String? workingDirectory, bool fetchTags = false, String gitRef = 'HEAD'}) {
static GitTagVersion determine(
ProcessUtils processUtils,
Platform platform, {
String? workingDirectory,
bool fetchTags = false,
String gitRef = 'HEAD'
}) {
if (fetchTags) {
final String channel = _runGit('git rev-parse --abbrev-ref HEAD', processUtils, workingDirectory);
if (channel == 'dev' || channel == 'beta' || channel == 'stable') {
globals.printTrace('Skipping request to fetchTags - on well known channel $channel.');
} else {
_runGit('git fetch ${globals.flutterGit} --tags -f', processUtils, workingDirectory);
final String flutterGit = platform.environment['FLUTTER_GIT_URL'] ?? 'https://github.com/flutter/flutter.git';
_runGit('git fetch $flutterGit --tags -f', processUtils, workingDirectory);
}
}
// find all tags attached to the given [gitRef]
......
......@@ -63,7 +63,7 @@ void main() {
command: <String>['git', 'fetch', '--tags'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', '--verify', '@{u}'],
command: <String>['git', 'rev-parse', '--verify', '@{upstream}'],
stdout: upstreamHeadRevision,
),
const FakeCommand(
......
......@@ -160,7 +160,7 @@ void main() {
'git', 'fetch', '--tags'
]),
const FakeCommand(command: <String>[
'git', 'rev-parse', '--verify', '@{u}',
'git', 'rev-parse', '--verify', '@{upstream}',
],
stdout: revision),
const FakeCommand(command: <String>[
......@@ -188,10 +188,10 @@ void main() {
'git', 'fetch', '--tags'
]),
FakeCommand(
command: <String>['git', 'rev-parse', '--verify', '@{u}'],
command: <String>['git', 'rev-parse', '--verify', '@{upstream}'],
exception: ProcessException(
'git',
<String>['rev-parse', '--verify', '@{u}'],
<String>['rev-parse', '--verify', '@{upstream}'],
'fatal: HEAD does not point to a branch',
),
),
......@@ -217,10 +217,10 @@ void main() {
'git', 'fetch', '--tags'
]),
FakeCommand(
command: <String>['git', 'rev-parse', '--verify', '@{u}'],
command: <String>['git', 'rev-parse', '--verify', '@{upstream}'],
exception: ProcessException(
'git',
<String>['rev-parse', '--verify', '@{u}'],
<String>['rev-parse', '--verify', '@{upstream}'],
'fatal: no upstream configured for branch',
),
),
......
......@@ -70,7 +70,7 @@ void main() {
stdout: '0.1.2-3-1234abcd',
),
FakeCommand(
command: const <String>['git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'],
command: const <String>['git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{upstream}'],
stdout: 'origin/$channel',
),
const FakeCommand(
......@@ -78,31 +78,22 @@ void main() {
stdout: flutterUpstreamUrl,
),
FakeCommand(
command: const <String>['git', '-c', 'log.showSignature=false', 'log', '-n', '1', '--pretty=format:%ad', '--date=iso'],
command: const <String>['git', '-c', 'log.showSignature=false', 'log', 'HEAD', '-n', '1', '--pretty=format:%ad', '--date=iso'],
stdout: getChannelUpToDateVersion().toString(),
),
const FakeCommand(
command: <String>['git', 'remote'],
),
const FakeCommand(
command: <String>['git', 'remote', 'add', '__flutter_version_check__', flutterUpstreamUrl],
command: <String>['git', 'fetch', '--tags'],
),
FakeCommand(
command: <String>['git', 'fetch', '__flutter_version_check__', channel],
),
FakeCommand(
command: <String>['git', '-c', 'log.showSignature=false', 'log', '__flutter_version_check__/$channel', '-n', '1', '--pretty=format:%ad', '--date=iso'],
command: const <String>['git', '-c', 'log.showSignature=false', 'log', '@{upstream}', '-n', '1', '--pretty=format:%ad', '--date=iso'],
stdout: getChannelOutOfDateVersion().toString(),
),
const FakeCommand(
command: <String>['git', 'remote'],
),
const FakeCommand(
command: <String>['git', '-c', 'log.showSignature=false', 'log', '-n', '1', '--pretty=format:%ar'],
stdout: '1 second ago',
),
FakeCommand(
command: const <String>['git', '-c', 'log.showSignature=false', 'log', '-n', '1', '--pretty=format:%ad', '--date=iso'],
command: const <String>['git', '-c', 'log.showSignature=false', 'log', 'HEAD', '-n', '1', '--pretty=format:%ad', '--date=iso'],
stdout: getChannelUpToDateVersion().toString(),
),
FakeCommand(
......@@ -114,6 +105,7 @@ void main() {
final FlutterVersion flutterVersion = globals.flutterVersion;
await flutterVersion.checkFlutterVersionFreshness();
expect(flutterVersion.channel, channel);
expect(flutterVersion.repositoryUrl, flutterUpstreamUrl);
expect(flutterVersion.frameworkRevision, '1234abcd');
expect(flutterVersion.frameworkRevisionShort, '1234abcd');
expect(flutterVersion.frameworkVersion, '0.0.0-unknown');
......@@ -423,7 +415,7 @@ void main() {
stdout: '0.1.2-3-1234abcd',
),
const FakeCommand(
command: <String>['git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'],
command: <String>['git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{upstream}'],
stdout: 'feature-branch',
),
const FakeCommand(
......@@ -526,7 +518,8 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final GitTagVersion gitTagVersion = GitTagVersion.determine(processUtils, workingDirectory: '.');
final FakePlatform platform = FakePlatform();
final GitTagVersion gitTagVersion = GitTagVersion.determine(processUtils, platform, workingDirectory: '.');
expect(gitTagVersion.frameworkVersionFor('abcd1234'), stableTag);
});
......@@ -545,7 +538,9 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final GitTagVersion gitTagVersion = GitTagVersion.determine(processUtils, workingDirectory: '.');
final FakePlatform platform = FakePlatform();
final GitTagVersion gitTagVersion = GitTagVersion.determine(processUtils, platform, workingDirectory: '.');
expect(gitTagVersion.frameworkVersionFor('abcd1234'), stableTag);
});
......@@ -569,7 +564,9 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final GitTagVersion gitTagVersion = GitTagVersion.determine(processUtils, workingDirectory: '.');
final FakePlatform platform = FakePlatform();
final GitTagVersion gitTagVersion = GitTagVersion.determine(processUtils, platform, workingDirectory: '.');
// reported version should increment the y
expect(gitTagVersion.frameworkVersionFor(headRevision), '1.3.0-0.0.pre.12');
});
......@@ -588,8 +585,9 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final FakePlatform platform = FakePlatform();
GitTagVersion.determine(processUtils, workingDirectory: '.');
GitTagVersion.determine(processUtils, platform, workingDirectory: '.');
expect(fakeProcessManager, hasNoRemainingExpectations);
});
......@@ -611,8 +609,9 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final FakePlatform platform = FakePlatform();
GitTagVersion.determine(processUtils, workingDirectory: '.', fetchTags: true);
GitTagVersion.determine(processUtils, platform, workingDirectory: '.', fetchTags: true);
expect(fakeProcessManager, hasNoRemainingExpectations);
});
......@@ -637,8 +636,9 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final FakePlatform platform = FakePlatform();
GitTagVersion.determine(processUtils, workingDirectory: '.', fetchTags: true);
GitTagVersion.determine(processUtils, platform, workingDirectory: '.', fetchTags: true);
expect(fakeProcessManager, hasNoRemainingExpectations);
});
......@@ -663,13 +663,12 @@ void main() {
processManager: fakeProcessManager,
logger: BufferLogger.test(),
);
final FakePlatform platform = FakePlatform(
environment: <String, String> {'FLUTTER_GIT_URL': 'https://githubmirror.com/flutter.git'},
);
GitTagVersion.determine(processUtils, workingDirectory: '.', fetchTags: true);
GitTagVersion.determine(processUtils, platform, workingDirectory: '.', fetchTags: true);
expect(fakeProcessManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
Platform: () => FakePlatform(environment: <String, String>{
'FLUTTER_GIT_URL': 'https://githubmirror.com/flutter.git',
}),
});
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment