diff --git a/.cirrus.yml b/.cirrus.yml index 1ae3c4f282b..51a58da8fda 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -229,7 +229,6 @@ task: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-0-linux - only_if: "$CIRRUS_PR != '' || $CIRRUS_BRANCH == 'master'" # https://github.com/flutter/flutter/issues/45453 environment: # Some of the host-only devicelab tests are pretty involved and need a lot of RAM. CPU: 2 @@ -238,7 +237,6 @@ task: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-1-linux - only_if: "$CIRRUS_PR != '' || $CIRRUS_BRANCH == 'master'" # https://github.com/flutter/flutter/issues/45453 environment: # Some of the host-only devicelab tests are pretty involved and need a lot of RAM. CPU: 2 @@ -247,7 +245,6 @@ task: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-2-linux - only_if: "$CIRRUS_PR != '' || $CIRRUS_BRANCH == 'master'" # https://github.com/flutter/flutter/issues/45453 environment: # Some of the host-only devicelab tests are pretty involved and need a lot of RAM. CPU: 2 @@ -256,7 +253,6 @@ task: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-3_last-linux - only_if: "$CIRRUS_PR != '' || $CIRRUS_BRANCH == 'master'" # https://github.com/flutter/flutter/issues/45453 environment: # Some of the host-only devicelab tests are pretty involved and need a lot of RAM. CPU: 2 @@ -403,22 +399,22 @@ task: - dart --enable-asserts dev\bots\test.dart - name: hostonly_devicelab_tests-0-windows - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-1-windows - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-2-windows - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-3_last-windows - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - dart --enable-asserts ./dev/bots/test.dart @@ -516,25 +512,25 @@ task: - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-0-macos - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-1-macos - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-2-macos - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - dart --enable-asserts ./dev/bots/test.dart - name: hostonly_devicelab_tests-3_last-macos - only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || ($CIRRUS_PR == '' && $CIRRUS_BRANCH == 'master')" # https://github.com/flutter/flutter/issues/41941 https://github.com/flutter/flutter/issues/45453 + only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941 script: - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - dart --enable-asserts ./dev/bots/test.dart diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 7ad3d1ad310..1842d087a21 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -c1e322b685a81c11c16bddd22282925b7d0272e8 +6955b06cedb2425f4363f10642c9b0e63e496af0 diff --git a/dev/ci/docker_linux/docker_build.sh b/dev/ci/docker_linux/docker_build.sh index a533b18f0f1..3b5901de8aa 100755 --- a/dev/ci/docker_linux/docker_build.sh +++ b/dev/ci/docker_linux/docker_build.sh @@ -2,6 +2,10 @@ TAG="${CIRRUS_TAG:-latest}" +# Convert "+" to "-" to make hotfix tags legal Docker tag names. +# See https://docs.docker.com/engine/reference/commandline/tag/ +TAG=${TAG/+/-} + # pull to make sure we are not rebuilding for nothing sudo docker pull "gcr.io/flutter-cirrus/build-flutter-image:$TAG" diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart index ace639e1ba5..87cbc26772d 100644 --- a/packages/flutter_tools/lib/src/commands/upgrade.dart +++ b/packages/flutter_tools/lib/src/commands/upgrade.dart @@ -122,8 +122,13 @@ class UpgradeCommandRunner { } await resetChanges(gitTagVersion); await upgradeChannel(flutterVersion); - await attemptFastForward(); - await flutterUpgradeContinue(); + final bool alreadyUpToDate = await attemptFastForward(flutterVersion); + if (alreadyUpToDate) { + // If the upgrade was a no op, then do not continue with the second half. + printTrace('Flutter is already up to date on channel ${flutterVersion.channel}'); + } else { + await flutterUpgradeContinue(); + } } Future flutterUpgradeContinue() async { @@ -234,7 +239,10 @@ class UpgradeCommandRunner { /// /// If there haven't been any hot fixes or local changes, this is equivalent /// to a fast-forward. - Future attemptFastForward() async { + /// + /// If the fast forward lands us on the same channel and revision, then + /// returns true, otherwise returns false. + Future attemptFastForward(FlutterVersion oldFlutterVersion) async { final int code = await processUtils.stream( ['git', 'pull', '--ff'], workingDirectory: Cache.flutterRoot, @@ -243,6 +251,17 @@ class UpgradeCommandRunner { if (code != 0) { throwToolExit(null, exitCode: code); } + + // Check if the upgrade did anything. + bool alreadyUpToDate = false; + try { + final FlutterVersion newFlutterVersion = FlutterVersion(); + alreadyUpToDate = newFlutterVersion.channel == oldFlutterVersion.channel && + newFlutterVersion.frameworkRevision == oldFlutterVersion.frameworkRevision; + } catch (e) { + printTrace('Failed to determine FlutterVersion after upgrade fast-forward: $e'); + } + return alreadyUpToDate; } /// Update the engine repository and precache all artifacts. diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart index de23ec3ae50..fb0e0891172 100644 --- a/packages/flutter_tools/lib/src/features.dart +++ b/packages/flutter_tools/lib/src/features.dart @@ -141,10 +141,22 @@ const Feature flutterAndroidEmbeddingV2Feature = Feature( name: 'flutter create generates projects using the Android embedding V2', environmentOverride: 'ENABLE_ANDROID_EMBEDDING_V2', configSetting: 'enable-android-embedding-v2', + beta: FeatureChannelSetting( + available: true, + enabledByDefault: true, + ), + dev: FeatureChannelSetting( + available: true, + enabledByDefault: true, + ), master: FeatureChannelSetting( available: true, enabledByDefault: true, ), + stable: FeatureChannelSetting( + available: true, + enabledByDefault: true, + ), ); /// The [Feature] for using the incremental compiler instead of build runner. diff --git a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart index d77d9846e68..487b7b4840a 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart @@ -121,6 +121,30 @@ void main() { Platform: () => fakePlatform, }); + testUsingContext('Doesn\'t continue on known tag, dev branch, no force, already up-to-date', () async { + fakeCommandRunner.alreadyUpToDate = true; + final Future result = fakeCommandRunner.runCommand( + false, + false, + gitTagVersion, + flutterVersion, + ); + expect(await result, null); + verifyNever(processManager.start( + [ + fs.path.join('bin', 'flutter'), + 'upgrade', + '--continue', + '--no-version-check', + ], + environment: anyNamed('environment'), + workingDirectory: anyNamed('workingDirectory'), + )); + }, overrides: { + ProcessManager: () => processManager, + Platform: () => fakePlatform, + }); + testUsingContext('verifyUpstreamConfigured', () async { when(processManager.run( ['git', 'rev-parse', '@{u}'], @@ -288,6 +312,8 @@ void main() { class FakeUpgradeCommandRunner extends UpgradeCommandRunner { bool willHaveUncomittedChanges = false; + bool alreadyUpToDate = false; + @override Future verifyUpstreamConfigured() async {} @@ -301,7 +327,7 @@ class FakeUpgradeCommandRunner extends UpgradeCommandRunner { Future upgradeChannel(FlutterVersion flutterVersion) async {} @override - Future attemptFastForward() async {} + Future attemptFastForward(FlutterVersion flutterVersion) async => alreadyUpToDate; @override Future precacheArtifacts() async {} diff --git a/packages/flutter_tools/test/general.shard/features_test.dart b/packages/flutter_tools/test/general.shard/features_test.dart index ba14ebcbce8..fb04874d345 100644 --- a/packages/flutter_tools/test/general.shard/features_test.dart +++ b/packages/flutter_tools/test/general.shard/features_test.dart @@ -432,6 +432,36 @@ void main() { expect(featureFlags.isWindowsEnabled, false); })); + + group('isAndroidEmbeddingV2Enabled', () { + test('is enabled on beta', () => testbed.run(() { + when(mockFlutterVerion.channel).thenReturn('beta'); + when(mockFlutterConfig.getValue('enable-android-embedding-v2') as bool).thenReturn(true); + + expect(featureFlags.isAndroidEmbeddingV2Enabled, true); + })); + + test('is enabled on dev', () => testbed.run(() { + when(mockFlutterVerion.channel).thenReturn('dev'); + when(mockFlutterConfig.getValue('enable-android-embedding-v2') as bool).thenReturn(true); + + expect(featureFlags.isAndroidEmbeddingV2Enabled, true); + })); + + test('is enabled on master', () => testbed.run(() { + when(mockFlutterVerion.channel).thenReturn('master'); + when(mockFlutterConfig.getValue('enable-android-embedding-v2') as bool).thenReturn(true); + + expect(featureFlags.isAndroidEmbeddingV2Enabled, true); + })); + + test('is enabled on stable', () => testbed.run(() { + when(mockFlutterVerion.channel).thenReturn('stable'); + when(mockFlutterConfig.getValue('enable-android-embedding-v2') as bool).thenReturn(true); + + expect(featureFlags.isAndroidEmbeddingV2Enabled, true); + })); + }); }); }