Skip to content

Commit a3c6a9f

Browse files
committed
Introduce scheduler for publishing
1 parent ffc1659 commit a3c6a9f

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

packages/aft/lib/src/commands/publish_command.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:io';
77
import 'package:aft/aft.dart';
88
import 'package:aft/src/constraints_checker.dart';
99
import 'package:aft/src/options/glob_options.dart';
10+
import 'package:aft/src/publish_scheduler.dart';
1011
import 'package:aws_common/aws_common.dart';
1112
import 'package:collection/collection.dart';
1213
import 'package:graphs/graphs.dart';
@@ -278,11 +279,15 @@ class PublishCommand extends AmplifyCommand with GlobOptions, PublishHelpers {
278279
// ordering, it is okay for later packages to fail. While this means that
279280
// some packages will not be published, it also means that the command
280281
// can be re-run to pick up where it left off.
281-
for (final package in packagesNeedingPublish) {
282-
await prePublish(package);
283-
await publish(package);
284-
await awaitPendingAnalysis(package.name);
285-
}
282+
final scheduler = PublishScheduler(
283+
packages: packagesNeedingPublish,
284+
publishPackage: (package) async {
285+
await prePublish(package);
286+
await publish(package);
287+
},
288+
command: this,
289+
);
290+
await scheduler.run();
286291

287292
stdout.writeln(
288293
dryRun
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import 'package:aft/aft.dart';
5+
6+
/// A function that publishes a single package (e.g. pre-publish checks +
7+
/// actual publish).
8+
typedef PublishPackageFn = Future<void> Function(PackageInfo package);
9+
10+
/// Schedules and executes the publishing of a list of packages in order.
11+
///
12+
/// Packages are published sequentially. After each package is published the
13+
/// scheduler polls for a pending analysis on pub.dev and waits until the
14+
/// analysis is complete before proceeding to the next package.
15+
class PublishScheduler {
16+
PublishScheduler({
17+
required List<PackageInfo> packages,
18+
required PublishPackageFn publishPackage,
19+
required AmplifyCommand command,
20+
}) : _packages = packages,
21+
_publishPackage = publishPackage,
22+
_command = command;
23+
24+
final List<PackageInfo> _packages;
25+
final PublishPackageFn _publishPackage;
26+
final AmplifyCommand _command;
27+
28+
/// Publishes all packages sequentially, awaiting pending analysis between
29+
/// each one.
30+
Future<void> run() async {
31+
for (final package in _packages) {
32+
await _publishPackage(package);
33+
await _command.awaitPendingAnalysis(package.name);
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)