diff --git a/analyze/pubspec.yaml b/analyze/pubspec.yaml
index 8ab3de673..02a920185 100644
--- a/analyze/pubspec.yaml
+++ b/analyze/pubspec.yaml
@@ -12,4 +12,4 @@ dependencies:
dev_dependencies:
mockito: 5.4.4
- test_api: 0.7.0
+ test_api: 0.7.1
diff --git a/app_dart/Dockerfile b/app_dart/Dockerfile
index 6dc15d22f..7e951c5da 100644
--- a/app_dart/Dockerfile
+++ b/app_dart/Dockerfile
@@ -4,7 +4,7 @@
# Dart Docker official images can be found here: https://hub.docker.com/_/dart
-FROM dart:beta@sha256:4d3f64da52b5b7fcb96b0ea94e17c745c4ff7d6eb3d078ac3088fb16d2110f5f
+FROM dart:beta@sha256:7fef8712c268d41081d36a58745872e527c387bf68cf0bbb86e912201e30f3bf
WORKDIR /app
diff --git a/app_dart/lib/cocoon_service.dart b/app_dart/lib/cocoon_service.dart
index b8b3dac2f..f050db2e2 100644
--- a/app_dart/lib/cocoon_service.dart
+++ b/app_dart/lib/cocoon_service.dart
@@ -14,6 +14,7 @@ export 'src/request_handlers/get_build_status_badge.dart';
export 'src/request_handlers/get_release_branches.dart';
export 'src/request_handlers/get_repos.dart';
export 'src/request_handlers/get_status.dart';
+export 'src/request_handlers/get_status_firestore.dart';
export 'src/request_handlers/get_green_commits.dart';
export 'src/request_handlers/github_rate_limit_status.dart';
export 'src/request_handlers/github_webhook.dart';
diff --git a/app_dart/lib/server.dart b/app_dart/lib/server.dart
index 5aa02cfb7..540a3e44b 100644
--- a/app_dart/lib/server.dart
+++ b/app_dart/lib/server.dart
@@ -231,6 +231,12 @@ Server createServer({
delegate: GetStatus(config: config),
),
+ '/api/public/get-status-firestore': CacheRequestHandler
(
+ cache: cache,
+ config: config,
+ delegate: GetStatusFirestore(config: config),
+ ),
+
'/api/public/get-green-commits': GetGreenCommits(config: config),
/// Record GitHub API quota usage in BigQuery.
diff --git a/app_dart/lib/src/model/firestore/commit.dart b/app_dart/lib/src/model/firestore/commit.dart
index a8411d0e5..ccf119a61 100644
--- a/app_dart/lib/src/model/firestore/commit.dart
+++ b/app_dart/lib/src/model/firestore/commit.dart
@@ -18,6 +18,16 @@ const String kCommitMessageField = 'message';
const String kCommitRepositoryPathField = 'repositoryPath';
const String kCommitShaField = 'sha';
+/// Commit Json keys.
+const String kCommitAvatar = 'Avatar';
+const String kCommitAuthor = 'Author';
+const String kCommitBranch = 'Branch';
+const String kCommitCreateTimestamp = 'CreateTimestamp';
+const String kCommitDocumentName = 'DocumentName';
+const String kCommitMessage = 'Message';
+const String kCommitRepositoryPath = 'RepositoryPath';
+const String kCommitSha = 'Sha';
+
class Commit extends Document {
/// Lookup [Commit] from Firestore.
///
@@ -71,6 +81,20 @@ class Commit extends Document {
/// [RepositorySlug] of where this commit exists.
RepositorySlug get slug => RepositorySlug.full(repositoryPath!);
+ @override
+ Map toJson() {
+ return {
+ kCommitDocumentName: name,
+ kCommitRepositoryPath: repositoryPath,
+ kCommitCreateTimestamp: createTimestamp,
+ kCommitSha: sha,
+ kCommitMessage: message,
+ kCommitAuthor: author,
+ kCommitAvatar: avatar,
+ kCommitBranch: branch,
+ };
+ }
+
@override
String toString() {
final StringBuffer buf = StringBuffer()
diff --git a/app_dart/lib/src/model/firestore/commit_tasks_status.dart b/app_dart/lib/src/model/firestore/commit_tasks_status.dart
new file mode 100644
index 000000000..c5bc651d9
--- /dev/null
+++ b/app_dart/lib/src/model/firestore/commit_tasks_status.dart
@@ -0,0 +1,35 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'commit.dart';
+import 'task.dart';
+
+/// Class that holds the status for all tasks corresponding to a particular
+/// commit.
+///
+/// Tasks may still be running, and thus their status is subject to change.
+/// Put another way, this class holds information that is a snapshot in time.
+class CommitTasksStatus {
+ /// Creates a new [CommitTasksStatus].
+ const CommitTasksStatus(this.commit, this.tasks);
+
+ /// The commit against which all the tasks are run.
+ final Commit commit;
+
+ /// Tasks running against the commit.
+ final List tasks;
+}
+
+class SerializableCommitTasksStatus {
+ const SerializableCommitTasksStatus(this.status);
+
+ final CommitTasksStatus status;
+
+ Map toJson() {
+ return {
+ 'Commit': status.commit.toJson(),
+ 'Tasks': status.tasks,
+ };
+ }
+}
diff --git a/app_dart/lib/src/model/firestore/task.dart b/app_dart/lib/src/model/firestore/task.dart
index b0abc6d0e..8af818b60 100644
--- a/app_dart/lib/src/model/firestore/task.dart
+++ b/app_dart/lib/src/model/firestore/task.dart
@@ -26,6 +26,18 @@ const String kTaskStartTimestampField = 'startTimestamp';
const String kTaskStatusField = 'status';
const String kTaskTestFlakyField = 'testFlaky';
+/// Task Json keys.
+const String kTaskAttempts = 'Attempts';
+const String kTaskBringup = 'Bringup';
+const String kTaskBuildNumber = 'BuildNumber';
+const String kTaskCreateTimestamp = 'CreateTimestamp';
+const String kTaskDocumentName = 'DocumentName';
+const String kTaskEndTimestamp = 'EndTimestamp';
+const String kTaskStartTimestamp = 'StartTimestamp';
+const String kTaskStatus = 'Status';
+const String kTaskTaskName = 'TaskName';
+const String kTaskTestFlaky = 'TestFlaky';
+
class Task extends Document {
/// Lookup [Task] from Firestore.
///
@@ -252,6 +264,22 @@ class Task extends Document {
return completedStatuses.contains(status);
}
+ @override
+ Map toJson() {
+ return {
+ kTaskDocumentName: name,
+ kTaskCreateTimestamp: createTimestamp,
+ kTaskStartTimestamp: startTimestamp,
+ kTaskEndTimestamp: endTimestamp,
+ kTaskTaskName: taskName,
+ kTaskAttempts: attempts,
+ kTaskBringup: bringup,
+ kTaskTestFlaky: testFlaky,
+ kTaskBuildNumber: buildNumber,
+ kTaskStatus: status,
+ };
+ }
+
@override
String toString() {
final StringBuffer buf = StringBuffer()
diff --git a/app_dart/lib/src/request_handlers/get_status_firestore.dart b/app_dart/lib/src/request_handlers/get_status_firestore.dart
new file mode 100644
index 000000000..1565f0369
--- /dev/null
+++ b/app_dart/lib/src/request_handlers/get_status_firestore.dart
@@ -0,0 +1,85 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:gcloud/db.dart';
+import 'package:github/github.dart';
+import 'package:meta/meta.dart';
+
+import '../model/appengine/commit.dart';
+import '../model/firestore/commit_tasks_status.dart';
+import '../model/appengine/key_helper.dart';
+import '../request_handling/body.dart';
+import '../request_handling/exceptions.dart';
+import '../request_handling/request_handler.dart';
+import '../service/build_status_provider.dart';
+import '../service/config.dart';
+import '../service/datastore.dart';
+import '../service/firestore.dart';
+
+@immutable
+class GetStatusFirestore extends RequestHandler {
+ const GetStatusFirestore({
+ required super.config,
+ @visibleForTesting this.datastoreProvider = DatastoreService.defaultProvider,
+ @visibleForTesting this.buildStatusProvider = BuildStatusService.defaultProvider,
+ });
+
+ final DatastoreServiceProvider datastoreProvider;
+ final BuildStatusServiceProvider buildStatusProvider;
+
+ static const String kLastCommitKeyParam = 'lastCommitKey';
+ static const String kBranchParam = 'branch';
+ static const String kRepoParam = 'repo';
+
+ @override
+ Future get() async {
+ final String? encodedLastCommitKey = request!.uri.queryParameters[kLastCommitKeyParam];
+ final String repoName = request!.uri.queryParameters[kRepoParam] ?? Config.flutterSlug.name;
+ final RepositorySlug slug = RepositorySlug('flutter', repoName);
+ final String branch = request!.uri.queryParameters[kBranchParam] ?? Config.defaultBranch(slug);
+ final DatastoreService datastore = datastoreProvider(config.db);
+ final FirestoreService firestoreService = await config.createFirestoreService();
+ final BuildStatusService buildStatusService = buildStatusProvider(datastore, firestoreService);
+ final KeyHelper keyHelper = config.keyHelper;
+ final int commitNumber = config.commitNumber;
+ final int lastCommitTimestamp = await _obtainTimestamp(encodedLastCommitKey, keyHelper, datastore);
+
+ final List statuses = await buildStatusService
+ .retrieveCommitStatusFirestore(
+ limit: commitNumber,
+ timestamp: lastCommitTimestamp,
+ branch: branch,
+ slug: slug,
+ )
+ .map(
+ (CommitTasksStatus status) => SerializableCommitTasksStatus(status),
+ )
+ .toList();
+
+ return Body.forJson({
+ 'Statuses': statuses,
+ });
+ }
+
+ Future _obtainTimestamp(String? encodedLastCommitKey, KeyHelper keyHelper, DatastoreService datastore) async {
+ /// [lastCommitTimestamp] is initially set as the current time, which allows query return
+ /// latest commit list. If [owerKeyParam] is not empty, [lastCommitTimestamp] will be set
+ /// as the timestamp of that [commit], and the query will return lastest commit
+ /// list whose timestamp is smaller than [lastCommitTimestamp].
+ int lastCommitTimestamp = DateTime.now().millisecondsSinceEpoch;
+
+ if (encodedLastCommitKey != null) {
+ final Key ownerKey = keyHelper.decode(encodedLastCommitKey) as Key;
+ final Commit commit = await datastore.db.lookupValue(
+ ownerKey,
+ orElse: () => throw NotFoundException('Failed to find commit with key $ownerKey'),
+ );
+
+ lastCommitTimestamp = commit.timestamp!;
+ }
+ return lastCommitTimestamp;
+ }
+}
diff --git a/app_dart/lib/src/request_handlers/reset_prod_task.dart b/app_dart/lib/src/request_handlers/reset_prod_task.dart
index b2a0cce6d..402a37236 100644
--- a/app_dart/lib/src/request_handlers/reset_prod_task.dart
+++ b/app_dart/lib/src/request_handlers/reset_prod_task.dart
@@ -23,6 +23,7 @@ import '../service/datastore.dart';
import '../service/firestore.dart';
import '../service/luci_build_service.dart';
import '../service/scheduler.dart';
+import '../service/logging.dart';
/// Reruns a postsubmit LUCI build.
///
@@ -80,6 +81,7 @@ class ResetProdTask extends ApiRequestHandler {
}
if (taskName == 'all') {
+ log.info('Attempting to reset all failed prod tasks for $sha in $repo...');
final Key commitKey = Commit.createKey(
db: datastore.db,
slug: slug!,
@@ -90,6 +92,7 @@ class ResetProdTask extends ApiRequestHandler {
final List> futures = >[];
for (final Task task in tasks) {
if (!Task.taskFailStatusSet.contains(task.status)) continue;
+ log.info('Resetting failed task ${task.name}');
futures.add(
rerun(
datastore: datastore,
@@ -104,6 +107,7 @@ class ResetProdTask extends ApiRequestHandler {
}
await Future.wait(futures);
} else {
+ log.info('Attempting to reset prod task "$taskName" for $sha in $repo...');
await rerun(
datastore: datastore,
firestoreService: firestoreService,
@@ -118,6 +122,8 @@ class ResetProdTask extends ApiRequestHandler {
);
}
+ log.info('$taskName reset initiated successfully.');
+
return Body.empty;
}
diff --git a/app_dart/lib/src/service/build_status_provider.dart b/app_dart/lib/src/service/build_status_provider.dart
index cc5439d33..b4c4a4575 100644
--- a/app_dart/lib/src/service/build_status_provider.dart
+++ b/app_dart/lib/src/service/build_status_provider.dart
@@ -12,6 +12,7 @@ import '../model/appengine/commit.dart' as datastore;
import '../model/appengine/github_build_status_update.dart';
import '../model/appengine/stage.dart';
import '../model/firestore/commit.dart';
+import '../model/firestore/commit_tasks_status.dart';
import '../model/firestore/task.dart';
import 'datastore.dart';
@@ -174,23 +175,6 @@ class BuildStatusService {
}
}
-/// Class that holds the status for all tasks corresponding to a particular
-/// commit.
-///
-/// Tasks may still be running, and thus their status is subject to change.
-/// Put another way, this class holds information that is a snapshot in time.
-@immutable
-class CommitTasksStatus {
- /// Creates a new [CommitTasksStatus].
- const CommitTasksStatus(this.commit, this.tasks);
-
- /// The commit against which all the tasks are run.
- final Commit commit;
-
- /// Tasks running against the commit.
- final List tasks;
-}
-
@immutable
class CommitStatus {
/// Creates a new [CommitStatus].
diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml
index e2605a14f..715954d02 100644
--- a/app_dart/pubspec.yaml
+++ b/app_dart/pubspec.yaml
@@ -12,7 +12,7 @@ environment:
dependencies:
appengine: 0.13.7
- args: 2.4.2
+ args: 2.5.0
collection: 1.18.0
corsac_jwt: 1.0.0-nullsafety.1
crypto: 3.0.3
@@ -22,7 +22,7 @@ dependencies:
gcloud: 0.8.12
github: 9.24.0
googleapis: 12.0.0
- googleapis_auth: 1.5.1
+ googleapis_auth: 1.6.0
gql: 1.0.1-alpha+1696717343881
graphql: 5.2.0-beta.7
grpc: 3.2.4
@@ -32,7 +32,7 @@ dependencies:
meta: 1.14.0
mime: 1.0.5
mutex: 3.1.0
- neat_cache: 2.0.3
+ neat_cache: 2.0.4
path: 1.9.0
process: 5.0.2
process_runner: 4.2.0
@@ -49,7 +49,7 @@ dev_dependencies:
json_serializable: 6.7.1
mockito: 5.4.4
platform: 3.1.4
- test: 1.25.2
+ test: 1.25.3
builders:
json_serializable: 3.3.0
diff --git a/app_dart/test/model/firestore/commit_tasks_status_test.dart b/app_dart/test/model/firestore/commit_tasks_status_test.dart
new file mode 100644
index 000000000..e72d8065a
--- /dev/null
+++ b/app_dart/test/model/firestore/commit_tasks_status_test.dart
@@ -0,0 +1,32 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:cocoon_service/src/model/firestore/commit.dart';
+import 'package:cocoon_service/src/model/firestore/commit_tasks_status.dart';
+import 'package:cocoon_service/src/model/firestore/task.dart';
+import 'package:test/test.dart';
+
+import '../../src/utilities/entity_generators.dart';
+
+void main() {
+ group('CommitTasksStatus', () {
+ test('generates json correctly', () async {
+ final Commit commit = generateFirestoreCommit(1, sha: 'sha1');
+ final CommitTasksStatus commitTasksStatus = CommitTasksStatus(commit, []);
+ expect(SerializableCommitTasksStatus(commitTasksStatus).toJson(), {
+ 'Commit': {
+ 'DocumentName': 'sha1',
+ 'RepositoryPath': 'flutter/flutter',
+ 'CreateTimestamp': 1,
+ 'Sha': 'sha1',
+ 'Message': 'test message',
+ 'Author': 'author',
+ 'Avatar': 'avatar',
+ 'Branch': 'master',
+ },
+ 'Tasks': [],
+ });
+ });
+ });
+}
diff --git a/app_dart/test/model/firestore/commit_test.dart b/app_dart/test/model/firestore/commit_test.dart
index 2734b54f2..5cf5730c2 100644
--- a/app_dart/test/model/firestore/commit_test.dart
+++ b/app_dart/test/model/firestore/commit_test.dart
@@ -51,4 +51,19 @@ void main() {
expect(commitDocument.fields![kCommitRepositoryPathField]!.stringValue, commit.repository);
expect(commitDocument.fields![kCommitShaField]!.stringValue, commit.sha);
});
+
+ test('commit toJson', () {
+ final Commit commitDocument = generateFirestoreCommit(1);
+ final Map expectedResult = {
+ kCommitDocumentName: commitDocument.name,
+ kCommitRepositoryPath: commitDocument.repositoryPath,
+ kCommitCreateTimestamp: commitDocument.createTimestamp,
+ kCommitSha: commitDocument.sha,
+ kCommitMessage: commitDocument.message,
+ kCommitAuthor: commitDocument.author,
+ kCommitAvatar: commitDocument.avatar,
+ kCommitBranch: commitDocument.branch,
+ };
+ expect(commitDocument.toJson(), expectedResult);
+ });
}
diff --git a/app_dart/test/model/firestore/task_test.dart b/app_dart/test/model/firestore/task_test.dart
index ab748e3bf..b4c778dde 100644
--- a/app_dart/test/model/firestore/task_test.dart
+++ b/app_dart/test/model/firestore/task_test.dart
@@ -202,4 +202,21 @@ void main() {
expect(task.testFlaky, false);
});
});
+
+ test('task toJson', () {
+ final Task taskDocument = generateFirestoreTask(1);
+ final Map expectedResult = {
+ kTaskDocumentName: taskDocument.name,
+ kTaskCreateTimestamp: taskDocument.createTimestamp,
+ kTaskStartTimestamp: taskDocument.startTimestamp,
+ kTaskEndTimestamp: taskDocument.endTimestamp,
+ kTaskTaskName: taskDocument.taskName,
+ kTaskAttempts: taskDocument.attempts,
+ kTaskBringup: taskDocument.bringup,
+ kTaskTestFlaky: taskDocument.testFlaky,
+ kTaskBuildNumber: taskDocument.buildNumber,
+ kTaskStatus: taskDocument.status,
+ };
+ expect(taskDocument.toJson(), expectedResult);
+ });
}
diff --git a/app_dart/test/request_handlers/get_status_firestore_test.dart b/app_dart/test/request_handlers/get_status_firestore_test.dart
new file mode 100644
index 000000000..b8bcef0d1
--- /dev/null
+++ b/app_dart/test/request_handlers/get_status_firestore_test.dart
@@ -0,0 +1,209 @@
+// Copyright 2019 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:cocoon_service/cocoon_service.dart';
+import 'package:cocoon_service/src/model/appengine/commit.dart';
+import 'package:cocoon_service/src/model/firestore/commit_tasks_status.dart';
+import 'package:cocoon_service/src/model/firestore/task.dart';
+import 'package:cocoon_service/src/service/datastore.dart';
+import 'package:gcloud/db.dart';
+import 'package:test/test.dart';
+
+import '../src/datastore/fake_config.dart';
+import '../src/request_handling/fake_authentication.dart';
+import '../src/request_handling/fake_http.dart';
+import '../src/request_handling/request_handler_tester.dart';
+import '../src/service/fake_build_status_provider.dart';
+import '../src/utilities/entity_generators.dart';
+import '../src/utilities/mocks.dart';
+
+void main() {
+ group('GetStatusFirestore', () {
+ late FakeConfig config;
+ FakeClientContext clientContext;
+ FakeKeyHelper keyHelper;
+ FakeBuildStatusService buildStatusService;
+ late RequestHandlerTester tester;
+ late GetStatusFirestore handler;
+ late MockFirestoreService mockFirestoreService;
+
+ late Commit commit1;
+ late Commit commit2;
+
+ Future decodeHandlerBody() async {
+ final Body body = await tester.get(handler);
+ return await utf8.decoder.bind(body.serialize() as Stream>).transform(json.decoder).single as T?;
+ }
+
+ setUp(() {
+ clientContext = FakeClientContext();
+ mockFirestoreService = MockFirestoreService();
+ keyHelper = FakeKeyHelper(applicationContext: clientContext.applicationContext);
+ tester = RequestHandlerTester();
+ config = FakeConfig(keyHelperValue: keyHelper, firestoreService: mockFirestoreService);
+ buildStatusService = FakeBuildStatusService(commitTasksStatuses: []);
+ handler = GetStatusFirestore(
+ config: config,
+ datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
+ buildStatusProvider: (_, __) => buildStatusService,
+ );
+ commit1 = Commit(
+ key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'),
+ repository: 'flutter/flutter',
+ sha: 'ea28a9c34dc701de891eaf74503ca4717019f829',
+ timestamp: 3,
+ message: 'test message 1',
+ branch: 'master',
+ );
+ commit2 = Commit(
+ key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'),
+ repository: 'flutter/flutter',
+ sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ timestamp: 1,
+ message: 'test message 2',
+ branch: 'master',
+ );
+ });
+
+ test('no statuses', () async {
+ final Map result = (await decodeHandlerBody())!;
+ expect(result['Statuses'], isEmpty);
+ });
+
+ test('reports statuses without input commit key', () async {
+ buildStatusService = FakeBuildStatusService(
+ commitTasksStatuses: [
+ CommitTasksStatus(generateFirestoreCommit(1), const []),
+ CommitTasksStatus(generateFirestoreCommit(2), const []),
+ ],
+ );
+ handler = GetStatusFirestore(
+ config: config,
+ datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
+ buildStatusProvider: (_, __) => buildStatusService,
+ );
+
+ final Map result = (await decodeHandlerBody())!;
+
+ expect(result['Statuses'].length, 2);
+ });
+
+ test('reports statuses with input commit key', () async {
+ final Commit commit1 = Commit(
+ key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'),
+ repository: 'flutter/flutter',
+ sha: 'ea28a9c34dc701de891eaf74503ca4717019f829',
+ timestamp: 3,
+ message: 'test message 1',
+ branch: 'master',
+ );
+ final Commit commit2 = Commit(
+ key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'),
+ repository: 'flutter/flutter',
+ sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ timestamp: 1,
+ message: 'test message 2',
+ branch: 'master',
+ );
+ config.db.values[commit1.key] = commit1;
+ config.db.values[commit2.key] = commit2;
+ buildStatusService = FakeBuildStatusService(
+ commitTasksStatuses: [
+ CommitTasksStatus(
+ generateFirestoreCommit(
+ 1,
+ sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ ),
+ const [],
+ ),
+ CommitTasksStatus(generateFirestoreCommit(2), const []),
+ ],
+ );
+ handler = GetStatusFirestore(
+ config: config,
+ datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
+ buildStatusProvider: (_, __) => buildStatusService,
+ );
+
+ const String expectedLastCommitKeyEncoded =
+ 'ahNzfmZsdXR0ZXItZGFzaGJvYXJkckcLEglDaGVja2xpc3QiOGZsdXR0ZXIvZmx1dHRlci9lYTI4YTljMzRkYzcwMWRlODkxZWFmNzQ1MDNjYTQ3MTcwMTlmODI5DA';
+
+ tester.request = FakeHttpRequest(
+ queryParametersValue: {
+ GetStatusFirestore.kLastCommitKeyParam: expectedLastCommitKeyEncoded,
+ },
+ );
+ final Map result = (await decodeHandlerBody())!;
+
+ expect(result['Statuses'].first, {
+ 'Commit': {
+ 'DocumentName': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ 'RepositoryPath': 'flutter/flutter',
+ 'CreateTimestamp': 1,
+ 'Sha': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ 'Message': 'test message',
+ 'Author': 'author',
+ 'Avatar': 'avatar',
+ 'Branch': 'master',
+ },
+ 'Tasks': [],
+ });
+ });
+
+ test('reports statuses with input branch', () async {
+ commit2.branch = 'flutter-1.1-candidate.1';
+ config.db.values[commit1.key] = commit1;
+ config.db.values[commit2.key] = commit2;
+ buildStatusService = FakeBuildStatusService(
+ commitTasksStatuses: [
+ CommitTasksStatus(
+ generateFirestoreCommit(1),
+ const [],
+ ),
+ CommitTasksStatus(
+ generateFirestoreCommit(
+ 2,
+ branch: 'flutter-1.1-candidate.1',
+ sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ ),
+ const [],
+ ),
+ ],
+ );
+ handler = GetStatusFirestore(
+ config: config,
+ datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5),
+ buildStatusProvider: (_, __) => buildStatusService,
+ );
+
+ const String branch = 'flutter-1.1-candidate.1';
+
+ expect(config.db.values.length, 2);
+
+ tester.request = FakeHttpRequest(
+ queryParametersValue: {
+ GetStatusFirestore.kBranchParam: branch,
+ },
+ );
+ final Map result = (await decodeHandlerBody())!;
+
+ expect(result['Statuses'].length, 1);
+ expect(result['Statuses'].first, {
+ 'Commit': {
+ 'DocumentName': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ 'RepositoryPath': 'flutter/flutter',
+ 'CreateTimestamp': 2,
+ 'Sha': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4',
+ 'Message': 'test message',
+ 'Author': 'author',
+ 'Avatar': 'avatar',
+ 'Branch': 'flutter-1.1-candidate.1',
+ },
+ 'Tasks': [],
+ });
+ });
+ });
+}
diff --git a/app_dart/test/src/service/fake_build_status_provider.dart b/app_dart/test/src/service/fake_build_status_provider.dart
index dfe8a201f..37ef6a190 100644
--- a/app_dart/test/src/service/fake_build_status_provider.dart
+++ b/app_dart/test/src/service/fake_build_status_provider.dart
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'package:cocoon_service/src/model/firestore/commit_tasks_status.dart';
import 'package:cocoon_service/src/service/build_status_provider.dart';
import 'package:cocoon_service/src/service/datastore.dart';
import 'package:cocoon_service/src/service/firestore.dart';
@@ -11,6 +12,7 @@ class FakeBuildStatusService implements BuildStatusService {
FakeBuildStatusService({
this.cumulativeStatus,
this.commitStatuses,
+ this.commitTasksStatuses,
});
BuildStatus? cumulativeStatus;
@@ -55,10 +57,12 @@ class FakeBuildStatusService implements BuildStatusService {
String? branch,
required RepositorySlug slug,
}) {
- if (commitStatuses == null) {
+ if (commitTasksStatuses == null) {
throw AssertionError();
}
- commitStatuses!.sort((CommitStatus a, CommitStatus b) => a.commit.timestamp!.compareTo(b.commit.timestamp!));
+ commitTasksStatuses!.sort(
+ (CommitTasksStatus a, CommitTasksStatus b) => a.commit.createTimestamp!.compareTo(b.commit.createTimestamp!),
+ );
return Stream.fromIterable(
commitTasksStatuses!.where(
diff --git a/app_dart/test/src/utilities/entity_generators.dart b/app_dart/test/src/utilities/entity_generators.dart
index 1be5d9bd8..7b9eab83a 100644
--- a/app_dart/test/src/utilities/entity_generators.dart
+++ b/app_dart/test/src/utilities/entity_generators.dart
@@ -139,6 +139,9 @@ firestore_commit.Commit generateFirestoreCommit(
String? owner = 'flutter',
String repo = 'flutter',
int? createTimestamp,
+ String? message = 'test message',
+ String? author = 'author',
+ String? avatar = 'avatar',
}) {
final firestore_commit.Commit commit = firestore_commit.Commit()
..name = sha ?? '$i'
@@ -146,6 +149,9 @@ firestore_commit.Commit generateFirestoreCommit(
firestore_commit.kCommitCreateTimestampField: Value(integerValue: (createTimestamp ?? i).toString()),
firestore_commit.kCommitRepositoryPathField: Value(stringValue: '$owner/$repo'),
firestore_commit.kCommitBranchField: Value(stringValue: branch),
+ firestore_commit.kCommitMessageField: Value(stringValue: message),
+ firestore_commit.kCommitAuthorField: Value(stringValue: author),
+ firestore_commit.kCommitAvatarField: Value(stringValue: avatar),
firestore_commit.kCommitShaField: Value(stringValue: sha ?? '$i'),
};
return commit;
diff --git a/auto_submit/Dockerfile b/auto_submit/Dockerfile
index b01810bae..ab6d482bc 100644
--- a/auto_submit/Dockerfile
+++ b/auto_submit/Dockerfile
@@ -4,7 +4,7 @@
# Dart Docker official images can be found here: https://hub.docker.com/_/dart
-FROM dart:beta@sha256:4d3f64da52b5b7fcb96b0ea94e17c745c4ff7d6eb3d078ac3088fb16d2110f5f
+FROM dart:beta@sha256:7fef8712c268d41081d36a58745872e527c387bf68cf0bbb86e912201e30f3bf
WORKDIR /app
diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml
index 2d790bc6d..712a330da 100644
--- a/auto_submit/pubspec.yaml
+++ b/auto_submit/pubspec.yaml
@@ -15,13 +15,13 @@ dependencies:
corsac_jwt: 1.0.0-nullsafety.1
github: 9.24.0
googleapis: 12.0.0
- googleapis_auth: 1.5.1
+ googleapis_auth: 1.6.0
graphql: 5.2.0-beta.7
gql: 1.0.1-alpha+1691943394579
http: 1.2.1
json_annotation: 4.8.1
meta: 1.14.0
- neat_cache: 2.0.3
+ neat_cache: 2.0.4
shelf: 1.4.1
shelf_router: 1.1.4
crypto: 3.0.3
@@ -35,7 +35,7 @@ dev_dependencies:
json_serializable: 6.7.1
flutter_lints: 3.0.2
mockito: 5.4.4
- test: 1.25.2
+ test: 1.25.3
builders:
json_serializable: 3.3.0
diff --git a/cipd_packages/codesign/pubspec.yaml b/cipd_packages/codesign/pubspec.yaml
index 8ddb802fe..d180ad671 100644
--- a/cipd_packages/codesign/pubspec.yaml
+++ b/cipd_packages/codesign/pubspec.yaml
@@ -8,10 +8,10 @@ environment:
dev_dependencies:
lints: 3.0.0
- test: 1.25.2
+ test: 1.25.3
dependencies:
archive: 3.4.10
- args: 2.4.2
+ args: 2.5.0
crypto: 3.0.3
fake_async: 1.3.1
file: 7.0.0
diff --git a/cipd_packages/device_doctor/pubspec.yaml b/cipd_packages/device_doctor/pubspec.yaml
index 662f8de57..95ec796ee 100644
--- a/cipd_packages/device_doctor/pubspec.yaml
+++ b/cipd_packages/device_doctor/pubspec.yaml
@@ -7,7 +7,7 @@ environment:
dependencies:
analyzer: 6.4.1
- args: 2.4.2
+ args: 2.5.0
logging: 1.2.0
meta: 1.14.0
path: 1.9.0
@@ -19,4 +19,4 @@ dev_dependencies:
build_runner: 2.4.9
fake_async: 1.3.1
mockito: 5.4.4
- test: 1.25.2
+ test: 1.25.3
diff --git a/dashboard/lib/service/appengine_cocoon.dart b/dashboard/lib/service/appengine_cocoon.dart
index 2119846df..1189b980f 100644
--- a/dashboard/lib/service/appengine_cocoon.dart
+++ b/dashboard/lib/service/appengine_cocoon.dart
@@ -56,7 +56,7 @@ class AppEngineCocoonService implements CocoonService {
static const String kTaskEndTimestamp = 'EndTimestamp';
static const String kTaskStartTimestamp = 'StartTimestamp';
static const String kTaskStatus = 'Status';
- static const String kTaskTaskNmae = 'TaskName';
+ static const String kTaskTaskName = 'TaskName';
static const String kTaskTestFlaky = 'TestFlaky';
final http.Client _client;
@@ -407,7 +407,7 @@ class AppEngineCocoonService implements CocoonService {
..startTimestamp = Int64(taskData[kTaskStartTimestamp] as int)
..endTimestamp = Int64(taskData[kTaskEndTimestamp] as int)
..documentName = taskData[kTaskDocumentName] as String
- ..taskName = taskData[kTaskTaskNmae] as String
+ ..taskName = taskData[kTaskTaskName] as String
..attempts = taskData[kTaskAttempts] as int
..bringup = taskData[kTaskBringup] as bool
..status = taskData[kTaskStatus] as String
diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml
index b673ac9cb..d2a060daf 100644
--- a/dashboard/pubspec.yaml
+++ b/dashboard/pubspec.yaml
@@ -24,7 +24,7 @@ dependencies:
protobuf: 3.1.0 # Rolled by dependabot
provider: 6.1.2 # Rolled by dependabot
truncate: 3.0.1 # Rolled by dependabot
- url_launcher: 6.2.5 # Rolled by dependabot
+ url_launcher: 6.2.6 # Rolled by dependabot
url_launcher_platform_interface: 2.3.2 # Rolled by dependabot
url_launcher_web: 2.2.3 # Rolled by dependabot
diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json
index d0c245872..f079671ac 100644
--- a/gh_actions/third_party/no-response/package-lock.json
+++ b/gh_actions/third_party/no-response/package-lock.json
@@ -11,7 +11,7 @@
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0",
- "@typescript-eslint/eslint-plugin": "^7.5.0",
+ "@typescript-eslint/eslint-plugin": "^7.6.0",
"eslint-plugin-prettier": "^5.1.3",
"scramjet": "^4.37.0"
},
@@ -19,7 +19,7 @@
"@octokit/webhooks-types": "^7.5.0",
"@types/jest": "^29.5.12",
"@types/node": "^20.12.5",
- "@typescript-eslint/parser": "^7.5.0",
+ "@typescript-eslint/parser": "^7.6.0",
"@vercel/ncc": "^0.38.1",
"eslint": "^8.57.0",
"eslint-plugin-github": "^4.10.2",
@@ -29,7 +29,7 @@
"js-yaml": "^4.1.0",
"prettier": "3.2.5",
"ts-jest": "^29.1.2",
- "typescript": "^5.4.4"
+ "typescript": "^5.4.5"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -1635,21 +1635,21 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz",
- "integrity": "sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==",
- "dependencies": {
- "@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "7.5.0",
- "@typescript-eslint/type-utils": "7.5.0",
- "@typescript-eslint/utils": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz",
+ "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "7.6.0",
+ "@typescript-eslint/type-utils": "7.6.0",
+ "@typescript-eslint/utils": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
- "ignore": "^5.2.4",
+ "ignore": "^5.3.1",
"natural-compare": "^1.4.0",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1669,12 +1669,12 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz",
- "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz",
+ "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0"
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1685,9 +1685,9 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz",
- "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz",
+ "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==",
"engines": {
"node": "^18.18.0 || >=20.0.0"
},
@@ -1697,18 +1697,18 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz",
- "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz",
+ "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0",
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
- "minimatch": "9.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1724,17 +1724,17 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz",
- "integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz",
+ "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@types/json-schema": "^7.0.12",
- "@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "7.5.0",
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/typescript-estree": "7.5.0",
- "semver": "^7.5.4"
+ "@types/json-schema": "^7.0.15",
+ "@types/semver": "^7.5.8",
+ "@typescript-eslint/scope-manager": "7.6.0",
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/typescript-estree": "7.6.0",
+ "semver": "^7.6.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1748,12 +1748,12 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz",
- "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz",
+ "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "eslint-visitor-keys": "^3.4.1"
+ "@typescript-eslint/types": "7.6.0",
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1763,15 +1763,29 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz",
- "integrity": "sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz",
+ "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==",
"dependencies": {
- "@typescript-eslint/scope-manager": "7.5.0",
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/typescript-estree": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0",
+ "@typescript-eslint/scope-manager": "7.6.0",
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/typescript-estree": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1791,12 +1805,12 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz",
- "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz",
+ "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0"
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1807,9 +1821,9 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz",
- "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz",
+ "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==",
"engines": {
"node": "^18.18.0 || >=20.0.0"
},
@@ -1819,18 +1833,18 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz",
- "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz",
+ "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0",
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
- "minimatch": "9.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1846,12 +1860,12 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz",
- "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz",
+ "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "eslint-visitor-keys": "^3.4.1"
+ "@typescript-eslint/types": "7.6.0",
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1861,6 +1875,20 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/parser/node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@typescript-eslint/scope-manager": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
@@ -1879,14 +1907,14 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz",
- "integrity": "sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz",
+ "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==",
"dependencies": {
- "@typescript-eslint/typescript-estree": "7.5.0",
- "@typescript-eslint/utils": "7.5.0",
+ "@typescript-eslint/typescript-estree": "7.6.0",
+ "@typescript-eslint/utils": "7.6.0",
"debug": "^4.3.4",
- "ts-api-utils": "^1.0.1"
+ "ts-api-utils": "^1.3.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1905,12 +1933,12 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz",
- "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz",
+ "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0"
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1921,9 +1949,9 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz",
- "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz",
+ "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==",
"engines": {
"node": "^18.18.0 || >=20.0.0"
},
@@ -1933,18 +1961,18 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz",
- "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz",
+ "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/visitor-keys": "7.5.0",
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/visitor-keys": "7.6.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
- "minimatch": "9.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1960,17 +1988,17 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz",
- "integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz",
+ "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "@types/json-schema": "^7.0.12",
- "@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "7.5.0",
- "@typescript-eslint/types": "7.5.0",
- "@typescript-eslint/typescript-estree": "7.5.0",
- "semver": "^7.5.4"
+ "@types/json-schema": "^7.0.15",
+ "@types/semver": "^7.5.8",
+ "@typescript-eslint/scope-manager": "7.6.0",
+ "@typescript-eslint/types": "7.6.0",
+ "@typescript-eslint/typescript-estree": "7.6.0",
+ "semver": "^7.6.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1984,12 +2012,12 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz",
- "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz",
+ "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==",
"dependencies": {
- "@typescript-eslint/types": "7.5.0",
- "eslint-visitor-keys": "^3.4.1"
+ "@typescript-eslint/types": "7.6.0",
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -1999,6 +2027,20 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@typescript-eslint/types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
@@ -6939,9 +6981,9 @@
}
},
"node_modules/typescript": {
- "version": "5.4.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz",
- "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==",
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json
index 42da13eb1..9baa417fb 100644
--- a/gh_actions/third_party/no-response/package.json
+++ b/gh_actions/third_party/no-response/package.json
@@ -27,7 +27,7 @@
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0",
- "@typescript-eslint/eslint-plugin": "^7.5.0",
+ "@typescript-eslint/eslint-plugin": "^7.6.0",
"eslint-plugin-prettier": "^5.1.3",
"scramjet": "^4.37.0"
},
@@ -35,7 +35,7 @@
"@octokit/webhooks-types": "^7.5.0",
"@types/jest": "^29.5.12",
"@types/node": "^20.12.5",
- "@typescript-eslint/parser": "^7.5.0",
+ "@typescript-eslint/parser": "^7.6.0",
"@vercel/ncc": "^0.38.1",
"eslint": "^8.57.0",
"eslint-plugin-github": "^4.10.2",
@@ -45,6 +45,6 @@
"js-yaml": "^4.1.0",
"prettier": "3.2.5",
"ts-jest": "^29.1.2",
- "typescript": "^5.4.4"
+ "typescript": "^5.4.5"
}
}
diff --git a/licenses/pubspec.yaml b/licenses/pubspec.yaml
index 4f23d15f3..1a6f153e3 100644
--- a/licenses/pubspec.yaml
+++ b/licenses/pubspec.yaml
@@ -10,4 +10,4 @@ dependencies:
dev_dependencies:
mockito: 5.4.4
- test_api: 0.7.0
+ test_api: 0.7.1
diff --git a/test_utilities/pubspec.yaml b/test_utilities/pubspec.yaml
index db0be447a..82fd7185d 100644
--- a/test_utilities/pubspec.yaml
+++ b/test_utilities/pubspec.yaml
@@ -10,6 +10,6 @@ environment:
sdk: '>=2.18.0 < 4.0.0'
dev_dependencies:
- args: 2.4.2
+ args: 2.5.0
yaml: 3.1.2
path: 1.9.0