diff --git a/dev/conductor/core/lib/src/globals.dart b/dev/conductor/core/lib/src/globals.dart index 9c010c8a5e..b0a5d25afb 100644 --- a/dev/conductor/core/lib/src/globals.dart +++ b/dev/conductor/core/lib/src/globals.dart @@ -16,7 +16,7 @@ const List kBaseReleaseChannels = ['stable', 'beta', 'dev']; const List kReleaseChannels = [...kBaseReleaseChannels, FrameworkRepository.defaultBranch]; -const List KReleaseIncrements = ['y', 'z', 'm', 'n']; +const List kReleaseIncrements = ['y', 'z', 'm', 'n']; const String kReleaseDocumentationUrl = 'https://github.com/flutter/flutter/wiki/Flutter-Cherrypick-Process'; @@ -28,6 +28,10 @@ final RegExp releaseCandidateBranchRegex = RegExp( r'flutter-(\d+)\.(\d+)-candidate\.(\d+)', ); +/// Whether all releases published to the beta channel should be mirrored to +/// dev. +const bool kSynchronizeDevWithBeta = true; + /// Cast a dynamic to String and trim. String stdoutToString(dynamic input) { final String str = input as String; diff --git a/dev/conductor/core/lib/src/next.dart b/dev/conductor/core/lib/src/next.dart index 9ece748e56..575ce035c2 100644 --- a/dev/conductor/core/lib/src/next.dart +++ b/dev/conductor/core/lib/src/next.dart @@ -48,7 +48,7 @@ class NextCommand extends Command { String get description => 'Proceed to the next release phase.'; @override - Future run() async { + Future run() { final File stateFile = checkouts.fileSystem.file(argResults![kStateOption]); if (!stateFile.existsSync()) { throw ConductorException( @@ -57,7 +57,7 @@ class NextCommand extends Command { } final pb.ConductorState state = state_import.readStateFromFile(stateFile); - await NextContext( + return NextContext( autoAccept: argResults![kYesFlag] as bool, checkouts: checkouts, force: argResults![kForceFlag] as bool, @@ -324,29 +324,37 @@ class NextContext extends Context { previousCheckoutLocation: state.framework.checkoutPath, ); final String headRevision = await framework.reverseParse('HEAD'); - if (autoAccept == false) { - // dryRun: true means print out git command - await framework.pushRef( + final List releaseRefs = [state.releaseChannel]; + if (kSynchronizeDevWithBeta && state.releaseChannel == 'beta') { + releaseRefs.add('dev'); + } + for (final String releaseRef in releaseRefs) { + if (autoAccept == false) { + // dryRun: true means print out git command + await framework.pushRef( fromRef: headRevision, - toRef: state.releaseChannel, + toRef: releaseRef, remote: state.framework.upstream.url, force: force, dryRun: true, - ); + ); - final bool response = await prompt('Are you ready to publish this release?'); - if (!response) { - stdio.printError('Aborting command.'); - updateState(state, stdio.logs); - return; + final bool response = await prompt( + 'Are you ready to publish version ${state.releaseVersion} to $releaseRef?', + ); + if (!response) { + stdio.printError('Aborting command.'); + updateState(state, stdio.logs); + return; + } } - } - await framework.pushRef( + await framework.pushRef( fromRef: headRevision, - toRef: state.releaseChannel, + toRef: releaseRef, remote: state.framework.upstream.url, force: force, - ); + ); + } break; case pb.ReleasePhase.VERIFY_RELEASE: stdio.printStatus( diff --git a/dev/conductor/core/lib/src/start.dart b/dev/conductor/core/lib/src/start.dart index 4135441938..3227396e05 100644 --- a/dev/conductor/core/lib/src/start.dart +++ b/dev/conductor/core/lib/src/start.dart @@ -93,7 +93,7 @@ class StartCommand extends Command { kIncrementOption, help: 'Specifies which part of the x.y.z version number to increment. Required.', valueHelp: 'level', - allowed: KReleaseIncrements, + allowed: kReleaseIncrements, allowedHelp: { 'y': 'Indicates the first dev release after a beta release.', 'z': 'Indicates a hotfix to a stable release.', diff --git a/dev/conductor/core/lib/src/version.dart b/dev/conductor/core/lib/src/version.dart index 85b21fde6c..8c29e6107e 100644 --- a/dev/conductor/core/lib/src/version.dart +++ b/dev/conductor/core/lib/src/version.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './globals.dart' show ConductorException, KReleaseIncrements, releaseCandidateBranchRegex; +import './globals.dart' show ConductorException, kReleaseIncrements, releaseCandidateBranchRegex; /// Possible string formats that `flutter --version` can return. enum VersionType { @@ -262,7 +262,7 @@ class Version { /// Will throw a [ConductorException] if the version is not possible given the /// [candidateBranch] and [incrementLetter]. void ensureValid(String candidateBranch, String incrementLetter) { - if (!KReleaseIncrements.contains(incrementLetter)) { + if (!kReleaseIncrements.contains(incrementLetter)) { throw ConductorException('Invalid incrementLetter: $incrementLetter'); } final RegExpMatch? branchMatch = releaseCandidateBranchRegex.firstMatch(candidateBranch); diff --git a/dev/conductor/core/test/common.dart b/dev/conductor/core/test/common.dart index 93821b93b2..b661271895 100644 --- a/dev/conductor/core/test/common.dart +++ b/dev/conductor/core/test/common.dart @@ -48,7 +48,7 @@ class TestStdio extends Stdio { @override String readLineSync() { if (stdin.isEmpty) { - throw Exception('Unexpected call to readLineSync!'); + throw Exception('Unexpected call to readLineSync! Last stdout was ${logs.last}'); } return stdin.removeAt(0); } diff --git a/dev/conductor/core/test/next_test.dart b/dev/conductor/core/test/next_test.dart index 1eb17036ac..edfb98c988 100644 --- a/dev/conductor/core/test/next_test.dart +++ b/dev/conductor/core/test/next_test.dart @@ -966,6 +966,8 @@ void main() { }); test('updates currentPhase if user responds yes', () async { + stdio.stdin.add('y'); + // for kSynchronizeDevWithBeta stdio.stdin.add('y'); final FakeProcessManager processManager = FakeProcessManager.list([ const FakeCommand( @@ -981,6 +983,10 @@ void main() { const FakeCommand( command: ['git', 'push', FrameworkRepository.defaultUpstream, '$revision1:$releaseChannel'], ), + // for kSynchronizeDevWithBeta + const FakeCommand( + command: ['git', 'push', FrameworkRepository.defaultUpstream, '$revision1:dev'], + ), ]); writeStateToFile( fileSystem.file(stateFile),