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