Unverified Commit d9634155 authored by Casey Hillers's avatar Casey Hillers Committed by GitHub

[conductor] Remove PublishChannel and use MPA command (#135884)

Move more of the playbook into conductor. The MPA command inputs are prone to human error.
parent e141d0a4
...@@ -18,7 +18,7 @@ const List<String> kReleaseChannels = <String>[...kBaseReleaseChannels, Framewor ...@@ -18,7 +18,7 @@ const List<String> kReleaseChannels = <String>[...kBaseReleaseChannels, Framewor
const String kReleaseDocumentationUrl = 'https://github.com/flutter/flutter/wiki/Flutter-Cherrypick-Process'; const String kReleaseDocumentationUrl = 'https://github.com/flutter/flutter/wiki/Flutter-Cherrypick-Process';
const String kLuciPackagingConsoleLink = 'https://ci.chromium.org/p/flutter/g/packaging/console'; const String kLuciPackagingConsoleLink = 'https://ci.chromium.org/p/dart-internal/g/flutter_packaging/console';
const String kWebsiteReleasesUrl = 'https://docs.flutter.dev/development/tools/sdk/releases'; const String kWebsiteReleasesUrl = 'https://docs.flutter.dev/development/tools/sdk/releases';
......
...@@ -141,15 +141,12 @@ class NextContext extends Context { ...@@ -141,15 +141,12 @@ class NextContext extends Context {
} }
await pushWorkingBranch(engine, state.engine); await pushWorkingBranch(engine, state.engine);
case pb.ReleasePhase.CODESIGN_ENGINE_BINARIES: case pb.ReleasePhase.VERIFY_ENGINE_CI:
stdio.printStatus(<String>[ stdio.printStatus('You must validate post-submit CI for your engine PR and merge it');
'You must validate pre-submit CI for your engine PR, merge it, and codesign',
'binaries before proceeding.\n',
].join('\n'));
if (!autoAccept) { if (!autoAccept) {
// TODO(fujino): actually test if binaries have been codesigned on macOS
final bool response = await prompt( final bool response = await prompt(
'Has CI passed for the engine PR and binaries been codesigned?', 'Has CI passed for the engine PR?\n\n'
'${state_import.luciConsoleLink(state.releaseChannel, 'engine')}'
); );
if (!response) { if (!response) {
stdio.printError('Aborting command.'); stdio.printError('Aborting command.');
...@@ -190,10 +187,10 @@ class NextContext extends Context { ...@@ -190,10 +187,10 @@ class NextContext extends Context {
addFirst: true, addFirst: true,
); );
// append to list of cherrypicks so we know a PR is required // append to list of cherrypicks so we know a PR is required
state.framework.cherrypicks.add(pb.Cherrypick( state.framework.cherrypicks.add(pb.Cherrypick.create()
appliedRevision: revision, ..appliedRevision = revision
state: pb.CherrypickState.COMPLETED, ..state = pb.CherrypickState.COMPLETED
)); );
} }
stdio.printStatus('Rolling new engine hash $engineRevision to framework checkout...'); stdio.printStatus('Rolling new engine hash $engineRevision to framework checkout...');
needsCommit = await framework.updateEngineRevision(engineRevision); needsCommit = await framework.updateEngineRevision(engineRevision);
...@@ -203,10 +200,10 @@ class NextContext extends Context { ...@@ -203,10 +200,10 @@ class NextContext extends Context {
addFirst: true, addFirst: true,
); );
// append to list of cherrypicks so we know a PR is required // append to list of cherrypicks so we know a PR is required
state.framework.cherrypicks.add(pb.Cherrypick( state.framework.cherrypicks.add(pb.Cherrypick.create()
appliedRevision: revision, ..appliedRevision = revision
state: pb.CherrypickState.COMPLETED, ..state = pb.CherrypickState.COMPLETED
)); );
} }
final List<pb.Cherrypick> unappliedCherrypicks = <pb.Cherrypick>[]; final List<pb.Cherrypick> unappliedCherrypicks = <pb.Cherrypick>[];
...@@ -250,83 +247,18 @@ class NextContext extends Context { ...@@ -250,83 +247,18 @@ class NextContext extends Context {
await pushWorkingBranch(framework, state.framework); await pushWorkingBranch(framework, state.framework);
case pb.ReleasePhase.PUBLISH_VERSION: case pb.ReleasePhase.PUBLISH_VERSION:
stdio.printStatus('Please ensure that you have merged your framework PR and that'); final String command = '''
stdio.printStatus('post-submit CI has finished successfully.\n'); tool-proxy-cli --tool_proxy=/abns/dart-eng-tool-proxy/prod-dart-eng-tool-proxy-tool-proxy.annealed-tool-proxy \\
final Remote frameworkUpstream = Remote( --block_on_mpa -I flutter_release \\
name: RemoteName.upstream, :git_branch ${state.framework.candidateBranch} \\
url: state.framework.upstream.url, :release_channel ${state.releaseChannel} \\
); :tag ${state.releaseVersion} \\
final FrameworkRepository framework = FrameworkRepository( :force false
checkouts, ''';
// We explicitly want to check out the merged version from upstream stdio.printStatus('Please ensure that you have merged your framework PR');
initialRef: '${frameworkUpstream.name}/${state.framework.candidateBranch}', stdio.printStatus('and post-submit CI has finished successfully.\n');
upstreamRemote: frameworkUpstream, stdio.printStatus('Run the following command, and ask a Googler');
previousCheckoutLocation: state.framework.checkoutPath, stdio.printStatus('to review the request\n\n$command');
);
final String frameworkHead = await framework.reverseParse('HEAD');
final Remote engineUpstream = Remote(
name: RemoteName.upstream,
url: state.engine.upstream.url,
);
final EngineRepository engine = EngineRepository(
checkouts,
// We explicitly want to check out the merged version from upstream
initialRef: '${engineUpstream.name}/${state.engine.candidateBranch}',
upstreamRemote: engineUpstream,
previousCheckoutLocation: state.engine.checkoutPath,
);
final String engineHead = await engine.reverseParse('HEAD');
if (!autoAccept) {
final bool response = await prompt(
'Are you ready to tag commit $frameworkHead as ${state.releaseVersion}\n'
'and push to remote ${state.framework.upstream.url}?',
);
if (!response) {
stdio.printError('Aborting command.');
updateState(state, stdio.logs);
return;
}
}
await framework.tag(frameworkHead, state.releaseVersion, frameworkUpstream.name);
await engine.tag(engineHead, state.releaseVersion, engineUpstream.name);
case pb.ReleasePhase.PUBLISH_CHANNEL:
final Remote upstream = Remote(
name: RemoteName.upstream,
url: state.framework.upstream.url,
);
final FrameworkRepository framework = FrameworkRepository(
checkouts,
// We explicitly want to check out the merged version from upstream
initialRef: '${upstream.name}/${state.framework.candidateBranch}',
upstreamRemote: upstream,
previousCheckoutLocation: state.framework.checkoutPath,
);
final String headRevision = await framework.reverseParse('HEAD');
if (!autoAccept) {
// dryRun: true means print out git command
await framework.pushRef(
fromRef: headRevision,
toRef: state.releaseChannel,
remote: state.framework.upstream.url,
force: force,
dryRun: true,
);
final bool response = await prompt(
'Are you ready to publish version ${state.releaseVersion} to ${state.releaseChannel}?',
);
if (!response) {
stdio.printError('Aborting command.');
updateState(state, stdio.logs);
return;
}
}
await framework.pushRef(
fromRef: headRevision,
toRef: state.releaseChannel,
remote: state.framework.upstream.url,
force: force,
);
case pb.ReleasePhase.VERIFY_RELEASE: case pb.ReleasePhase.VERIFY_RELEASE:
stdio.printStatus( stdio.printStatus(
'The current status of packaging builds can be seen at:\n' 'The current status of packaging builds can be seen at:\n'
......
...@@ -2,12 +2,16 @@ ...@@ -2,12 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
/// //
// Generated code. Do not modify. // Generated code. Do not modify.
// source: conductor_state.proto // source: conductor_state.proto
// //
// @dart = 2.12 // @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
// ignore_for_file: annotate_overrides, camel_case_types
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core; import 'dart:core' as $core;
...@@ -19,33 +23,19 @@ import 'conductor_state.pbenum.dart'; ...@@ -19,33 +23,19 @@ import 'conductor_state.pbenum.dart';
export 'conductor_state.pbenum.dart'; export 'conductor_state.pbenum.dart';
class Remote extends $pb.GeneratedMessage { class Remote extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo( factory Remote() => create();
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Remote',
package: const $pb.PackageName(
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'conductor_state'),
createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'url')
..hasRequiredFields = false;
Remote._() : super(); Remote._() : super();
factory Remote({
$core.String? name,
$core.String? url,
}) {
final _result = create();
if (name != null) {
_result.name = name;
}
if (url != null) {
_result.url = url;
}
return _result;
}
factory Remote.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => factory Remote.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(i, r); create()..mergeFromBuffer(i, r);
factory Remote.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => factory Remote.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(i, r); create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Remote',
package: const $pb.PackageName(_omitMessageNames ? '' : 'conductor_state'), createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'name')
..aOS(2, _omitFieldNames ? '' : 'url')
..hasRequiredFields = false;
@$core.Deprecated('Using this can add significant overhead to your binary. ' @$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
...@@ -53,9 +43,10 @@ class Remote extends $pb.GeneratedMessage { ...@@ -53,9 +43,10 @@ class Remote extends $pb.GeneratedMessage {
@$core.Deprecated('Using this can add significant overhead to your binary. ' @$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
Remote copyWith(void Function(Remote) updates) => Remote copyWith(void Function(Remote) updates) => super.copyWith((message) => updates(message as Remote)) as Remote;
super.copyWith((message) => updates(message as Remote)) as Remote; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static Remote create() => Remote._(); static Remote create() => Remote._();
Remote createEmptyInstance() => create(); Remote createEmptyInstance() => create();
...@@ -90,42 +81,21 @@ class Remote extends $pb.GeneratedMessage { ...@@ -90,42 +81,21 @@ class Remote extends $pb.GeneratedMessage {
} }
class Cherrypick extends $pb.GeneratedMessage { class Cherrypick extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo( factory Cherrypick() => create();
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Cherrypick',
package: const $pb.PackageName(
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'conductor_state'),
createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trunkRevision',
protoName: 'trunkRevision')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appliedRevision',
protoName: 'appliedRevision')
..e<CherrypickState>(
3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', $pb.PbFieldType.OE,
defaultOrMaker: CherrypickState.PENDING, valueOf: CherrypickState.valueOf, enumValues: CherrypickState.values)
..hasRequiredFields = false;
Cherrypick._() : super(); Cherrypick._() : super();
factory Cherrypick({
$core.String? trunkRevision,
$core.String? appliedRevision,
CherrypickState? state,
}) {
final _result = create();
if (trunkRevision != null) {
_result.trunkRevision = trunkRevision;
}
if (appliedRevision != null) {
_result.appliedRevision = appliedRevision;
}
if (state != null) {
_result.state = state;
}
return _result;
}
factory Cherrypick.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => factory Cherrypick.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(i, r); create()..mergeFromBuffer(i, r);
factory Cherrypick.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => factory Cherrypick.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(i, r); create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Cherrypick',
package: const $pb.PackageName(_omitMessageNames ? '' : 'conductor_state'), createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'trunkRevision', protoName: 'trunkRevision')
..aOS(2, _omitFieldNames ? '' : 'appliedRevision', protoName: 'appliedRevision')
..e<CherrypickState>(3, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE,
defaultOrMaker: CherrypickState.PENDING, valueOf: CherrypickState.valueOf, enumValues: CherrypickState.values)
..hasRequiredFields = false;
@$core.Deprecated('Using this can add significant overhead to your binary. ' @$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
...@@ -134,8 +104,10 @@ class Cherrypick extends $pb.GeneratedMessage { ...@@ -134,8 +104,10 @@ class Cherrypick extends $pb.GeneratedMessage {
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
Cherrypick copyWith(void Function(Cherrypick) updates) => Cherrypick copyWith(void Function(Cherrypick) updates) =>
super.copyWith((message) => updates(message as Cherrypick)) as Cherrypick; // ignore: deprecated_member_use super.copyWith((message) => updates(message as Cherrypick)) as Cherrypick;
$pb.BuilderInfo get info_ => _i; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static Cherrypick create() => Cherrypick._(); static Cherrypick create() => Cherrypick._();
Cherrypick createEmptyInstance() => create(); Cherrypick createEmptyInstance() => create();
...@@ -182,78 +154,26 @@ class Cherrypick extends $pb.GeneratedMessage { ...@@ -182,78 +154,26 @@ class Cherrypick extends $pb.GeneratedMessage {
} }
class Repository extends $pb.GeneratedMessage { class Repository extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo( factory Repository() => create();
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Repository',
package: const $pb.PackageName(
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'conductor_state'),
createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'candidateBranch',
protoName: 'candidateBranch')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startingGitHead',
protoName: 'startingGitHead')
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'currentGitHead',
protoName: 'currentGitHead')
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'checkoutPath',
protoName: 'checkoutPath')
..aOM<Remote>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'upstream',
subBuilder: Remote.create)
..aOM<Remote>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mirror',
subBuilder: Remote.create)
..pc<Cherrypick>(
7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cherrypicks', $pb.PbFieldType.PM,
subBuilder: Cherrypick.create)
..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dartRevision',
protoName: 'dartRevision')
..aOS(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'workingBranch',
protoName: 'workingBranch')
..hasRequiredFields = false;
Repository._() : super(); Repository._() : super();
factory Repository({
$core.String? candidateBranch,
$core.String? startingGitHead,
$core.String? currentGitHead,
$core.String? checkoutPath,
Remote? upstream,
Remote? mirror,
$core.Iterable<Cherrypick>? cherrypicks,
$core.String? dartRevision,
$core.String? workingBranch,
}) {
final _result = create();
if (candidateBranch != null) {
_result.candidateBranch = candidateBranch;
}
if (startingGitHead != null) {
_result.startingGitHead = startingGitHead;
}
if (currentGitHead != null) {
_result.currentGitHead = currentGitHead;
}
if (checkoutPath != null) {
_result.checkoutPath = checkoutPath;
}
if (upstream != null) {
_result.upstream = upstream;
}
if (mirror != null) {
_result.mirror = mirror;
}
if (cherrypicks != null) {
_result.cherrypicks.addAll(cherrypicks);
}
if (dartRevision != null) {
_result.dartRevision = dartRevision;
}
if (workingBranch != null) {
_result.workingBranch = workingBranch;
}
return _result;
}
factory Repository.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => factory Repository.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(i, r); create()..mergeFromBuffer(i, r);
factory Repository.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => factory Repository.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(i, r); create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Repository',
package: const $pb.PackageName(_omitMessageNames ? '' : 'conductor_state'), createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'candidateBranch', protoName: 'candidateBranch')
..aOS(2, _omitFieldNames ? '' : 'startingGitHead', protoName: 'startingGitHead')
..aOS(3, _omitFieldNames ? '' : 'currentGitHead', protoName: 'currentGitHead')
..aOS(4, _omitFieldNames ? '' : 'checkoutPath', protoName: 'checkoutPath')
..aOM<Remote>(5, _omitFieldNames ? '' : 'upstream', subBuilder: Remote.create)
..aOM<Remote>(6, _omitFieldNames ? '' : 'mirror', subBuilder: Remote.create)
..pc<Cherrypick>(7, _omitFieldNames ? '' : 'cherrypicks', $pb.PbFieldType.PM, subBuilder: Cherrypick.create)
..aOS(8, _omitFieldNames ? '' : 'dartRevision', protoName: 'dartRevision')
..aOS(9, _omitFieldNames ? '' : 'workingBranch', protoName: 'workingBranch')
..hasRequiredFields = false;
@$core.Deprecated('Using this can add significant overhead to your binary. ' @$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
...@@ -262,8 +182,10 @@ class Repository extends $pb.GeneratedMessage { ...@@ -262,8 +182,10 @@ class Repository extends $pb.GeneratedMessage {
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
Repository copyWith(void Function(Repository) updates) => Repository copyWith(void Function(Repository) updates) =>
super.copyWith((message) => updates(message as Repository)) as Repository; // ignore: deprecated_member_use super.copyWith((message) => updates(message as Repository)) as Repository;
$pb.BuilderInfo get info_ => _i; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static Repository create() => Repository._(); static Repository create() => Repository._();
Repository createEmptyInstance() => create(); Repository createEmptyInstance() => create();
...@@ -377,90 +299,35 @@ class Repository extends $pb.GeneratedMessage { ...@@ -377,90 +299,35 @@ class Repository extends $pb.GeneratedMessage {
} }
class ConductorState extends $pb.GeneratedMessage { class ConductorState extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo( factory ConductorState() => create();
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ConductorState', ConductorState._() : super();
package: const $pb.PackageName( factory ConductorState.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'conductor_state'), create()..mergeFromBuffer(i, r);
createEmptyInstance: create) factory ConductorState.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'releaseChannel', create()..mergeFromJson(i, r);
protoName: 'releaseChannel')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'releaseVersion', static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ConductorState',
protoName: 'releaseVersion') package: const $pb.PackageName(_omitMessageNames ? '' : 'conductor_state'), createEmptyInstance: create)
..aOM<Repository>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'engine', ..aOS(1, _omitFieldNames ? '' : 'releaseChannel', protoName: 'releaseChannel')
subBuilder: Repository.create) ..aOS(2, _omitFieldNames ? '' : 'releaseVersion', protoName: 'releaseVersion')
..aOM<Repository>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'framework', ..aOM<Repository>(4, _omitFieldNames ? '' : 'engine', subBuilder: Repository.create)
subBuilder: Repository.create) ..aOM<Repository>(5, _omitFieldNames ? '' : 'framework', subBuilder: Repository.create)
..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createdDate', ..aInt64(6, _omitFieldNames ? '' : 'createdDate', protoName: 'createdDate')
protoName: 'createdDate') ..aInt64(7, _omitFieldNames ? '' : 'lastUpdatedDate', protoName: 'lastUpdatedDate')
..aInt64(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'lastUpdatedDate', ..pPS(8, _omitFieldNames ? '' : 'logs')
protoName: 'lastUpdatedDate') ..e<ReleasePhase>(9, _omitFieldNames ? '' : 'currentPhase', $pb.PbFieldType.OE,
..pPS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'logs')
..e<ReleasePhase>(
9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'currentPhase', $pb.PbFieldType.OE,
protoName: 'currentPhase', protoName: 'currentPhase',
defaultOrMaker: ReleasePhase.APPLY_ENGINE_CHERRYPICKS, defaultOrMaker: ReleasePhase.APPLY_ENGINE_CHERRYPICKS,
valueOf: ReleasePhase.valueOf, valueOf: ReleasePhase.valueOf,
enumValues: ReleasePhase.values) enumValues: ReleasePhase.values)
..aOS(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'conductorVersion', ..aOS(10, _omitFieldNames ? '' : 'conductorVersion', protoName: 'conductorVersion')
protoName: 'conductorVersion') ..e<ReleaseType>(11, _omitFieldNames ? '' : 'releaseType', $pb.PbFieldType.OE,
..e<ReleaseType>(
11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'releaseType', $pb.PbFieldType.OE,
protoName: 'releaseType', protoName: 'releaseType',
defaultOrMaker: ReleaseType.STABLE_INITIAL, defaultOrMaker: ReleaseType.STABLE_INITIAL,
valueOf: ReleaseType.valueOf, valueOf: ReleaseType.valueOf,
enumValues: ReleaseType.values) enumValues: ReleaseType.values)
..hasRequiredFields = false; ..hasRequiredFields = false;
ConductorState._() : super();
factory ConductorState({
$core.String? releaseChannel,
$core.String? releaseVersion,
Repository? engine,
Repository? framework,
$fixnum.Int64? createdDate,
$fixnum.Int64? lastUpdatedDate,
$core.Iterable<$core.String>? logs,
ReleasePhase? currentPhase,
$core.String? conductorVersion,
ReleaseType? releaseType,
}) {
final _result = create();
if (releaseChannel != null) {
_result.releaseChannel = releaseChannel;
}
if (releaseVersion != null) {
_result.releaseVersion = releaseVersion;
}
if (engine != null) {
_result.engine = engine;
}
if (framework != null) {
_result.framework = framework;
}
if (createdDate != null) {
_result.createdDate = createdDate;
}
if (lastUpdatedDate != null) {
_result.lastUpdatedDate = lastUpdatedDate;
}
if (logs != null) {
_result.logs.addAll(logs);
}
if (currentPhase != null) {
_result.currentPhase = currentPhase;
}
if (conductorVersion != null) {
_result.conductorVersion = conductorVersion;
}
if (releaseType != null) {
_result.releaseType = releaseType;
}
return _result;
}
factory ConductorState.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(i, r);
factory ConductorState.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(i, r);
@$core.Deprecated('Using this can add significant overhead to your binary. ' @$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
...@@ -469,9 +336,10 @@ class ConductorState extends $pb.GeneratedMessage { ...@@ -469,9 +336,10 @@ class ConductorState extends $pb.GeneratedMessage {
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
ConductorState copyWith(void Function(ConductorState) updates) => ConductorState copyWith(void Function(ConductorState) updates) =>
super.copyWith((message) => updates(message as ConductorState)) super.copyWith((message) => updates(message as ConductorState)) as ConductorState;
as ConductorState; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static ConductorState create() => ConductorState._(); static ConductorState create() => ConductorState._();
ConductorState createEmptyInstance() => create(); ConductorState createEmptyInstance() => create();
...@@ -595,3 +463,6 @@ class ConductorState extends $pb.GeneratedMessage { ...@@ -595,3 +463,6 @@ class ConductorState extends $pb.GeneratedMessage {
@$pb.TagNumber(11) @$pb.TagNumber(11)
void clearReleaseType() => clearField(11); void clearReleaseType() => clearField(11);
} }
const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
...@@ -2,39 +2,36 @@ ...@@ -2,39 +2,36 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
/// //
// Generated code. Do not modify. // Generated code. Do not modify.
// source: conductor_state.proto // source: conductor_state.proto
// //
// @dart = 2.12 // @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
// ignore_for_file: UNDEFINED_SHOWN_NAME // ignore_for_file: annotate_overrides, camel_case_types
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core; import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb; import 'package:protobuf/protobuf.dart' as $pb;
class ReleasePhase extends $pb.ProtobufEnum { class ReleasePhase extends $pb.ProtobufEnum {
static const ReleasePhase APPLY_ENGINE_CHERRYPICKS = static const ReleasePhase APPLY_ENGINE_CHERRYPICKS =
ReleasePhase._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'APPLY_ENGINE_CHERRYPICKS'); ReleasePhase._(0, _omitEnumNames ? '' : 'APPLY_ENGINE_CHERRYPICKS');
static const ReleasePhase CODESIGN_ENGINE_BINARIES = static const ReleasePhase VERIFY_ENGINE_CI = ReleasePhase._(1, _omitEnumNames ? '' : 'VERIFY_ENGINE_CI');
ReleasePhase._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CODESIGN_ENGINE_BINARIES'); static const ReleasePhase APPLY_FRAMEWORK_CHERRYPICKS =
static const ReleasePhase APPLY_FRAMEWORK_CHERRYPICKS = ReleasePhase._( ReleasePhase._(2, _omitEnumNames ? '' : 'APPLY_FRAMEWORK_CHERRYPICKS');
2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'APPLY_FRAMEWORK_CHERRYPICKS'); static const ReleasePhase PUBLISH_VERSION = ReleasePhase._(3, _omitEnumNames ? '' : 'PUBLISH_VERSION');
static const ReleasePhase PUBLISH_VERSION = static const ReleasePhase VERIFY_RELEASE = ReleasePhase._(5, _omitEnumNames ? '' : 'VERIFY_RELEASE');
ReleasePhase._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PUBLISH_VERSION'); static const ReleasePhase RELEASE_COMPLETED = ReleasePhase._(6, _omitEnumNames ? '' : 'RELEASE_COMPLETED');
static const ReleasePhase PUBLISH_CHANNEL =
ReleasePhase._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PUBLISH_CHANNEL');
static const ReleasePhase VERIFY_RELEASE =
ReleasePhase._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VERIFY_RELEASE');
static const ReleasePhase RELEASE_COMPLETED =
ReleasePhase._(6, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RELEASE_COMPLETED');
static const $core.List<ReleasePhase> values = <ReleasePhase>[ static const $core.List<ReleasePhase> values = <ReleasePhase>[
APPLY_ENGINE_CHERRYPICKS, APPLY_ENGINE_CHERRYPICKS,
CODESIGN_ENGINE_BINARIES, VERIFY_ENGINE_CI,
APPLY_FRAMEWORK_CHERRYPICKS, APPLY_FRAMEWORK_CHERRYPICKS,
PUBLISH_VERSION, PUBLISH_VERSION,
PUBLISH_CHANNEL,
VERIFY_RELEASE, VERIFY_RELEASE,
RELEASE_COMPLETED, RELEASE_COMPLETED,
]; ];
...@@ -46,14 +43,11 @@ class ReleasePhase extends $pb.ProtobufEnum { ...@@ -46,14 +43,11 @@ class ReleasePhase extends $pb.ProtobufEnum {
} }
class CherrypickState extends $pb.ProtobufEnum { class CherrypickState extends $pb.ProtobufEnum {
static const CherrypickState PENDING = static const CherrypickState PENDING = CherrypickState._(0, _omitEnumNames ? '' : 'PENDING');
CherrypickState._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PENDING');
static const CherrypickState PENDING_WITH_CONFLICT = static const CherrypickState PENDING_WITH_CONFLICT =
CherrypickState._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PENDING_WITH_CONFLICT'); CherrypickState._(1, _omitEnumNames ? '' : 'PENDING_WITH_CONFLICT');
static const CherrypickState COMPLETED = static const CherrypickState COMPLETED = CherrypickState._(2, _omitEnumNames ? '' : 'COMPLETED');
CherrypickState._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'COMPLETED'); static const CherrypickState ABANDONED = CherrypickState._(3, _omitEnumNames ? '' : 'ABANDONED');
static const CherrypickState ABANDONED =
CherrypickState._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ABANDONED');
static const $core.List<CherrypickState> values = <CherrypickState>[ static const $core.List<CherrypickState> values = <CherrypickState>[
PENDING, PENDING,
...@@ -69,14 +63,10 @@ class CherrypickState extends $pb.ProtobufEnum { ...@@ -69,14 +63,10 @@ class CherrypickState extends $pb.ProtobufEnum {
} }
class ReleaseType extends $pb.ProtobufEnum { class ReleaseType extends $pb.ProtobufEnum {
static const ReleaseType STABLE_INITIAL = static const ReleaseType STABLE_INITIAL = ReleaseType._(0, _omitEnumNames ? '' : 'STABLE_INITIAL');
ReleaseType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'STABLE_INITIAL'); static const ReleaseType STABLE_HOTFIX = ReleaseType._(1, _omitEnumNames ? '' : 'STABLE_HOTFIX');
static const ReleaseType STABLE_HOTFIX = static const ReleaseType BETA_INITIAL = ReleaseType._(2, _omitEnumNames ? '' : 'BETA_INITIAL');
ReleaseType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'STABLE_HOTFIX'); static const ReleaseType BETA_HOTFIX = ReleaseType._(3, _omitEnumNames ? '' : 'BETA_HOTFIX');
static const ReleaseType BETA_INITIAL =
ReleaseType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'BETA_INITIAL');
static const ReleaseType BETA_HOTFIX =
ReleaseType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'BETA_HOTFIX');
static const $core.List<ReleaseType> values = <ReleaseType>[ static const $core.List<ReleaseType> values = <ReleaseType>[
STABLE_INITIAL, STABLE_INITIAL,
...@@ -90,3 +80,5 @@ class ReleaseType extends $pb.ProtobufEnum { ...@@ -90,3 +80,5 @@ class ReleaseType extends $pb.ProtobufEnum {
const ReleaseType._($core.int v, $core.String n) : super(v, n); const ReleaseType._($core.int v, $core.String n) : super(v, n);
} }
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');
...@@ -2,123 +2,157 @@ ...@@ -2,123 +2,157 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
/// //
// Generated code. Do not modify. // Generated code. Do not modify.
// source: conductor_state.proto // source: conductor_state.proto
// //
// @dart = 2.12 // @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
import 'dart:core' as $core; // ignore_for_file: annotate_overrides, camel_case_types
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:convert' as $convert; import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data; import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use releasePhaseDescriptor instead') @$core.Deprecated('Use releasePhaseDescriptor instead')
const ReleasePhase$json = const { const ReleasePhase$json = {
'1': 'ReleasePhase', '1': 'ReleasePhase',
'2': const [ '2': [
const {'1': 'APPLY_ENGINE_CHERRYPICKS', '2': 0}, {'1': 'APPLY_ENGINE_CHERRYPICKS', '2': 0},
const {'1': 'CODESIGN_ENGINE_BINARIES', '2': 1}, {'1': 'VERIFY_ENGINE_CI', '2': 1},
const {'1': 'APPLY_FRAMEWORK_CHERRYPICKS', '2': 2}, {'1': 'APPLY_FRAMEWORK_CHERRYPICKS', '2': 2},
const {'1': 'PUBLISH_VERSION', '2': 3}, {'1': 'PUBLISH_VERSION', '2': 3},
const {'1': 'PUBLISH_CHANNEL', '2': 4}, {'1': 'VERIFY_RELEASE', '2': 5},
const {'1': 'VERIFY_RELEASE', '2': 5}, {'1': 'RELEASE_COMPLETED', '2': 6},
const {'1': 'RELEASE_COMPLETED', '2': 6}, ],
'4': [
{'1': 4, '2': 4},
], ],
}; };
/// Descriptor for `ReleasePhase`. Decode as a `google.protobuf.EnumDescriptorProto`. /// Descriptor for `ReleasePhase`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List releasePhaseDescriptor = $convert.base64Decode( final $typed_data.Uint8List releasePhaseDescriptor =
'CgxSZWxlYXNlUGhhc2USHAoYQVBQTFlfRU5HSU5FX0NIRVJSWVBJQ0tTEAASHAoYQ09ERVNJR05fRU5HSU5FX0JJTkFSSUVTEAESHwobQVBQTFlfRlJBTUVXT1JLX0NIRVJSWVBJQ0tTEAISEwoPUFVCTElTSF9WRVJTSU9OEAMSEwoPUFVCTElTSF9DSEFOTkVMEAQSEgoOVkVSSUZZX1JFTEVBU0UQBRIVChFSRUxFQVNFX0NPTVBMRVRFRBAG'); $convert.base64Decode('CgxSZWxlYXNlUGhhc2USHAoYQVBQTFlfRU5HSU5FX0NIRVJSWVBJQ0tTEAASFAoQVkVSSUZZX0'
'VOR0lORV9DSRABEh8KG0FQUExZX0ZSQU1FV09SS19DSEVSUllQSUNLUxACEhMKD1BVQkxJU0hf'
'VkVSU0lPThADEhIKDlZFUklGWV9SRUxFQVNFEAUSFQoRUkVMRUFTRV9DT01QTEVURUQQBiIECA'
'QQBA==');
@$core.Deprecated('Use cherrypickStateDescriptor instead') @$core.Deprecated('Use cherrypickStateDescriptor instead')
const CherrypickState$json = const { const CherrypickState$json = {
'1': 'CherrypickState', '1': 'CherrypickState',
'2': const [ '2': [
const {'1': 'PENDING', '2': 0}, {'1': 'PENDING', '2': 0},
const {'1': 'PENDING_WITH_CONFLICT', '2': 1}, {'1': 'PENDING_WITH_CONFLICT', '2': 1},
const {'1': 'COMPLETED', '2': 2}, {'1': 'COMPLETED', '2': 2},
const {'1': 'ABANDONED', '2': 3}, {'1': 'ABANDONED', '2': 3},
], ],
}; };
/// Descriptor for `CherrypickState`. Decode as a `google.protobuf.EnumDescriptorProto`. /// Descriptor for `CherrypickState`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List cherrypickStateDescriptor = $convert.base64Decode( final $typed_data.Uint8List cherrypickStateDescriptor =
'Cg9DaGVycnlwaWNrU3RhdGUSCwoHUEVORElORxAAEhkKFVBFTkRJTkdfV0lUSF9DT05GTElDVBABEg0KCUNPTVBMRVRFRBACEg0KCUFCQU5ET05FRBAD'); $convert.base64Decode('Cg9DaGVycnlwaWNrU3RhdGUSCwoHUEVORElORxAAEhkKFVBFTkRJTkdfV0lUSF9DT05GTElDVB'
'ABEg0KCUNPTVBMRVRFRBACEg0KCUFCQU5ET05FRBAD');
@$core.Deprecated('Use releaseTypeDescriptor instead') @$core.Deprecated('Use releaseTypeDescriptor instead')
const ReleaseType$json = const { const ReleaseType$json = {
'1': 'ReleaseType', '1': 'ReleaseType',
'2': const [ '2': [
const {'1': 'STABLE_INITIAL', '2': 0}, {'1': 'STABLE_INITIAL', '2': 0},
const {'1': 'STABLE_HOTFIX', '2': 1}, {'1': 'STABLE_HOTFIX', '2': 1},
const {'1': 'BETA_INITIAL', '2': 2}, {'1': 'BETA_INITIAL', '2': 2},
const {'1': 'BETA_HOTFIX', '2': 3}, {'1': 'BETA_HOTFIX', '2': 3},
], ],
}; };
/// Descriptor for `ReleaseType`. Decode as a `google.protobuf.EnumDescriptorProto`. /// Descriptor for `ReleaseType`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List releaseTypeDescriptor = $convert.base64Decode( final $typed_data.Uint8List releaseTypeDescriptor =
'CgtSZWxlYXNlVHlwZRISCg5TVEFCTEVfSU5JVElBTBAAEhEKDVNUQUJMRV9IT1RGSVgQARIQCgxCRVRBX0lOSVRJQUwQAhIPCgtCRVRBX0hPVEZJWBAD'); $convert.base64Decode('CgtSZWxlYXNlVHlwZRISCg5TVEFCTEVfSU5JVElBTBAAEhEKDVNUQUJMRV9IT1RGSVgQARIQCg'
'xCRVRBX0lOSVRJQUwQAhIPCgtCRVRBX0hPVEZJWBAD');
@$core.Deprecated('Use remoteDescriptor instead') @$core.Deprecated('Use remoteDescriptor instead')
const Remote$json = const { const Remote$json = {
'1': 'Remote', '1': 'Remote',
'2': const [ '2': [
const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'}, {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
const {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'}, {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},
], ],
}; };
/// Descriptor for `Remote`. Decode as a `google.protobuf.DescriptorProto`. /// Descriptor for `Remote`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List remoteDescriptor = final $typed_data.Uint8List remoteDescriptor =
$convert.base64Decode('CgZSZW1vdGUSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybA=='); $convert.base64Decode('CgZSZW1vdGUSEgoEbmFtZRgBIAEoCVIEbmFtZRIQCgN1cmwYAiABKAlSA3VybA==');
@$core.Deprecated('Use cherrypickDescriptor instead') @$core.Deprecated('Use cherrypickDescriptor instead')
const Cherrypick$json = const { const Cherrypick$json = {
'1': 'Cherrypick', '1': 'Cherrypick',
'2': const [ '2': [
const {'1': 'trunkRevision', '3': 1, '4': 1, '5': 9, '10': 'trunkRevision'}, {'1': 'trunkRevision', '3': 1, '4': 1, '5': 9, '10': 'trunkRevision'},
const {'1': 'appliedRevision', '3': 2, '4': 1, '5': 9, '10': 'appliedRevision'}, {'1': 'appliedRevision', '3': 2, '4': 1, '5': 9, '10': 'appliedRevision'},
const {'1': 'state', '3': 3, '4': 1, '5': 14, '6': '.conductor_state.CherrypickState', '10': 'state'}, {'1': 'state', '3': 3, '4': 1, '5': 14, '6': '.conductor_state.CherrypickState', '10': 'state'},
], ],
}; };
/// Descriptor for `Cherrypick`. Decode as a `google.protobuf.DescriptorProto`. /// Descriptor for `Cherrypick`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List cherrypickDescriptor = $convert.base64Decode( final $typed_data.Uint8List cherrypickDescriptor =
'CgpDaGVycnlwaWNrEiQKDXRydW5rUmV2aXNpb24YASABKAlSDXRydW5rUmV2aXNpb24SKAoPYXBwbGllZFJldmlzaW9uGAIgASgJUg9hcHBsaWVkUmV2aXNpb24SNgoFc3RhdGUYAyABKA4yIC5jb25kdWN0b3Jfc3RhdGUuQ2hlcnJ5cGlja1N0YXRlUgVzdGF0ZQ=='); $convert.base64Decode('CgpDaGVycnlwaWNrEiQKDXRydW5rUmV2aXNpb24YASABKAlSDXRydW5rUmV2aXNpb24SKAoPYX'
'BwbGllZFJldmlzaW9uGAIgASgJUg9hcHBsaWVkUmV2aXNpb24SNgoFc3RhdGUYAyABKA4yIC5j'
'b25kdWN0b3Jfc3RhdGUuQ2hlcnJ5cGlja1N0YXRlUgVzdGF0ZQ==');
@$core.Deprecated('Use repositoryDescriptor instead') @$core.Deprecated('Use repositoryDescriptor instead')
const Repository$json = const { const Repository$json = {
'1': 'Repository', '1': 'Repository',
'2': const [ '2': [
const {'1': 'candidateBranch', '3': 1, '4': 1, '5': 9, '10': 'candidateBranch'}, {'1': 'candidateBranch', '3': 1, '4': 1, '5': 9, '10': 'candidateBranch'},
const {'1': 'startingGitHead', '3': 2, '4': 1, '5': 9, '10': 'startingGitHead'}, {'1': 'startingGitHead', '3': 2, '4': 1, '5': 9, '10': 'startingGitHead'},
const {'1': 'currentGitHead', '3': 3, '4': 1, '5': 9, '10': 'currentGitHead'}, {'1': 'currentGitHead', '3': 3, '4': 1, '5': 9, '10': 'currentGitHead'},
const {'1': 'checkoutPath', '3': 4, '4': 1, '5': 9, '10': 'checkoutPath'}, {'1': 'checkoutPath', '3': 4, '4': 1, '5': 9, '10': 'checkoutPath'},
const {'1': 'upstream', '3': 5, '4': 1, '5': 11, '6': '.conductor_state.Remote', '10': 'upstream'}, {'1': 'upstream', '3': 5, '4': 1, '5': 11, '6': '.conductor_state.Remote', '10': 'upstream'},
const {'1': 'mirror', '3': 6, '4': 1, '5': 11, '6': '.conductor_state.Remote', '10': 'mirror'}, {'1': 'mirror', '3': 6, '4': 1, '5': 11, '6': '.conductor_state.Remote', '10': 'mirror'},
const {'1': 'cherrypicks', '3': 7, '4': 3, '5': 11, '6': '.conductor_state.Cherrypick', '10': 'cherrypicks'}, {'1': 'cherrypicks', '3': 7, '4': 3, '5': 11, '6': '.conductor_state.Cherrypick', '10': 'cherrypicks'},
const {'1': 'dartRevision', '3': 8, '4': 1, '5': 9, '10': 'dartRevision'}, {'1': 'dartRevision', '3': 8, '4': 1, '5': 9, '10': 'dartRevision'},
const {'1': 'workingBranch', '3': 9, '4': 1, '5': 9, '10': 'workingBranch'}, {'1': 'workingBranch', '3': 9, '4': 1, '5': 9, '10': 'workingBranch'},
], ],
}; };
/// Descriptor for `Repository`. Decode as a `google.protobuf.DescriptorProto`. /// Descriptor for `Repository`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List repositoryDescriptor = $convert.base64Decode( final $typed_data.Uint8List repositoryDescriptor =
'CgpSZXBvc2l0b3J5EigKD2NhbmRpZGF0ZUJyYW5jaBgBIAEoCVIPY2FuZGlkYXRlQnJhbmNoEigKD3N0YXJ0aW5nR2l0SGVhZBgCIAEoCVIPc3RhcnRpbmdHaXRIZWFkEiYKDmN1cnJlbnRHaXRIZWFkGAMgASgJUg5jdXJyZW50R2l0SGVhZBIiCgxjaGVja291dFBhdGgYBCABKAlSDGNoZWNrb3V0UGF0aBIzCgh1cHN0cmVhbRgFIAEoCzIXLmNvbmR1Y3Rvcl9zdGF0ZS5SZW1vdGVSCHVwc3RyZWFtEi8KBm1pcnJvchgGIAEoCzIXLmNvbmR1Y3Rvcl9zdGF0ZS5SZW1vdGVSBm1pcnJvchI9CgtjaGVycnlwaWNrcxgHIAMoCzIbLmNvbmR1Y3Rvcl9zdGF0ZS5DaGVycnlwaWNrUgtjaGVycnlwaWNrcxIiCgxkYXJ0UmV2aXNpb24YCCABKAlSDGRhcnRSZXZpc2lvbhIkCg13b3JraW5nQnJhbmNoGAkgASgJUg13b3JraW5nQnJhbmNo'); $convert.base64Decode('CgpSZXBvc2l0b3J5EigKD2NhbmRpZGF0ZUJyYW5jaBgBIAEoCVIPY2FuZGlkYXRlQnJhbmNoEi'
'gKD3N0YXJ0aW5nR2l0SGVhZBgCIAEoCVIPc3RhcnRpbmdHaXRIZWFkEiYKDmN1cnJlbnRHaXRI'
'ZWFkGAMgASgJUg5jdXJyZW50R2l0SGVhZBIiCgxjaGVja291dFBhdGgYBCABKAlSDGNoZWNrb3'
'V0UGF0aBIzCgh1cHN0cmVhbRgFIAEoCzIXLmNvbmR1Y3Rvcl9zdGF0ZS5SZW1vdGVSCHVwc3Ry'
'ZWFtEi8KBm1pcnJvchgGIAEoCzIXLmNvbmR1Y3Rvcl9zdGF0ZS5SZW1vdGVSBm1pcnJvchI9Cg'
'tjaGVycnlwaWNrcxgHIAMoCzIbLmNvbmR1Y3Rvcl9zdGF0ZS5DaGVycnlwaWNrUgtjaGVycnlw'
'aWNrcxIiCgxkYXJ0UmV2aXNpb24YCCABKAlSDGRhcnRSZXZpc2lvbhIkCg13b3JraW5nQnJhbm'
'NoGAkgASgJUg13b3JraW5nQnJhbmNo');
@$core.Deprecated('Use conductorStateDescriptor instead') @$core.Deprecated('Use conductorStateDescriptor instead')
const ConductorState$json = const { const ConductorState$json = {
'1': 'ConductorState', '1': 'ConductorState',
'2': const [ '2': [
const {'1': 'releaseChannel', '3': 1, '4': 1, '5': 9, '10': 'releaseChannel'}, {'1': 'releaseChannel', '3': 1, '4': 1, '5': 9, '10': 'releaseChannel'},
const {'1': 'releaseVersion', '3': 2, '4': 1, '5': 9, '10': 'releaseVersion'}, {'1': 'releaseVersion', '3': 2, '4': 1, '5': 9, '10': 'releaseVersion'},
const {'1': 'engine', '3': 4, '4': 1, '5': 11, '6': '.conductor_state.Repository', '10': 'engine'}, {'1': 'engine', '3': 4, '4': 1, '5': 11, '6': '.conductor_state.Repository', '10': 'engine'},
const {'1': 'framework', '3': 5, '4': 1, '5': 11, '6': '.conductor_state.Repository', '10': 'framework'}, {'1': 'framework', '3': 5, '4': 1, '5': 11, '6': '.conductor_state.Repository', '10': 'framework'},
const {'1': 'createdDate', '3': 6, '4': 1, '5': 3, '10': 'createdDate'}, {'1': 'createdDate', '3': 6, '4': 1, '5': 3, '10': 'createdDate'},
const {'1': 'lastUpdatedDate', '3': 7, '4': 1, '5': 3, '10': 'lastUpdatedDate'}, {'1': 'lastUpdatedDate', '3': 7, '4': 1, '5': 3, '10': 'lastUpdatedDate'},
const {'1': 'logs', '3': 8, '4': 3, '5': 9, '10': 'logs'}, {'1': 'logs', '3': 8, '4': 3, '5': 9, '10': 'logs'},
const {'1': 'currentPhase', '3': 9, '4': 1, '5': 14, '6': '.conductor_state.ReleasePhase', '10': 'currentPhase'}, {'1': 'currentPhase', '3': 9, '4': 1, '5': 14, '6': '.conductor_state.ReleasePhase', '10': 'currentPhase'},
const {'1': 'conductorVersion', '3': 10, '4': 1, '5': 9, '10': 'conductorVersion'}, {'1': 'conductorVersion', '3': 10, '4': 1, '5': 9, '10': 'conductorVersion'},
const {'1': 'releaseType', '3': 11, '4': 1, '5': 14, '6': '.conductor_state.ReleaseType', '10': 'releaseType'}, {'1': 'releaseType', '3': 11, '4': 1, '5': 14, '6': '.conductor_state.ReleaseType', '10': 'releaseType'},
], ],
}; };
/// Descriptor for `ConductorState`. Decode as a `google.protobuf.DescriptorProto`. /// Descriptor for `ConductorState`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List conductorStateDescriptor = $convert.base64Decode( final $typed_data.Uint8List conductorStateDescriptor =
'Cg5Db25kdWN0b3JTdGF0ZRImCg5yZWxlYXNlQ2hhbm5lbBgBIAEoCVIOcmVsZWFzZUNoYW5uZWwSJgoOcmVsZWFzZVZlcnNpb24YAiABKAlSDnJlbGVhc2VWZXJzaW9uEjMKBmVuZ2luZRgEIAEoCzIbLmNvbmR1Y3Rvcl9zdGF0ZS5SZXBvc2l0b3J5UgZlbmdpbmUSOQoJZnJhbWV3b3JrGAUgASgLMhsuY29uZHVjdG9yX3N0YXRlLlJlcG9zaXRvcnlSCWZyYW1ld29yaxIgCgtjcmVhdGVkRGF0ZRgGIAEoA1ILY3JlYXRlZERhdGUSKAoPbGFzdFVwZGF0ZWREYXRlGAcgASgDUg9sYXN0VXBkYXRlZERhdGUSEgoEbG9ncxgIIAMoCVIEbG9ncxJBCgxjdXJyZW50UGhhc2UYCSABKA4yHS5jb25kdWN0b3Jfc3RhdGUuUmVsZWFzZVBoYXNlUgxjdXJyZW50UGhhc2USKgoQY29uZHVjdG9yVmVyc2lvbhgKIAEoCVIQY29uZHVjdG9yVmVyc2lvbhI+CgtyZWxlYXNlVHlwZRgLIAEoDjIcLmNvbmR1Y3Rvcl9zdGF0ZS5SZWxlYXNlVHlwZVILcmVsZWFzZVR5cGU='); $convert.base64Decode('Cg5Db25kdWN0b3JTdGF0ZRImCg5yZWxlYXNlQ2hhbm5lbBgBIAEoCVIOcmVsZWFzZUNoYW5uZW'
'wSJgoOcmVsZWFzZVZlcnNpb24YAiABKAlSDnJlbGVhc2VWZXJzaW9uEjMKBmVuZ2luZRgEIAEo'
'CzIbLmNvbmR1Y3Rvcl9zdGF0ZS5SZXBvc2l0b3J5UgZlbmdpbmUSOQoJZnJhbWV3b3JrGAUgAS'
'gLMhsuY29uZHVjdG9yX3N0YXRlLlJlcG9zaXRvcnlSCWZyYW1ld29yaxIgCgtjcmVhdGVkRGF0'
'ZRgGIAEoA1ILY3JlYXRlZERhdGUSKAoPbGFzdFVwZGF0ZWREYXRlGAcgASgDUg9sYXN0VXBkYX'
'RlZERhdGUSEgoEbG9ncxgIIAMoCVIEbG9ncxJBCgxjdXJyZW50UGhhc2UYCSABKA4yHS5jb25k'
'dWN0b3Jfc3RhdGUuUmVsZWFzZVBoYXNlUgxjdXJyZW50UGhhc2USKgoQY29uZHVjdG9yVmVyc2'
'lvbhgKIAEoCVIQY29uZHVjdG9yVmVyc2lvbhI+CgtyZWxlYXNlVHlwZRgLIAEoDjIcLmNvbmR1'
'Y3Rvcl9zdGF0ZS5SZWxlYXNlVHlwZVILcmVsZWFzZVR5cGU=');
...@@ -2,11 +2,16 @@ ...@@ -2,11 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
/// //
// Generated code. Do not modify. // Generated code. Do not modify.
// source: conductor_state.proto // source: conductor_state.proto
// //
// @dart = 2.12 // @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
// ignore_for_file: annotate_overrides, camel_case_types
// ignore_for_file: constant_identifier_names
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'conductor_state.pb.dart'; export 'conductor_state.pb.dart';
...@@ -11,16 +11,16 @@ message Remote { ...@@ -11,16 +11,16 @@ message Remote {
enum ReleasePhase { enum ReleasePhase {
// Release was started with `conductor start` and repositories cloned. // Release was started with `conductor start` and repositories cloned.
APPLY_ENGINE_CHERRYPICKS = 0; APPLY_ENGINE_CHERRYPICKS = 0;
CODESIGN_ENGINE_BINARIES = 1;
// Verify engine CI is green before opening framework PR.
VERIFY_ENGINE_CI = 1;
APPLY_FRAMEWORK_CHERRYPICKS = 2; APPLY_FRAMEWORK_CHERRYPICKS = 2;
// Git tag applied to framework RC branch HEAD and pushed upstream. // Git tag applied to framework RC branch HEAD and pushed upstream.
PUBLISH_VERSION = 3; PUBLISH_VERSION = 3;
// RC branch HEAD pushed to upstream release branch. reserved 4; // Formerly PUBLISH_CHANNEL, merged into PUBLISH_VERSION.
//
// For example, flutter-1.2-candidate.3 -> upstream/beta
PUBLISH_CHANNEL = 4;
// Package artifacts verified to exist on cloud storage. // Package artifacts verified to exist on cloud storage.
VERIFY_RELEASE = 5; VERIFY_RELEASE = 5;
......
...@@ -310,16 +310,24 @@ class StartContext extends Context { ...@@ -310,16 +310,24 @@ class StartContext extends Context {
} }
final String engineHead = await engine.reverseParse('HEAD'); final String engineHead = await engine.reverseParse('HEAD');
state.engine = pb.Repository( state.engine = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
workingBranch: workingBranchName, ..workingBranch = workingBranchName
startingGitHead: engineHead, ..startingGitHead = engineHead
currentGitHead: engineHead, ..currentGitHead = engineHead
checkoutPath: (await engine.checkoutDirectory).path, ..checkoutPath = (await engine.checkoutDirectory).path
dartRevision: dartRevision, ..upstream = (pb.Remote.create()
upstream: pb.Remote(name: 'upstream', url: engine.upstreamRemote.url), ..name = 'upstream'
mirror: pb.Remote(name: 'mirror', url: engine.mirrorRemote!.url), ..url = engine.upstreamRemote.url
)
..mirror = (pb.Remote.create()
..name = 'mirror'
..url = engine.mirrorRemote!.url
)
); );
if (dartRevision != null && dartRevision!.isNotEmpty) {
state.engine.dartRevision = dartRevision!;
}
await framework.newBranch(workingBranchName); await framework.newBranch(workingBranchName);
...@@ -362,14 +370,20 @@ class StartContext extends Context { ...@@ -362,14 +370,20 @@ class StartContext extends Context {
state.releaseVersion = nextVersion.toString(); state.releaseVersion = nextVersion.toString();
state.framework = pb.Repository( state.framework = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
workingBranch: workingBranchName, ..workingBranch = workingBranchName
startingGitHead: frameworkHead, ..startingGitHead = frameworkHead
currentGitHead: frameworkHead, ..currentGitHead = frameworkHead
checkoutPath: (await framework.checkoutDirectory).path, ..checkoutPath = (await framework.checkoutDirectory).path
upstream: pb.Remote(name: 'upstream', url: framework.upstreamRemote.url), ..upstream = (pb.Remote.create()
mirror: pb.Remote(name: 'mirror', url: framework.mirrorRemote!.url), ..name = 'upstream'
..url = framework.upstreamRemote.url
)
..mirror = (pb.Remote.create()
..name = 'mirror'
..url = framework.mirrorRemote!.url
)
); );
state.currentPhase = ReleasePhase.APPLY_ENGINE_CHERRYPICKS; state.currentPhase = ReleasePhase.APPLY_ENGINE_CHERRYPICKS;
......
...@@ -50,7 +50,7 @@ const String stablePostReleaseMsg = """ ...@@ -50,7 +50,7 @@ const String stablePostReleaseMsg = """
String luciConsoleLink(String channel, String groupName) { String luciConsoleLink(String channel, String groupName) {
assert( assert(
globals.kReleaseChannels.contains(channel), globals.kReleaseChannels.contains(channel),
'channel $channel not recognized', 'channel "$channel" not recognized',
); );
assert( assert(
<String>['flutter', 'engine', 'packaging'].contains(groupName), <String>['flutter', 'engine', 'packaging'].contains(groupName),
...@@ -177,10 +177,10 @@ String phaseInstructions(pb.ConductorState state) { ...@@ -177,10 +177,10 @@ String phaseInstructions(pb.ConductorState state) {
'\t${cherrypick.trunkRevision}', '\t${cherrypick.trunkRevision}',
'See ${globals.kReleaseDocumentationUrl} for more information.', 'See ${globals.kReleaseDocumentationUrl} for more information.',
].join('\n'); ].join('\n');
case ReleasePhase.CODESIGN_ENGINE_BINARIES: case ReleasePhase.VERIFY_ENGINE_CI:
if (!requiresEnginePR(state)) { if (!requiresEnginePR(state)) {
return 'You must now codesign the engine binaries for commit ' return 'You must verify engine CI has passed: '
'${state.engine.startingGitHead}.'; '${luciConsoleLink(state.releaseChannel, 'engine')}';
} }
// User's working branch was pushed to their mirror, but a PR needs to be // User's working branch was pushed to their mirror, but a PR needs to be
// opened on GitHub. // opened on GitHub.
...@@ -231,8 +231,6 @@ String phaseInstructions(pb.ConductorState state) { ...@@ -231,8 +231,6 @@ String phaseInstructions(pb.ConductorState state) {
'verify pre-submit CI builds on your pull request are successful, merge your ', 'verify pre-submit CI builds on your pull request are successful, merge your ',
'pull request, validate post-submit CI.', 'pull request, validate post-submit CI.',
].join('\n'); ].join('\n');
case ReleasePhase.PUBLISH_CHANNEL:
return 'Issue `conductor next` to publish your release to the release branch.';
case ReleasePhase.VERIFY_RELEASE: case ReleasePhase.VERIFY_RELEASE:
return 'Release archive packages must be verified on cloud storage: ${luciConsoleLink(state.releaseChannel, 'packaging')}'; return 'Release archive packages must be verified on cloud storage: ${luciConsoleLink(state.releaseChannel, 'packaging')}';
case ReleasePhase.RELEASE_COMPLETED: case ReleasePhase.RELEASE_COMPLETED:
...@@ -286,11 +284,20 @@ String githubAccount(String remoteUrl) { ...@@ -286,11 +284,20 @@ String githubAccount(String remoteUrl) {
/// Will throw a [ConductorException] if [ReleasePhase.RELEASE_COMPLETED] is /// Will throw a [ConductorException] if [ReleasePhase.RELEASE_COMPLETED] is
/// passed as an argument, as there is no next phase. /// passed as an argument, as there is no next phase.
ReleasePhase getNextPhase(ReleasePhase currentPhase) { ReleasePhase getNextPhase(ReleasePhase currentPhase) {
final ReleasePhase? nextPhase = ReleasePhase.valueOf(currentPhase.value + 1); switch (currentPhase) {
if (nextPhase == null) { case ReleasePhase.PUBLISH_VERSION:
throw globals.ConductorException('There is no next ReleasePhase!'); return ReleasePhase.VERIFY_RELEASE;
case ReleasePhase.APPLY_ENGINE_CHERRYPICKS:
case ReleasePhase.VERIFY_ENGINE_CI:
case ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS:
case ReleasePhase.VERIFY_RELEASE:
case ReleasePhase.RELEASE_COMPLETED:
final ReleasePhase? nextPhase = ReleasePhase.valueOf(currentPhase.value + 1);
if (nextPhase != null) {
return nextPhase;
}
} }
return nextPhase; throw globals.ConductorException('There is no next ReleasePhase!');
} }
// Indent two spaces. // Indent two spaces.
......
...@@ -31,25 +31,27 @@ void main() { ...@@ -31,25 +31,27 @@ void main() {
late pb.ConductorState state; late pb.ConductorState state;
setUp(() { setUp(() {
state = pb.ConductorState( state = (pb.ConductorState.create()
engine: pb.Repository( ..engine = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
cherrypicks: <pb.Cherrypick>[ ..cherrypicks.addAll(<pb.Cherrypick>[
pb.Cherrypick(trunkRevision: engineCherrypick1), pb.Cherrypick.create()
pb.Cherrypick(trunkRevision: engineCherrypick2), ..trunkRevision = engineCherrypick1,
], pb.Cherrypick.create()
dartRevision: dartRevision, ..trunkRevision = engineCherrypick2,
workingBranch: workingBranch, ])
), ..dartRevision = dartRevision
framework: pb.Repository( ..workingBranch = workingBranch
candidateBranch: candidateBranch, )
cherrypicks: <pb.Cherrypick>[ ..framework = (pb.Repository.create()
pb.Cherrypick(trunkRevision: frameworkCherrypick), ..candidateBranch = candidateBranch
], ..cherrypicks.add(pb.Cherrypick.create()
workingBranch: workingBranch, ..trunkRevision = frameworkCherrypick
), )
releaseChannel: releaseChannel, ..workingBranch = workingBranch
releaseVersion: releaseVersion, )
..releaseChannel = releaseChannel
..releaseVersion = releaseVersion
); );
}); });
......
...@@ -80,61 +80,7 @@ void main() { ...@@ -80,61 +80,7 @@ void main() {
); );
}); });
group('APPLY_ENGINE_CHERRYPICKS to CODESIGN_ENGINE_BINARIES', () { group('APPLY_ENGINE_CHERRYPICKS to VERIFY_ENGINE_CI', () {
test('does not prompt user and updates currentPhase if there are no engine cherrypicks', () async {
final FakeProcessManager processManager = FakeProcessManager.empty();
final FakePlatform platform = FakePlatform(
environment: <String, String>{
'HOME': <String>['path', 'to', 'home'].join(localPathSeparator),
},
operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator,
);
final File ciYaml = fileSystem.file('$checkoutsParentDirectory/engine/.ci.yaml')
..createSync(recursive: true);
// this branch already present in ciYaml
_initializeCiYamlFile(ciYaml, enabledBranches: <String>[candidateBranch]);
final pb.ConductorState state = pb.ConductorState(
currentPhase: ReleasePhase.APPLY_ENGINE_CHERRYPICKS,
engine: pb.Repository(
candidateBranch: candidateBranch,
checkoutPath: fileSystem.path.join(checkoutsParentDirectory, 'engine'),
workingBranch: workingBranch,
startingGitHead: revision1,
upstream: pb.Remote(name: 'upstream', url: remoteUrl),
),
);
writeStateToFile(
fileSystem.file(stateFile),
state,
<String>[],
);
final Checkouts checkouts = Checkouts(
fileSystem: fileSystem,
parentDirectory: fileSystem.directory(checkoutsParentDirectory)..createSync(recursive: true),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final CommandRunner<void> runner = createRunner(checkouts: checkouts);
await runner.run(<String>[
'next',
'--$kStateOption',
stateFile,
]);
final pb.ConductorState finalState = readStateFromFile(
fileSystem.file(stateFile),
);
expect(processManager, hasNoRemainingExpectations);
expect(finalState.currentPhase, ReleasePhase.CODESIGN_ENGINE_BINARIES);
expect(stdio.error, isEmpty);
expect(
stdio.stdout,
contains('You must now codesign the engine binaries for commit $revision1'));
});
test('confirms to stdout when all engine cherrypicks were auto-applied', () async { test('confirms to stdout when all engine cherrypicks were auto-applied', () async {
stdio.stdin.add('n'); stdio.stdin.add('n');
final File ciYaml = fileSystem.file('$checkoutsParentDirectory/engine/.ci.yaml') final File ciYaml = fileSystem.file('$checkoutsParentDirectory/engine/.ci.yaml')
...@@ -148,21 +94,26 @@ void main() { ...@@ -148,21 +94,26 @@ void main() {
operatingSystem: localOperatingSystem, operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator, pathSeparator: localPathSeparator,
); );
final pb.ConductorState state = pb.ConductorState( final pb.ConductorState state = (pb.ConductorState.create()
engine: pb.Repository( ..releaseChannel = releaseChannel
candidateBranch: candidateBranch, ..engine = (pb.Repository.create()
cherrypicks: <pb.Cherrypick>[ ..candidateBranch = candidateBranch
pb.Cherrypick( ..cherrypicks.add(pb.Cherrypick.create()
trunkRevision: 'abc123', ..trunkRevision ='abc123'
state: pb.CherrypickState.COMPLETED, ..state = pb.CherrypickState.COMPLETED
), )
], ..checkoutPath = fileSystem.path.join(checkoutsParentDirectory, 'engine')
checkoutPath: fileSystem.path.join(checkoutsParentDirectory, 'engine'), ..workingBranch = workingBranch
workingBranch: workingBranch, ..upstream = (pb.Remote.create()
upstream: pb.Remote(name: 'upstream', url: remoteUrl), ..name = 'upstream'
mirror: pb.Remote(name: 'mirror', url: remoteUrl), ..url = remoteUrl
), )
currentPhase: ReleasePhase.APPLY_ENGINE_CHERRYPICKS, ..mirror = (pb.Remote.create()
..name = 'mirror'
..url = remoteUrl
)
)
..currentPhase = ReleasePhase.APPLY_ENGINE_CHERRYPICKS
); );
writeStateToFile( writeStateToFile(
fileSystem.file(stateFile), fileSystem.file(stateFile),
...@@ -215,23 +166,28 @@ void main() { ...@@ -215,23 +166,28 @@ void main() {
operatingSystem: localOperatingSystem, operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator, pathSeparator: localPathSeparator,
); );
final pb.ConductorState state = pb.ConductorState( final pb.ConductorState state = (pb.ConductorState.create()
currentPhase: ReleasePhase.APPLY_ENGINE_CHERRYPICKS, ..currentPhase = ReleasePhase.APPLY_ENGINE_CHERRYPICKS
engine: pb.Repository( ..engine = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
checkoutPath: fileSystem.path.join(checkoutsParentDirectory, 'engine'), ..checkoutPath = fileSystem.path.join(checkoutsParentDirectory, 'engine')
cherrypicks: <pb.Cherrypick>[ ..cherrypicks.add(
pb.Cherrypick( pb.Cherrypick.create()
trunkRevision: revision2, ..trunkRevision = revision2
state: pb.CherrypickState.PENDING, ..state = pb.CherrypickState.PENDING
), )
], ..workingBranch = workingBranch
workingBranch: workingBranch, ..upstream = (pb.Remote.create()
upstream: pb.Remote(name: 'upstream', url: remoteUrl), ..name = 'upstream'
mirror: pb.Remote(name: 'mirror', url: remoteUrl), ..url = remoteUrl
), )
releaseChannel: releaseChannel, ..mirror = (pb.Remote.create()
releaseVersion: releaseVersion, ..name = 'mirror'
..url = remoteUrl
)
)
..releaseChannel = releaseChannel
..releaseVersion = releaseVersion
); );
writeStateToFile( writeStateToFile(
fileSystem.file(stateFile), fileSystem.file(stateFile),
...@@ -264,27 +220,27 @@ void main() { ...@@ -264,27 +220,27 @@ void main() {
contains('You must now open a pull request at https://github.com/flutter/engine/compare/flutter-1.2-candidate.3...org:cherrypicks-flutter-1.2-candidate.3?expand=1')); contains('You must now open a pull request at https://github.com/flutter/engine/compare/flutter-1.2-candidate.3...org:cherrypicks-flutter-1.2-candidate.3?expand=1'));
expect(stdio.stdout, contains( expect(stdio.stdout, contains(
'Are you ready to push your engine branch to the repository $remoteUrl? (y/n) ')); 'Are you ready to push your engine branch to the repository $remoteUrl? (y/n) '));
expect(finalState.currentPhase, ReleasePhase.CODESIGN_ENGINE_BINARIES); expect(finalState.currentPhase, ReleasePhase.VERIFY_ENGINE_CI);
expect(stdio.error, isEmpty); expect(stdio.error, isEmpty);
}); });
}); });
group('CODESIGN_ENGINE_BINARIES to APPLY_FRAMEWORK_CHERRYPICKS', () { group('VERIFY_ENGINE_CI to APPLY_FRAMEWORK_CHERRYPICKS', () {
late pb.ConductorState state; late pb.ConductorState state;
late FakeProcessManager processManager; late FakeProcessManager processManager;
late FakePlatform platform; late FakePlatform platform;
setUp(() { setUp(() {
state = pb.ConductorState( state = (pb.ConductorState.create()
engine: pb.Repository( ..releaseChannel = releaseChannel
cherrypicks: <pb.Cherrypick>[ ..engine = (pb.Repository.create()
pb.Cherrypick( ..cherrypicks.add(
trunkRevision: 'abc123', pb.Cherrypick.create()
state: pb.CherrypickState.PENDING, ..trunkRevision = 'abc123'
), ..state = pb.CherrypickState.PENDING
], )
), )
currentPhase: ReleasePhase.CODESIGN_ENGINE_BINARIES, ..currentPhase = ReleasePhase.VERIFY_ENGINE_CI
); );
processManager = FakeProcessManager.empty(); processManager = FakeProcessManager.empty();
...@@ -324,8 +280,8 @@ void main() { ...@@ -324,8 +280,8 @@ void main() {
); );
expect(processManager, hasNoRemainingExpectations); expect(processManager, hasNoRemainingExpectations);
expect(stdio.stdout, contains('Has CI passed for the engine PR and binaries been codesigned? (y/n) ')); expect(stdio.stdout, contains('Has CI passed for the engine PR?'));
expect(finalState.currentPhase, ReleasePhase.CODESIGN_ENGINE_BINARIES); expect(finalState.currentPhase, ReleasePhase.VERIFY_ENGINE_CI);
expect(stdio.error.contains('Aborting command.'), true); expect(stdio.error.contains('Aborting command.'), true);
}); });
...@@ -362,7 +318,7 @@ void main() { ...@@ -362,7 +318,7 @@ void main() {
); );
expect(processManager, hasNoRemainingExpectations); expect(processManager, hasNoRemainingExpectations);
expect(stdio.stdout, contains('Has CI passed for the engine PR and binaries been codesigned? (y/n) ')); expect(stdio.stdout, contains('Has CI passed for the engine PR?'));
expect(finalState.currentPhase, ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS); expect(finalState.currentPhase, ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS);
}); });
}); });
...@@ -388,30 +344,38 @@ void main() { ...@@ -388,30 +344,38 @@ void main() {
operatingSystem: localOperatingSystem, operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator, pathSeparator: localPathSeparator,
); );
state = pb.ConductorState( state = (pb.ConductorState.create()
releaseChannel: releaseChannel, ..releaseChannel = releaseChannel
releaseVersion: releaseVersion, ..releaseVersion = releaseVersion
framework: pb.Repository( ..framework = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
checkoutPath: frameworkCheckoutPath, ..checkoutPath = frameworkCheckoutPath
cherrypicks: <pb.Cherrypick>[ ..cherrypicks.add(
pb.Cherrypick( pb.Cherrypick.create()
trunkRevision: frameworkCherrypick, ..trunkRevision = frameworkCherrypick
state: pb.CherrypickState.PENDING, ..state = pb.CherrypickState.PENDING
), )
], ..mirror = (pb.Remote.create()
mirror: pb.Remote(name: 'mirror', url: mirrorRemoteUrl), ..name = 'mirror'
upstream: pb.Remote(name: 'upstream', url: upstreamRemoteUrl), ..url = mirrorRemoteUrl
workingBranch: workingBranch, )
), ..upstream = (pb.Remote.create()
engine: pb.Repository( ..name = 'upstream'
candidateBranch: candidateBranch, ..url = upstreamRemoteUrl
checkoutPath: engineCheckoutPath, )
dartRevision: 'cdef0123', ..workingBranch = workingBranch
workingBranch: workingBranch, )
upstream: pb.Remote(name: 'upstream', url: engineUpstreamRemoteUrl), ..engine = (pb.Repository.create()
), ..candidateBranch = candidateBranch
currentPhase: ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS, ..checkoutPath = engineCheckoutPath
..dartRevision = 'cdef0123'
..workingBranch = workingBranch
..upstream = (pb.Remote.create()
..name = 'upstream'
..url = engineUpstreamRemoteUrl
)
)
..currentPhase = ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS
); );
// create engine repo // create engine repo
fileSystem.directory(engineCheckoutPath).createSync(recursive: true); fileSystem.directory(engineCheckoutPath).createSync(recursive: true);
...@@ -475,23 +439,32 @@ void main() { ...@@ -475,23 +439,32 @@ void main() {
stdout: revision4, stdout: revision4,
), ),
]); ]);
final pb.ConductorState state = pb.ConductorState( final pb.ConductorState state = (pb.ConductorState.create()
releaseChannel: releaseChannel, ..releaseChannel = releaseChannel
releaseVersion: releaseVersion, ..releaseVersion = releaseVersion
currentPhase: ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS, ..currentPhase = ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS
framework: pb.Repository( ..framework = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
checkoutPath: frameworkCheckoutPath, ..checkoutPath = frameworkCheckoutPath
mirror: pb.Remote(name: 'mirror', url: mirrorRemoteUrl), ..mirror = (pb.Remote.create()
upstream: pb.Remote(name: 'upstream', url: upstreamRemoteUrl), ..name = 'mirror'
workingBranch: workingBranch, ..url = mirrorRemoteUrl
), )
engine: pb.Repository( ..upstream = (pb.Remote.create()
candidateBranch: candidateBranch, ..name = 'upstream'
checkoutPath: engineCheckoutPath, ..url = upstreamRemoteUrl
upstream: pb.Remote(name: 'upstream', url: engineUpstreamRemoteUrl), )
currentGitHead: revision1, ..workingBranch = workingBranch
), )
..engine = (pb.Repository.create()
..candidateBranch = candidateBranch
..checkoutPath = engineCheckoutPath
..upstream = (pb.Remote.create()
..name = 'upstream'
..url = engineUpstreamRemoteUrl
)
..currentGitHead = revision1
)
); );
writeStateToFile( writeStateToFile(
fileSystem.file(stateFile), fileSystem.file(stateFile),
...@@ -568,23 +541,32 @@ void main() { ...@@ -568,23 +541,32 @@ void main() {
stdout: revision4, stdout: revision4,
), ),
]); ]);
final pb.ConductorState state = pb.ConductorState( final pb.ConductorState state = (pb.ConductorState.create()
releaseChannel: releaseChannel, ..releaseChannel = releaseChannel
releaseVersion: releaseVersion, ..releaseVersion = releaseVersion
currentPhase: ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS, ..currentPhase = ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS
framework: pb.Repository( ..framework = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
checkoutPath: frameworkCheckoutPath, ..checkoutPath = frameworkCheckoutPath
mirror: pb.Remote(name: 'mirror', url: mirrorRemoteUrl), ..mirror = (pb.Remote.create()
upstream: pb.Remote(name: 'upstream', url: upstreamRemoteUrl), ..name = 'mirror'
workingBranch: workingBranch, ..url = mirrorRemoteUrl
), )
engine: pb.Repository( ..upstream = (pb.Remote.create()
candidateBranch: candidateBranch, ..name = 'upstream'
checkoutPath: engineCheckoutPath, ..url = upstreamRemoteUrl
upstream: pb.Remote(name: 'upstream', url: engineUpstreamRemoteUrl), )
dartRevision: 'abc123', ..workingBranch = workingBranch
), )
..engine = (pb.Repository.create()
..candidateBranch = candidateBranch
..checkoutPath = engineCheckoutPath
..upstream = (pb.Remote.create()
..name = 'upstream'
..url = engineUpstreamRemoteUrl
)
..dartRevision = 'abc123'
)
); );
writeStateToFile( writeStateToFile(
fileSystem.file(stateFile), fileSystem.file(stateFile),
...@@ -788,132 +770,33 @@ void main() { ...@@ -788,132 +770,33 @@ void main() {
}); });
}); });
group('PUBLISH_VERSION to PUBLISH_CHANNEL', () { group('PUBLISH_VERSION to VERIFY_RELEASE', () {
const String remoteName = 'upstream';
const String releaseVersion = '1.2.0-3.0.pre'; const String releaseVersion = '1.2.0-3.0.pre';
late pb.ConductorState state; late pb.ConductorState state;
late FakePlatform platform;
setUp(() { setUp(() {
state = pb.ConductorState( state = (pb.ConductorState.create()
currentPhase: ReleasePhase.PUBLISH_VERSION, ..releaseChannel = releaseChannel
framework: pb.Repository( ..currentPhase = ReleasePhase.PUBLISH_VERSION
candidateBranch: candidateBranch, ..framework = (pb.Repository.create()
upstream: pb.Remote(url: FrameworkRepository.defaultUpstream), ..candidateBranch = candidateBranch
), ..upstream = (pb.Remote.create()
engine: pb.Repository( ..url = FrameworkRepository.defaultUpstream
candidateBranch: candidateBranch, )
upstream: pb.Remote(url: EngineRepository.defaultUpstream), )
), ..engine = (pb.Repository.create()
releaseVersion: releaseVersion, ..candidateBranch = candidateBranch
); ..upstream = (pb.Remote.create()
platform = FakePlatform( ..url = EngineRepository.defaultUpstream
environment: <String, String>{ )
'HOME': <String>['path', 'to', 'home'].join(localPathSeparator), )
}, ..releaseVersion = releaseVersion
operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator,
);
});
test('does not update state.currentPhase if user responds no', () async {
stdio.stdin.add('n');
final FakeProcessManager processManager = FakeProcessManager.list(
<FakeCommand>[
// Framework checkout
const FakeCommand(
command: <String>['git', 'fetch', 'upstream'],
),
const FakeCommand(
command: <String>['git', 'checkout', '$remoteName/$candidateBranch'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', 'HEAD'],
stdout: revision1,
),
// Engine checkout
const FakeCommand(
command: <String>['git', 'fetch', 'upstream'],
),
const FakeCommand(
command: <String>['git', 'checkout', '$remoteName/$candidateBranch'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', 'HEAD'],
stdout: revision1,
),
],
);
writeStateToFile(
fileSystem.file(stateFile),
state,
<String>[],
);
final Checkouts checkouts = Checkouts(
fileSystem: fileSystem,
parentDirectory: fileSystem.directory(checkoutsParentDirectory)..createSync(recursive: true),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final CommandRunner<void> runner = createRunner(checkouts: checkouts);
await runner.run(<String>[
'next',
'--$kStateOption',
stateFile,
]);
final pb.ConductorState finalState = readStateFromFile(
fileSystem.file(stateFile),
); );
expect(processManager, hasNoRemainingExpectations);
expect(stdio.stdout, contains('Are you ready to tag commit $revision1 as $releaseVersion'));
expect(stdio.error, contains('Aborting command.'));
expect(finalState.currentPhase, ReleasePhase.PUBLISH_VERSION);
expect(finalState.logs, stdio.logs);
}); });
test('updates state.currentPhase if user responds yes', () async { test('gives push command and updates state.currentPhase', () async {
stdio.stdin.add('y'); stdio.stdin.add('y');
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[ final FakeProcessManager processManager = FakeProcessManager.empty();
// Framework checkout
const FakeCommand(
command: <String>['git', 'fetch', 'upstream'],
),
const FakeCommand(
command: <String>['git', 'checkout', '$remoteName/$candidateBranch'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', 'HEAD'],
stdout: revision1,
),
// Engine checkout
const FakeCommand(
command: <String>['git', 'fetch', 'upstream'],
),
const FakeCommand(
command: <String>['git', 'checkout', '$remoteName/$candidateBranch'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', 'HEAD'],
stdout: revision2,
),
// Framework tag
const FakeCommand(
command: <String>['git', 'tag', releaseVersion, revision1],
),
const FakeCommand(
command: <String>['git', 'push', remoteName, releaseVersion],
),
// Engine tag
const FakeCommand(
command: <String>['git', 'tag', releaseVersion, revision2],
),
const FakeCommand(
command: <String>['git', 'push', remoteName, releaseVersion],
),
]);
final FakePlatform platform = FakePlatform( final FakePlatform platform = FakePlatform(
environment: <String, String>{ environment: <String, String>{
'HOME': <String>['path', 'to', 'home'].join(localPathSeparator), 'HOME': <String>['path', 'to', 'home'].join(localPathSeparator),
...@@ -945,134 +828,12 @@ void main() { ...@@ -945,134 +828,12 @@ void main() {
); );
expect(processManager, hasNoRemainingExpectations); expect(processManager, hasNoRemainingExpectations);
expect(finalState.currentPhase, ReleasePhase.PUBLISH_CHANNEL);
expect(stdio.stdout, contains('Are you ready to tag commit $revision1 as $releaseVersion'));
expect(finalState.logs, stdio.logs);
});
});
group('PUBLISH_CHANNEL to VERIFY_RELEASE', () {
const String remoteName = 'upstream';
late pb.ConductorState state;
late FakePlatform platform;
setUp(() {
state = pb.ConductorState(
currentPhase: ReleasePhase.PUBLISH_CHANNEL,
framework: pb.Repository(
candidateBranch: candidateBranch,
upstream: pb.Remote(url: FrameworkRepository.defaultUpstream),
),
releaseChannel: releaseChannel,
releaseVersion: releaseVersion,
);
platform = FakePlatform(
environment: <String, String>{
'HOME': <String>['path', 'to', 'home'].join(localPathSeparator),
},
operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator,
);
});
test('does not update currentPhase if user responds no', () async {
stdio.stdin.add('n');
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['git', 'fetch', 'upstream'],
),
const FakeCommand(
command: <String>['git', 'checkout', '$remoteName/$candidateBranch'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', 'HEAD'],
stdout: revision1,
),
]);
writeStateToFile(
fileSystem.file(stateFile),
state,
<String>[],
);
final Checkouts checkouts = Checkouts(
fileSystem: fileSystem,
parentDirectory: fileSystem.directory(checkoutsParentDirectory)..createSync(recursive: true),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final CommandRunner<void> runner = createRunner(checkouts: checkouts);
await runner.run(<String>[
'next',
'--$kStateOption',
stateFile,
]);
final pb.ConductorState finalState = readStateFromFile(
fileSystem.file(stateFile),
);
expect(processManager, hasNoRemainingExpectations);
expect(stdio.error, contains('Aborting command.'));
expect(
stdio.stdout,
contains('About to execute command: `git push ${FrameworkRepository.defaultUpstream} $revision1:$releaseChannel`'),
);
expect(finalState.currentPhase, ReleasePhase.PUBLISH_CHANNEL);
});
test('updates currentPhase if user responds yes', () async {
stdio.stdin.add('y');
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>['git', 'fetch', 'upstream'],
),
const FakeCommand(
command: <String>['git', 'checkout', '$remoteName/$candidateBranch'],
),
const FakeCommand(
command: <String>['git', 'rev-parse', 'HEAD'],
stdout: revision1,
),
const FakeCommand(
command: <String>['git', 'push', FrameworkRepository.defaultUpstream, '$revision1:$releaseChannel'],
),
]);
writeStateToFile(
fileSystem.file(stateFile),
state,
<String>[],
);
final Checkouts checkouts = Checkouts(
fileSystem: fileSystem,
parentDirectory: fileSystem.directory(checkoutsParentDirectory)..createSync(recursive: true),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final CommandRunner<void> runner = createRunner(checkouts: checkouts);
await runner.run(<String>[
'next',
'--$kStateOption',
stateFile,
]);
final pb.ConductorState finalState = readStateFromFile(
fileSystem.file(stateFile),
);
expect(processManager, hasNoRemainingExpectations);
expect(stdio.error, isEmpty);
expect(
stdio.stdout,
contains('About to execute command: `git push ${FrameworkRepository.defaultUpstream} $revision1:$releaseChannel`'),
);
expect(
stdio.stdout,
contains(
'Release archive packages must be verified on cloud storage: https://luci-milo.appspot.com/p/dart-internal/g/flutter_packaging/console'),
);
expect(finalState.currentPhase, ReleasePhase.VERIFY_RELEASE); expect(finalState.currentPhase, ReleasePhase.VERIFY_RELEASE);
expect(stdio.stdout, contains('Run the following command, and ask a Googler'));
expect(stdio.stdout, contains(':tag $releaseVersion'));
expect(stdio.stdout, contains(':git_branch ${state.framework.candidateBranch}'));
expect(stdio.stdout, contains(':release_channel ${state.releaseChannel}'));
expect(finalState.logs, stdio.logs);
}); });
}); });
...@@ -1085,9 +846,8 @@ void main() { ...@@ -1085,9 +846,8 @@ void main() {
operatingSystem: localOperatingSystem, operatingSystem: localOperatingSystem,
pathSeparator: localPathSeparator, pathSeparator: localPathSeparator,
); );
final pb.ConductorState state = pb.ConductorState( final pb.ConductorState state = pb.ConductorState.create()
currentPhase: ReleasePhase.RELEASE_COMPLETED, ..currentPhase = ReleasePhase.RELEASE_COMPLETED;
);
writeStateToFile( writeStateToFile(
fileSystem.file(stateFile), fileSystem.file(stateFile),
state, state,
......
...@@ -15,24 +15,23 @@ void main() { ...@@ -15,24 +15,23 @@ void main() {
final File stateFile = fileSystem.file('/path/to/statefile.json') final File stateFile = fileSystem.file('/path/to/statefile.json')
..createSync(recursive: true); ..createSync(recursive: true);
const String candidateBranch = 'flutter-2.3-candidate.0'; const String candidateBranch = 'flutter-2.3-candidate.0';
final pb.ConductorState state = pb.ConductorState( final pb.ConductorState state = pb.ConductorState.create()
releaseChannel: 'stable', ..releaseChannel = 'stable'
releaseVersion: '2.3.4', ..releaseVersion = '2.3.4'
engine: pb.Repository( ..engine = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
upstream: pb.Remote( ..upstream = (pb.Remote.create()
name: 'upstream', ..name = 'upstream'
url: 'git@github.com:flutter/engine.git', ..url = 'git@github.com:flutter/engine.git'
), )
), )
framework: pb.Repository( ..framework = (pb.Repository.create()
candidateBranch: candidateBranch, ..candidateBranch = candidateBranch
upstream: pb.Remote( ..upstream = (pb.Remote.create()
name: 'upstream', ..name = 'upstream'
url: 'git@github.com:flutter/flutter.git', ..url = 'git@github.com:flutter/flutter.git'
), )
), );
);
writeStateToFile( writeStateToFile(
stateFile, stateFile,
state, state,
......
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