From de21d4b8ce529062a2abd29b11ed57e46892820d Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Thu, 9 Nov 2023 16:23:36 -0800 Subject: [PATCH 01/49] Add infra ticket queue link to dashboard (#3249) Fixes: https://github.com/flutter/flutter/issues/138185 --- dashboard/lib/build_dashboard_page.dart | 14 +++++++++++++ dashboard/test/build_dashboard_page_test.dart | 20 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/dashboard/lib/build_dashboard_page.dart b/dashboard/lib/build_dashboard_page.dart index c1873ce6b..a09d957ad 100644 --- a/dashboard/lib/build_dashboard_page.dart +++ b/dashboard/lib/build_dashboard_page.dart @@ -397,6 +397,9 @@ class BuildDashboardPageState extends State { final Uri flutterIssueUrl = Uri.parse( 'https://github.com/flutter/flutter/issues/new?assignees=&labels=team-infra&projects=&template=6_infrastructure.yml', ); + final Uri flutterInfraTicketQueue = Uri.parse( + 'https://github.com/orgs/flutter/projects/81', + ); final BuildState buildState = Provider.of(context); buildState.updateCurrentRepoBranch(repo!, branch!); return CallbackShortcuts( @@ -421,6 +424,17 @@ class BuildDashboardPageState extends State { backgroundColor: colorTable[buildState.isTreeBuilding], actions: [ if (!_smallScreen) ..._buildRepositorySelectionWidgets(context, buildState), + IconButton( + tooltip: 'Infra Ticket Queue', + icon: const Icon(Icons.queue), + onPressed: () async { + if (await canLaunchUrl(flutterInfraTicketQueue)) { + await launchUrl(flutterInfraTicketQueue); + } else { + throw 'Could not launch $flutterInfraTicketQueue'; + } + }, + ), IconButton( tooltip: 'Report Issue', icon: const Icon(Icons.bug_report), diff --git a/dashboard/test/build_dashboard_page_test.dart b/dashboard/test/build_dashboard_page_test.dart index c75554047..edefc4920 100644 --- a/dashboard/test/build_dashboard_page_test.dart +++ b/dashboard/test/build_dashboard_page_test.dart @@ -117,6 +117,26 @@ void main() { expect(find.byIcon(Icons.settings), findsOneWidget); }); + testWidgets('shows infra ticket queue button', (WidgetTester tester) async { + configureView(tester.view); + final BuildState fakeBuildState = FakeBuildState()..authService = fakeAuthService; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(useMaterial3: false), + home: ValueProvider( + value: fakeBuildState, + child: ValueProvider( + value: fakeBuildState.authService, + child: const BuildDashboardPage(), + ), + ), + ), + ); + + expect(find.byIcon(Icons.queue), findsOneWidget); + }); + testWidgets('shows file a bug button', (WidgetTester tester) async { configureView(tester.view); final BuildState fakeBuildState = FakeBuildState()..authService = fakeAuthService; From 64198bdc9503433cc97c84ed009a699257a69151 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 10 Nov 2023 08:17:47 -0800 Subject: [PATCH 02/49] Default engine to requiring tests (#3248) The current engine rules are the reverse of the framework and packages repos; those assume that any file that has not been explicitly exempted needs tests, whereas the engine only requires tests for a specific set of files. This is prone to false negatives (e.g., if/when we start adding Swift files, someone would have had to remember to come update this rule, which probably wouldn't have happened). This flips the engine to be consistent with the other repositories. This will almost certainly cause a lot of false positives in the short term while the set of files that should be exempted is worked out. Also fixes a bug where the removal-only case was only being applied to Dart files, not other languages. --- .../github/webhook_subscription.dart | 15 ++-- .../github/webhook_subscription_test.dart | 77 ++++++++++++++++++- 2 files changed, 84 insertions(+), 8 deletions(-) diff --git a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart index 05f7762c6..9c6a1f634 100644 --- a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart +++ b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart @@ -371,6 +371,7 @@ class GithubWebhookSubscription extends SubscriptionHandler { filename.contains('analysis_options.yaml') || filename.contains('AUTHORS') || filename.contains('CODEOWNERS') || + filename == 'DEPS' || filename.contains('TESTOWNERS') || filename.contains('pubspec.yaml') || // Exempt categories. @@ -398,16 +399,16 @@ class GithubWebhookSubscription extends SubscriptionHandler { bool needsTests = false; await for (PullRequestFile file in files) { - final String filename = file.filename!.toLowerCase(); - if (_fileContainsAddedCode(file) && filename.endsWith('.dart') || - filename.endsWith('.mm') || - filename.endsWith('.m') || - filename.endsWith('.java') || - filename.endsWith('.cc')) { + final String filename = file.filename!; + if (_fileContainsAddedCode(file) && + !_isTestExempt(filename) && + // Build files don't need unit tests. + !filename.endsWith('.gn') && + !filename.endsWith('.gni')) { needsTests = !_allChangesAreCodeComments(file); } - if (kEngineTestRegExp.hasMatch(filename)) { + if (kEngineTestRegExp.hasMatch(filename.toLowerCase())) { hasTests = true; } } diff --git a/app_dart/test/request_handlers/github/webhook_subscription_test.dart b/app_dart/test/request_handlers/github/webhook_subscription_test.dart index d54f76fd1..1da2a43ad 100644 --- a/app_dart/test/request_handlers/github/webhook_subscription_test.dart +++ b/app_dart/test/request_handlers/github/webhook_subscription_test.dart @@ -1256,6 +1256,40 @@ void foo() { ).called(1); }); + test('Engine labels PRs, comment if no tests for unknown file', () async { + const int issueNumber = 123; + + tester.message = generateGithubWebhookMessage( + action: 'opened', + number: issueNumber, + slug: Config.engineSlug, + baseRef: Config.defaultBranch(Config.engineSlug), + ); + final RepositorySlug slug = RepositorySlug('flutter', 'engine'); + + when(pullRequestsService.listFiles(slug, issueNumber)).thenAnswer( + (_) => Stream.value( + PullRequestFile()..filename = 'foo/bar/baz.madeupextension', + ), + ); + + when(issuesService.listCommentsByIssue(slug, issueNumber)).thenAnswer( + (_) => Stream.value( + IssueComment()..body = 'some other comment', + ), + ); + + await tester.post(webhook); + + verify( + issuesService.createComment( + slug, + issueNumber, + argThat(contains(config.missingTestsPullRequestMessageValue)), + ), + ).called(1); + }); + group('Auto-roller accounts do not label Engine PR with test label or comment.', () { final Set inputs = { 'engine-flutter-autoroll', @@ -1365,7 +1399,7 @@ void foo() { ); }); - test('Engine labels PRs, no code files', () async { + test('Engine labels PRs, no comment if DEPS-only', () async { const int issueNumber = 123; tester.message = generateGithubWebhookMessage( @@ -1400,6 +1434,42 @@ void foo() { ); }); + test('Engine labels PRs, no comment if build-file-only', () async { + const int issueNumber = 123; + + tester.message = generateGithubWebhookMessage( + action: 'opened', + number: issueNumber, + baseRef: 'main', + slug: Config.engineSlug, + ); + + when(pullRequestsService.listFiles(Config.engineSlug, issueNumber)).thenAnswer( + (_) => Stream.fromIterable([ + PullRequestFile()..filename = 'shell/config.gni', + PullRequestFile()..filename = 'shell/BUILD.gn', + ]), + ); + + await tester.post(webhook); + + verifyNever( + issuesService.addLabelsToIssue( + Config.engineSlug, + issueNumber, + any, + ), + ); + + verifyNever( + issuesService.createComment( + Config.engineSlug, + issueNumber, + any, + ), + ); + }); + test('Engine labels PRs, no comment if Java tests', () async { const int issueNumber = 123; @@ -1692,6 +1762,11 @@ void foo() { ..deletionsCount = 20 ..additionsCount = 0 ..changesCount = 20, + PullRequestFile() + ..filename = 'shell/platform/darwin/ios/platform_view_ios.mm' + ..deletionsCount = 20 + ..additionsCount = 0 + ..changesCount = 20, ]), ); From 31bf5027766c80a41f1565004142c89d24d880a2 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 13 Nov 2023 11:20:24 -0800 Subject: [PATCH 03/49] dashboard: bump pub dependencies (#3252) --- .../lib/widgets/filter_property_sheet.dart | 2 +- dashboard/pubspec.yaml | 24 ++++---- dashboard/test/utils/mocks.mocks.dart | 58 ++++++++++++++++++- test_utilities/bin/global_test_runner.dart | 2 +- 4 files changed, 69 insertions(+), 17 deletions(-) diff --git a/dashboard/lib/widgets/filter_property_sheet.dart b/dashboard/lib/widgets/filter_property_sheet.dart index 3e2820ad6..0ca32988b 100644 --- a/dashboard/lib/widgets/filter_property_sheet.dart +++ b/dashboard/lib/widgets/filter_property_sheet.dart @@ -17,7 +17,7 @@ abstract class FilterPropertySource extends Listenable { /// be value properties, but some may be layout nodes. /// /// @see [ValueFilterProperty], [FilterPropertyGroup] -abstract class FilterPropertyNode { +abstract mixin class FilterPropertyNode { /// The descriptive name of the property or layout group as will be displayed /// in the [FilterPropertySheet]. String? get label; diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index b31e30944..e168bc597 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -19,32 +19,32 @@ publish_to: none version: 1.0.0+1 environment: - sdk: '>=2.18.0 <4.0.0' + sdk: ^3.1.0 dependencies: collection: 1.18.0 - fixnum: 1.1.0 flutter: sdk: flutter - google_sign_in: 6.1.0 + fixnum: 1.1.0 + google_sign_in: 6.1.6 google_sign_in_platform_interface: any # Match google_sign_in google_sign_in_web: any # Match google_sign_in - http: 0.13.5 - protobuf: 2.1.0 - provider: 6.0.5 - url_launcher: 6.1.11 + http: 1.1.0 + protobuf: 3.1.0 + provider: 6.1.1 + url_launcher: 6.2.1 flutter_app_icons: 0.0.8 truncate: 3.0.1 - url_launcher_web: 2.0.16 + url_launcher_web: 2.2.0 dev_dependencies: - build_runner: 2.4.4 - flutter_lints: 2.0.1 + build_runner: 2.4.6 + flutter_lints: 3.0.1 flutter_test: sdk: flutter - mockito: 5.4.1 # Remember to run ./regen_mocks.sh! + mockito: 5.4.2 # Remember to run ./regen_mocks.sh! path: 1.8.3 - url_launcher_platform_interface: 2.1.2 + url_launcher_platform_interface: 2.2.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/dashboard/test/utils/mocks.mocks.dart b/dashboard/test/utils/mocks.mocks.dart index 3f77168e3..ab23d0ab6 100644 --- a/dashboard/test/utils/mocks.mocks.dart +++ b/dashboard/test/utils/mocks.mocks.dart @@ -1,9 +1,7 @@ -// Mocks generated by Mockito 5.4.1 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in flutter_dashboard/test/utils/mocks.dart. // Do not manually edit this file. -// @dart=2.19 - // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i6; import 'dart:convert' as _i7; @@ -122,6 +120,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.Response>); + @override _i6.Future<_i2.Response> get( Uri? url, { @@ -142,6 +141,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.Response>); + @override _i6.Future<_i2.Response> post( Uri? url, { @@ -172,6 +172,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.Response>); + @override _i6.Future<_i2.Response> put( Uri? url, { @@ -202,6 +203,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.Response>); + @override _i6.Future<_i2.Response> patch( Uri? url, { @@ -232,6 +234,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.Response>); + @override _i6.Future<_i2.Response> delete( Uri? url, { @@ -262,6 +265,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.Response>); + @override _i6.Future read( Uri? url, { @@ -275,6 +279,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), returnValue: _i6.Future.value(''), ) as _i6.Future); + @override _i6.Future<_i8.Uint8List> readBytes( Uri? url, { @@ -288,6 +293,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), returnValue: _i6.Future<_i8.Uint8List>.value(_i8.Uint8List(0)), ) as _i6.Future<_i8.Uint8List>); + @override _i6.Future<_i2.StreamedResponse> send(_i2.BaseRequest? request) => (super.noSuchMethod( Invocation.method( @@ -302,6 +308,7 @@ class MockClient extends _i1.Mock implements _i2.Client { ), )), ) as _i6.Future<_i2.StreamedResponse>); + @override void close() => super.noSuchMethod( Invocation.method( @@ -350,6 +357,7 @@ class MockCocoonService extends _i1.Mock implements _i3.CocoonService { ), )), ) as _i6.Future<_i3.CocoonResponse>>); + @override _i6.Future<_i3.CocoonResponse<_i10.BuildStatusResponse>> fetchTreeBuildStatus({ String? branch, @@ -377,6 +385,7 @@ class MockCocoonService extends _i1.Mock implements _i3.CocoonService { ), )), ) as _i6.Future<_i3.CocoonResponse<_i10.BuildStatusResponse>>); + @override _i6.Future<_i3.CocoonResponse>> fetchFlutterBranches() => (super.noSuchMethod( Invocation.method( @@ -391,6 +400,7 @@ class MockCocoonService extends _i1.Mock implements _i3.CocoonService { ), )), ) as _i6.Future<_i3.CocoonResponse>>); + @override _i6.Future<_i3.CocoonResponse>> fetchRepos() => (super.noSuchMethod( Invocation.method( @@ -405,6 +415,7 @@ class MockCocoonService extends _i1.Mock implements _i3.CocoonService { ), )), ) as _i6.Future<_i3.CocoonResponse>>); + @override _i6.Future<_i3.CocoonResponse> rerunTask( _i12.Task? task, @@ -432,6 +443,7 @@ class MockCocoonService extends _i1.Mock implements _i3.CocoonService { ), )), ) as _i6.Future<_i3.CocoonResponse>); + @override _i6.Future vacuumGitHubCommits(String? idToken) => (super.noSuchMethod( Invocation.method( @@ -458,6 +470,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { Invocation.getter(#cocoonService), ), ) as _i3.CocoonService); + @override _i4.GoogleSignInService get authService => (super.noSuchMethod( Invocation.getter(#authService), @@ -466,6 +479,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { Invocation.getter(#authService), ), ) as _i4.GoogleSignInService); + @override set authService(_i4.GoogleSignInService? _authService) => super.noSuchMethod( Invocation.setter( @@ -474,6 +488,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: null, ); + @override set refreshTimer(_i6.Timer? _refreshTimer) => super.noSuchMethod( Invocation.setter( @@ -482,41 +497,49 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: null, ); + @override List<_i11.Branch> get branches => (super.noSuchMethod( Invocation.getter(#branches), returnValue: <_i11.Branch>[], ) as List<_i11.Branch>); + @override String get currentBranch => (super.noSuchMethod( Invocation.getter(#currentBranch), returnValue: '', ) as String); + @override String get currentRepo => (super.noSuchMethod( Invocation.getter(#currentRepo), returnValue: '', ) as String); + @override List get repos => (super.noSuchMethod( Invocation.getter(#repos), returnValue: [], ) as List); + @override List<_i9.CommitStatus> get statuses => (super.noSuchMethod( Invocation.getter(#statuses), returnValue: <_i9.CommitStatus>[], ) as List<_i9.CommitStatus>); + @override List get failingTasks => (super.noSuchMethod( Invocation.getter(#failingTasks), returnValue: [], ) as List); + @override bool get moreStatusesExist => (super.noSuchMethod( Invocation.getter(#moreStatusesExist), returnValue: false, ) as bool); + @override _i5.Brook get errors => (super.noSuchMethod( Invocation.getter(#errors), @@ -525,11 +548,13 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { Invocation.getter(#errors), ), ) as _i5.Brook); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, ) as bool); + @override void addListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( @@ -538,6 +563,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: null, ); + @override void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( @@ -546,6 +572,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: null, ); + @override void updateCurrentRepoBranch( String? repo, @@ -561,6 +588,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: null, ); + @override _i6.Future? fetchMoreCommitStatuses() => (super.noSuchMethod( Invocation.method( @@ -569,6 +597,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future?); + @override _i6.Future refreshGitHubCommits() => (super.noSuchMethod( Invocation.method( @@ -577,6 +606,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValue: _i6.Future.value(false), ) as _i6.Future); + @override _i6.Future rerunTask(_i12.Task? task) => (super.noSuchMethod( Invocation.method( @@ -585,6 +615,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValue: _i6.Future.value(false), ) as _i6.Future); + @override void dispose() => super.noSuchMethod( Invocation.method( @@ -593,6 +624,7 @@ class MockBuildState extends _i1.Mock implements _i13.BuildState { ), returnValueForMissingStub: null, ); + @override void notifyListeners() => super.noSuchMethod( Invocation.method( @@ -616,21 +648,25 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { Invocation.getter(#signInOption), returnValue: _i16.SignInOption.standard, ) as _i16.SignInOption); + @override List get scopes => (super.noSuchMethod( Invocation.getter(#scopes), returnValue: [], ) as List); + @override bool get forceCodeForRefreshToken => (super.noSuchMethod( Invocation.getter(#forceCodeForRefreshToken), returnValue: false, ) as bool); + @override _i6.Stream<_i15.GoogleSignInAccount?> get onCurrentUserChanged => (super.noSuchMethod( Invocation.getter(#onCurrentUserChanged), returnValue: _i6.Stream<_i15.GoogleSignInAccount?>.empty(), ) as _i6.Stream<_i15.GoogleSignInAccount?>); + @override _i6.Future<_i15.GoogleSignInAccount?> signInSilently({ bool? suppressErrors = true, @@ -647,6 +683,7 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { ), returnValue: _i6.Future<_i15.GoogleSignInAccount?>.value(), ) as _i6.Future<_i15.GoogleSignInAccount?>); + @override _i6.Future isSignedIn() => (super.noSuchMethod( Invocation.method( @@ -655,6 +692,7 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { ), returnValue: _i6.Future.value(false), ) as _i6.Future); + @override _i6.Future<_i15.GoogleSignInAccount?> signIn() => (super.noSuchMethod( Invocation.method( @@ -663,6 +701,7 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { ), returnValue: _i6.Future<_i15.GoogleSignInAccount?>.value(), ) as _i6.Future<_i15.GoogleSignInAccount?>); + @override _i6.Future<_i15.GoogleSignInAccount?> signOut() => (super.noSuchMethod( Invocation.method( @@ -671,6 +710,7 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { ), returnValue: _i6.Future<_i15.GoogleSignInAccount?>.value(), ) as _i6.Future<_i15.GoogleSignInAccount?>); + @override _i6.Future<_i15.GoogleSignInAccount?> disconnect() => (super.noSuchMethod( Invocation.method( @@ -679,6 +719,7 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { ), returnValue: _i6.Future<_i15.GoogleSignInAccount?>.value(), ) as _i6.Future<_i15.GoogleSignInAccount?>); + @override _i6.Future requestScopes(List? scopes) => (super.noSuchMethod( Invocation.method( @@ -687,6 +728,7 @@ class MockGoogleSignIn extends _i1.Mock implements _i15.GoogleSignIn { ), returnValue: _i6.Future.value(false), ) as _i6.Future); + @override _i6.Future canAccessScopes( List? scopes, { @@ -718,21 +760,25 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic ), returnValueForMissingStub: null, ); + @override bool get isAuthenticated => (super.noSuchMethod( Invocation.getter(#isAuthenticated), returnValue: false, ) as bool); + @override _i6.Future get idToken => (super.noSuchMethod( Invocation.getter(#idToken), returnValue: _i6.Future.value(''), ) as _i6.Future); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), returnValue: false, ) as bool); + @override _i6.Future signIn() => (super.noSuchMethod( Invocation.method( @@ -742,6 +788,7 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic returnValue: _i6.Future.value(), returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future); + @override _i6.Future signOut() => (super.noSuchMethod( Invocation.method( @@ -751,6 +798,7 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic returnValue: _i6.Future.value(), returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future); + @override _i6.Future clearUser() => (super.noSuchMethod( Invocation.method( @@ -760,6 +808,7 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic returnValue: _i6.Future.value(), returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future); + @override void addListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( @@ -768,6 +817,7 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic ), returnValueForMissingStub: null, ); + @override void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( @@ -776,6 +826,7 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic ), returnValueForMissingStub: null, ); + @override void dispose() => super.noSuchMethod( Invocation.method( @@ -784,6 +835,7 @@ class MockGoogleSignInService extends _i1.Mock implements _i4.GoogleSignInServic ), returnValueForMissingStub: null, ); + @override void notifyListeners() => super.noSuchMethod( Invocation.method( diff --git a/test_utilities/bin/global_test_runner.dart b/test_utilities/bin/global_test_runner.dart index 7c5d99f55..6e0f7ca2d 100755 --- a/test_utilities/bin/global_test_runner.dart +++ b/test_utilities/bin/global_test_runner.dart @@ -5,8 +5,8 @@ import 'dart:async'; import 'dart:io'; import 'package:args/args.dart'; +import 'package:path/path.dart'; import 'package:yaml/yaml.dart'; -import "package:path/path.dart"; // Runs all the configured tests for cocoon repo. Future main(List rawArgs) async { From 818801ea79eb8de141fb8aab11e26f96bc2b8329 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Mon, 13 Nov 2023 12:23:05 -0800 Subject: [PATCH 04/49] [dashboard] Remove unused IndexState (#3253) Follow up from https://github.com/flutter/cocoon/pull/3176 --- dashboard/lib/main.dart | 2 -- dashboard/lib/state/index.dart | 33 ------------------- dashboard/lib/widgets/state_provider.dart | 5 --- dashboard/test/state/index_test.dart | 38 ---------------------- dashboard/test/utils/fake_index_state.dart | 20 ------------ dashboard/test/utils/wrapper.dart | 2 -- 6 files changed, 100 deletions(-) delete mode 100644 dashboard/lib/state/index.dart delete mode 100644 dashboard/test/state/index_test.dart delete mode 100644 dashboard/test/utils/fake_index_state.dart diff --git a/dashboard/lib/main.dart b/dashboard/lib/main.dart index 1c2565424..05ce466c5 100644 --- a/dashboard/lib/main.dart +++ b/dashboard/lib/main.dart @@ -13,7 +13,6 @@ import 'build_dashboard_page.dart'; import 'service/cocoon.dart'; import 'service/google_authentication.dart'; import 'state/build.dart'; -import 'state/index.dart'; import 'widgets/now.dart'; import 'widgets/state_provider.dart'; @@ -48,7 +47,6 @@ void main([List args = const []]) { runApp( StateProvider( signInService: authService, - indexState: IndexState(authService: authService), buildState: BuildState(authService: authService, cocoonService: cocoonService), child: Now(child: const MyApp()), ), diff --git a/dashboard/lib/state/index.dart b/dashboard/lib/state/index.dart deleted file mode 100644 index 79e3ebe65..000000000 --- a/dashboard/lib/state/index.dart +++ /dev/null @@ -1,33 +0,0 @@ -// 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:flutter/foundation.dart'; - -import '../logic/brooks.dart'; -import '../service/google_authentication.dart'; - -/// State for the index page. -class IndexState extends ChangeNotifier { - /// Creates a new [IndexState]. - IndexState({ - required this.authService, - }) { - authService.addListener(notifyListeners); - } - - /// Authentication service for managing Google Sign In. - final GoogleSignInService authService; - - /// A [Brook] that reports when errors occur that relate to this [IndexState]. - /// - /// Currently no errors are ever reported here. - Brook get errors => _errors; - final ErrorSink _errors = ErrorSink(); - - @override - void dispose() { - authService.removeListener(notifyListeners); - super.dispose(); - } -} diff --git a/dashboard/lib/widgets/state_provider.dart b/dashboard/lib/widgets/state_provider.dart index ad4c4928b..0223e219e 100644 --- a/dashboard/lib/widgets/state_provider.dart +++ b/dashboard/lib/widgets/state_provider.dart @@ -7,21 +7,17 @@ import 'package:provider/provider.dart'; import '../service/google_authentication.dart'; import '../state/build.dart'; -import '../state/index.dart'; class StateProvider extends StatelessWidget { const StateProvider({ super.key, this.signInService, - this.indexState, this.buildState, this.child, }); final GoogleSignInService? signInService; - final IndexState? indexState; - final BuildState? buildState; final Widget? child; @@ -31,7 +27,6 @@ class StateProvider extends StatelessWidget { return MultiProvider( providers: >[ ValueProvider(value: signInService), - ValueProvider(value: indexState), ValueProvider(value: buildState), ], child: child, diff --git a/dashboard/test/state/index_test.dart b/dashboard/test/state/index_test.dart deleted file mode 100644 index bf2ada8dd..000000000 --- a/dashboard/test/state/index_test.dart +++ /dev/null @@ -1,38 +0,0 @@ -// 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:flutter_dashboard/service/google_authentication.dart'; -import 'package:flutter_dashboard/state/index.dart'; - -import 'package:flutter_test/flutter_test.dart'; -import 'package:google_sign_in/google_sign_in.dart'; -import 'package:mockito/mockito.dart'; - -import '../utils/mocks.dart'; - -void main() { - testWidgets('IndexState sign in functions call notify listener', (WidgetTester tester) async { - final MockGoogleSignIn mockSignInPlugin = MockGoogleSignIn(); - when(mockSignInPlugin.onCurrentUserChanged).thenAnswer((_) => Stream.value(null)); - when(mockSignInPlugin.signIn()).thenAnswer((_) => Future.value(null)); - when(mockSignInPlugin.signOut()).thenAnswer((_) => Future.value(null)); - when(mockSignInPlugin.signInSilently()).thenAnswer((_) => Future.value(null)); - - final GoogleSignInService signInService = GoogleSignInService(googleSignIn: mockSignInPlugin); - final IndexState indexState = IndexState(authService: signInService); - - int callCount = 0; - indexState.addListener(() => callCount++); - - // notify listener is called during construction of the state - await tester.pump(const Duration(seconds: 5)); - expect(callCount, 1); - - await signInService.signIn(); - expect(callCount, 2); - - await signInService.signOut(); - expect(callCount, 3); - }); -} diff --git a/dashboard/test/utils/fake_index_state.dart b/dashboard/test/utils/fake_index_state.dart deleted file mode 100644 index dab729994..000000000 --- a/dashboard/test/utils/fake_index_state.dart +++ /dev/null @@ -1,20 +0,0 @@ -// 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:flutter/foundation.dart'; -import 'package:flutter_dashboard/logic/brooks.dart'; -import 'package:flutter_dashboard/service/google_authentication.dart'; -import 'package:flutter_dashboard/state/index.dart'; - -import 'mocks.dart'; - -class FakeIndexState extends ChangeNotifier implements IndexState { - FakeIndexState({GoogleSignInService? authService}) : authService = authService ?? MockGoogleSignInService(); - - @override - final GoogleSignInService authService; - - @override - final ErrorSink errors = ErrorSink(); -} diff --git a/dashboard/test/utils/wrapper.dart b/dashboard/test/utils/wrapper.dart index 3a6d4cc83..1db59d856 100644 --- a/dashboard/test/utils/wrapper.dart +++ b/dashboard/test/utils/wrapper.dart @@ -9,7 +9,6 @@ import 'package:mockito/mockito.dart'; import 'fake_build.dart'; import 'fake_google_account.dart'; -import 'fake_index_state.dart'; import 'mocks.dart'; class FakeInserter extends StatelessWidget { @@ -32,7 +31,6 @@ class FakeInserter extends StatelessWidget { return StateProvider( signInService: fakeAuthService, - indexState: FakeIndexState(authService: fakeAuthService), buildState: FakeBuildState(authService: fakeAuthService), child: Now.fixed( dateTime: DateTime.utc(2000), From 679f51f4cd1538483e81c6cf98c1eb6a01291a0f Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 14 Nov 2023 17:07:33 -0800 Subject: [PATCH 05/49] Add a feature that allows treating `presubmit: false` as `true`, conditionally. (#3256) Closes https://github.com/flutter/flutter/issues/138430 and I believe https://github.com/flutter/flutter/issues/111418. As @CaseyHillers mentions in https://github.com/flutter/flutter/issues/138430, this would _not_ be sufficient to understand the addition of a label (only if the PR is _first created_ with a label, or a commit is pushed after the label is added), but it might be worth merging as-is (assuming I got all of the assumptions correct). --- app_dart/lib/src/service/scheduler.dart | 36 +++++++++++-- app_dart/test/service/scheduler_test.dart | 66 +++++++++++++++++++++++ 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart index fb33d6c84..509e1f569 100644 --- a/app_dart/lib/src/service/scheduler.dart +++ b/app_dart/lib/src/service/scheduler.dart @@ -436,10 +436,25 @@ class Scheduler { log.info('Collecting presubmit targets for ${pullRequest.number}'); // Filter out schedulers targets with schedulers different than luci or cocoon. - final Iterable presubmitTargets = ciYaml.presubmitTargets.where( - (Target target) => - target.value.scheduler == pb.SchedulerSystem.luci || target.value.scheduler == pb.SchedulerSystem.cocoon, - ); + final List presubmitTargets = ciYaml.presubmitTargets + .where( + (Target target) => + target.value.scheduler == pb.SchedulerSystem.luci || target.value.scheduler == pb.SchedulerSystem.cocoon, + ) + .toList(); + + // See https://github.com/flutter/flutter/issues/138430. + if (_includePostsubmitAsPresubmit(ciYaml, pullRequest)) { + log.info('Including postsubmit targets as presubmit for ${pullRequest.number}'); + + for (Target target in ciYaml.postsubmitTargets) { + // We don't want to include a presubmit twice + // We don't want to run the builder_cache target as a presubmit + if (!target.value.presubmit && !target.value.properties.containsKey('cache_name')) { + presubmitTargets.add(target); + } + } + } log.info('Collected ${presubmitTargets.length} presubmit targets.'); // Release branches should run every test. @@ -462,6 +477,19 @@ class Scheduler { return getTargetsToRun(presubmitTargets, files); } + /// Returns `true` if [ciYaml.postsubmitTargets] should be ran during presubmit. + static bool _includePostsubmitAsPresubmit(CiYaml ciYaml, PullRequest pullRequest) { + // Only allow this for flutter/engine. + // See https://github.com/flutter/cocoon/pull/3256#issuecomment-1811624351. + if (ciYaml.slug != Config.engineSlug) { + return false; + } + if (pullRequest.labels?.any((label) => label.name.contains('test: all')) ?? false) { + return true; + } + return false; + } + /// Reschedules a failed build using a [CheckRunEvent]. The CheckRunEvent is /// generated when someone clicks the re-run button from a failed build from /// the Github UI. diff --git a/app_dart/test/service/scheduler_test.dart b/app_dart/test/service/scheduler_test.dart index 0d9426630..0592d5f80 100644 --- a/app_dart/test/service/scheduler_test.dart +++ b/app_dart/test/service/scheduler_test.dart @@ -690,6 +690,72 @@ targets: ); }); + group('treats postsubmit as presubmit if a label is present', () { + final IssueLabel runAllTests = IssueLabel(name: 'test: all'); + setUp(() async { + httpClient = MockClient((http.Request request) async { + if (request.url.path.contains('.ci.yaml')) { + return http.Response( + ''' + enabled_branches: + - master + targets: + - name: Linux Presubmit + presubmit: true + scheduler: luci + - name: Linux Postsubmit + presubmit: false + scheduler: luci + - name: Linux Cache + presubmit: false + scheduler: luci + properties: + cache_name: "builder" + ''', + 200, + ); + } + throw Exception('Failed to find ${request.url.path}'); + }); + }); + + test('with a specific label in the flutter/engine repo', () async { + final enginePr = generatePullRequest( + labels: [runAllTests], + repo: Config.engineSlug.name, + ); + final List presubmitTargets = await scheduler.getPresubmitTargets(enginePr); + expect( + presubmitTargets.map((Target target) => target.value.name).toList(), + ['Linux Presubmit', 'Linux Postsubmit'], + ); + }); + + test('with a specific label in the flutter/flutter repo', () async { + final enginePr = generatePullRequest( + labels: [runAllTests], + repo: Config.flutterSlug.name, + ); + final List presubmitTargets = await scheduler.getPresubmitTargets(enginePr); + expect( + presubmitTargets.map((Target target) => target.value.name).toList(), + ['Linux Presubmit'], + ); + }); + + test('without a specific label', () async { + final enginePr = generatePullRequest( + labels: [], + repo: Config.engineSlug.name, + ); + final List presubmitTargets = await scheduler.getPresubmitTargets(enginePr); + expect( + presubmitTargets.map((Target target) => target.value.name).toList(), + (['Linux Presubmit']), + ); + }); + }); + test('checks for release branches', () async { const String branch = 'flutter-1.24-candidate.1'; httpClient = MockClient((http.Request request) async { From 8190c87c534d3f12a69b4f6aed525feb8ed45e53 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Wed, 15 Nov 2023 10:32:46 -0800 Subject: [PATCH 06/49] [codesign] Add verbose flag to notarytool submit (#3259) --- .../lib/src/file_codesign_visitor.dart | 1 + .../test/file_codesign_visitor_test.dart | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/cipd_packages/codesign/lib/src/file_codesign_visitor.dart b/cipd_packages/codesign/lib/src/file_codesign_visitor.dart index 6d5da9c3d..a7b0cbf32 100644 --- a/cipd_packages/codesign/lib/src/file_codesign_visitor.dart +++ b/cipd_packages/codesign/lib/src/file_codesign_visitor.dart @@ -462,6 +462,7 @@ update these file paths accordingly. appSpecificPassword, '--team-id', codesignTeamId, + '--verbose', ]; log.info('uploading ${args.join(' ')}'); diff --git a/cipd_packages/codesign/test/file_codesign_visitor_test.dart b/cipd_packages/codesign/test/file_codesign_visitor_test.dart index 0b5e87bc7..a67d64153 100644 --- a/cipd_packages/codesign/test/file_codesign_visitor_test.dart +++ b/cipd_packages/codesign/test/file_codesign_visitor_test.dart @@ -153,6 +153,7 @@ void main() { randomString, '--team-id', randomString, + '--verbose', ], stdout: 'id: $randomString', ), @@ -199,7 +200,8 @@ void main() { expect( messages, contains( - 'uploading xcrun notarytool submit ${codesignVisitor.outputZipPath} --apple-id $randomString --password $randomString --team-id $randomString', + 'uploading xcrun notarytool submit ${codesignVisitor.outputZipPath} --apple-id $randomString --password $randomString ' + '--team-id $randomString --verbose', ), ); expect( @@ -209,7 +211,8 @@ void main() { expect( messages, contains( - 'checking notary status with xcrun notarytool info $randomString --password $randomString --apple-id $randomString --team-id $randomString', + 'checking notary status with xcrun notarytool info $randomString --password $randomString --apple-id $randomString ' + '--team-id $randomString', ), ); expect( @@ -897,6 +900,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: '''Error uploading file. Id: something that causes failure @@ -914,6 +918,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: '''Successfully uploaded file. id: 2efe2717-52ef-43a5-96dc-0797e4ca1041 @@ -935,7 +940,8 @@ status: Invalid''', messages, contains('Failed to upload to the notary service with args: ' 'xcrun notarytool submit ${rootDirectory.absolute.path}/temp ' - '--apple-id abcd1234 --password abcd1234 --team-id abcd1234'), + '--apple-id abcd1234 --password abcd1234 --team-id abcd1234 ' + '--verbose'), ); expect( messages, @@ -958,6 +964,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: '''Error uploading file. Id: something that causes failure @@ -993,6 +1000,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: '''Error uploading file. Id: something that causes failure @@ -1010,6 +1018,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: '''Error uploading file. Id: something that causes failure @@ -1027,6 +1036,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: '''Error uploading file. Id: something that causes failure @@ -1123,6 +1133,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: 'id: $randomString', ), @@ -1190,6 +1201,7 @@ status: Invalid''', randomString, '--team-id', randomString, + '--verbose', ], stdout: 'id: $randomString', ), From fee00f441059bb2aa59518281a47c63dd1aa74dc Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 15 Nov 2023 11:30:08 -0800 Subject: [PATCH 07/49] Add license goldens to the engine test exclusion list (#3258) Everything in `/ci/licenses_golden/` in the engine repo should be test-exempt. --- .../github/webhook_subscription.dart | 2 ++ .../github/webhook_subscription_test.dart | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart index 9c6a1f634..b436a182b 100644 --- a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart +++ b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart @@ -402,6 +402,8 @@ class GithubWebhookSubscription extends SubscriptionHandler { final String filename = file.filename!; if (_fileContainsAddedCode(file) && !_isTestExempt(filename) && + // License goldens are auto-generated. + !filename.startsWith('ci/licenses_golden/') && // Build files don't need unit tests. !filename.endsWith('.gn') && !filename.endsWith('.gni')) { diff --git a/app_dart/test/request_handlers/github/webhook_subscription_test.dart b/app_dart/test/request_handlers/github/webhook_subscription_test.dart index 1da2a43ad..8808a745a 100644 --- a/app_dart/test/request_handlers/github/webhook_subscription_test.dart +++ b/app_dart/test/request_handlers/github/webhook_subscription_test.dart @@ -1470,6 +1470,41 @@ void foo() { ); }); + test('Engine labels PRs, no comment for license goldens', () async { + const int issueNumber = 123; + + tester.message = generateGithubWebhookMessage( + action: 'opened', + number: issueNumber, + baseRef: 'main', + slug: Config.engineSlug, + ); + + when(pullRequestsService.listFiles(Config.engineSlug, issueNumber)).thenAnswer( + (_) => Stream.value( + PullRequestFile()..filename = 'ci/licenses_golden/licenses_dart', + ), + ); + + await tester.post(webhook); + + verifyNever( + issuesService.addLabelsToIssue( + Config.engineSlug, + issueNumber, + any, + ), + ); + + verifyNever( + issuesService.createComment( + Config.engineSlug, + issueNumber, + any, + ), + ); + }); + test('Engine labels PRs, no comment if Java tests', () async { const int issueNumber = 123; From 6167fad93c2b7f27534464a8f1993c4619705c1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 19:05:08 +0000 Subject: [PATCH 08/49] Bump @typescript-eslint/parser from 6.10.0 to 6.11.0 in /gh_actions/third_party/no-response (#3255) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.10.0 to 6.11.0.
Release notes

Sourced from @​typescript-eslint/parser's releases.

v6.11.0

6.11.0 (2023-11-13)

Bug Fixes

  • eslint-plugin: [explicit-function-return-type] support JSX attributes in allowTypedFunctionExpressions (#7553) (be2777c)
  • eslint-plugin: [no-unnecessary-qualifier] handle nested namespace id (#7883) (a668f5b)

Features

  • add no-unsafe-unary-minus rule (#7390) (c4709c2)
  • add types for flat config files (#7273) (66cd0c0)
  • allow typescript 5.3.0-beta as devDependency (#7821) (b6c40b4)
  • eslint-plugin: no-unsafe-enum-comparison handles switch cases (#7898) (72cb9e4)
  • typescript-estree: skip isTTY version check if user passes loggerFn on unsupported TypeScript version warning (#7739) (9656e13)
  • utils: add ESLint CodePath selector types (#7551) (99a026f)
  • utils: update types to reflect RuleContext and SourceCode changes and deprecations (#7812) (b73d8b2)

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/parser's changelog.

6.11.0 (2023-11-13)

Note: Version bump only for package @​typescript-eslint/parser

You can read about our versioning strategy and releases on our website.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=6.10.0&new-version=6.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 171 ++++++++++++++++-- .../third_party/no-response/package.json | 2 +- 2 files changed, 157 insertions(+), 16 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 4a6aecb4e..4ae9f74d2 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -18,7 +18,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.8", "@types/node": "^20.9.0", - "@typescript-eslint/parser": "^6.10.0", + "@typescript-eslint/parser": "^6.11.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.53.0", "eslint-plugin-github": "^4.10.1", @@ -1640,15 +1640,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4" }, "engines": { @@ -1667,6 +1667,95 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", @@ -8481,16 +8570,68 @@ } }, "@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" + } + }, + "@typescript-eslint/types": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.11.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/scope-manager": { diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 226d0937a..6503e2a42 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -34,7 +34,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.8", "@types/node": "^20.9.0", - "@typescript-eslint/parser": "^6.10.0", + "@typescript-eslint/parser": "^6.11.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.53.0", "eslint-plugin-github": "^4.10.1", From 45bb225903e06eb29f824b60a06b1a37eaaf98eb Mon Sep 17 00:00:00 2001 From: godofredoc Date: Thu, 16 Nov 2023 11:53:06 -0800 Subject: [PATCH 09/49] Add autosubmit label to dependabot npm PRs. (#3261) This is to autoland NPM dependabot PRs if they pass tests. --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9642af835..93801197e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -87,3 +87,5 @@ updates: directory: '/gh_actions/third_party/no-response' schedule: interval: 'daily' + labels: + - "autosubmit" From fbdeef3c7cd8dd43e726d35d6443577603ba16d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 20:02:58 +0000 Subject: [PATCH 10/49] Bump dart from `88ced76` to `041c562` in /auto_submit (#3262) Bumps dart from `88ced76` to `041c562`. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart&package-manager=docker&previous-version=beta&new-version=beta)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- auto_submit/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto_submit/Dockerfile b/auto_submit/Dockerfile index 27652a3d4..bcd0e5c70 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:88ced76ff4a63e565872df26fe2442f060e3ecf828a272090ad10c79e9d044af +FROM dart:beta@sha256:041c5624cabe298d12774cd03969e8139c02e73055d2f3edd7f5d1c2f7e943a3 WORKDIR /app From d3bb25bcb26ca23a5aca828ad3d42fde174c5291 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 20:02:59 +0000 Subject: [PATCH 11/49] Bump dart from `88ced76` to `041c562` in /app_dart (#3263) Bumps dart from `88ced76` to `041c562`. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart&package-manager=docker&previous-version=beta&new-version=beta)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/Dockerfile b/app_dart/Dockerfile index 27652a3d4..bcd0e5c70 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:88ced76ff4a63e565872df26fe2442f060e3ecf828a272090ad10c79e9d044af +FROM dart:beta@sha256:041c5624cabe298d12774cd03969e8139c02e73055d2f3edd7f5d1c2f7e943a3 WORKDIR /app From 66cc6ceda56ab1715b6bcf23464bacd33d6b3a10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 20:06:05 +0000 Subject: [PATCH 12/49] Bump github from 9.19.0 to 9.20.0 in /auto_submit (#3265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github](https://github.com/SpinlockLabs/github.dart) from 9.19.0 to 9.20.0.
Release notes

Sourced from github's releases.

9.20.0

What's Changed

Full Changelog: https://github.com/SpinlockLabs/github.dart/compare/9.19.0...9.20.0

Changelog

Sourced from github's changelog.

9.20.0

Full Changelog: https://github.com/SpinlockLabs/github.dart/compare/9.19.0...9.20.0

Commits
  • 94ffec8 prep 9.20.0
  • 01a87bf Add a Changes object to the PullRequestEvent object so we can see what change...
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github&package-manager=pub&previous-version=9.19.0&new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- auto_submit/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml index 324b13823..f4d0453a6 100644 --- a/auto_submit/pubspec.yaml +++ b/auto_submit/pubspec.yaml @@ -13,7 +13,7 @@ environment: dependencies: appengine: 0.13.7 corsac_jwt: 1.0.0-nullsafety.1 - github: 9.19.0 + github: 9.20.0 googleapis: 11.4.0 googleapis_auth: 1.4.1 graphql: 5.2.0-beta.6 From ef231b9464013e570fe467d01116e59bbc1b2e2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 20:06:06 +0000 Subject: [PATCH 13/49] Bump github from 9.19.0 to 9.20.0 in /app_dart (#3264) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github](https://github.com/SpinlockLabs/github.dart) from 9.19.0 to 9.20.0.
Release notes

Sourced from github's releases.

9.20.0

What's Changed

Full Changelog: https://github.com/SpinlockLabs/github.dart/compare/9.19.0...9.20.0

Changelog

Sourced from github's changelog.

9.20.0

Full Changelog: https://github.com/SpinlockLabs/github.dart/compare/9.19.0...9.20.0

Commits
  • 94ffec8 prep 9.20.0
  • 01a87bf Add a Changes object to the PullRequestEvent object so we can see what change...
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github&package-manager=pub&previous-version=9.19.0&new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index c6f9fc746..99e1d2777 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: file: 7.0.0 fixnum: 1.1.0 gcloud: 0.8.11 - github: 9.19.0 + github: 9.20.0 googleapis: 11.4.0 googleapis_auth: 1.4.1 gql: 1.0.1-alpha+1696717343881 From a1dea491388d9553421b2606160879ffdf4c970a Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Thu, 16 Nov 2023 12:56:35 -0800 Subject: [PATCH 14/49] =?UTF-8?q?Change=20`test:=20all`=20labels=20to=20al?= =?UTF-8?q?so=20skip=20`runIf[Not]s`,=20since=20the=20goal=20is=20to=20run?= =?UTF-8?q?=20all=20=F0=9F=98=8E=20=20(#3260)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/flutter/flutter/issues/138559. The `test: all` label should not skip presubmits, since that sort of defeats the point :) /cc @gaaclarke @dnfield --- app_dart/lib/src/service/scheduler.dart | 9 +++-- app_dart/test/service/scheduler_test.dart | 40 ++++++++++++++++++++--- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart index 509e1f569..9ba95808a 100644 --- a/app_dart/lib/src/service/scheduler.dart +++ b/app_dart/lib/src/service/scheduler.dart @@ -444,7 +444,8 @@ class Scheduler { .toList(); // See https://github.com/flutter/flutter/issues/138430. - if (_includePostsubmitAsPresubmit(ciYaml, pullRequest)) { + final includePostsubmitAsPresubmit = _includePostsubmitAsPresubmit(ciYaml, pullRequest); + if (includePostsubmitAsPresubmit) { log.info('Including postsubmit targets as presubmit for ${pullRequest.number}'); for (Target target in ciYaml.postsubmitTargets) { @@ -460,7 +461,11 @@ class Scheduler { // Release branches should run every test. if (pullRequest.base!.ref != Config.defaultBranch(pullRequest.base!.repo!.slug())) { log.info('Release branch found, scheduling all targets for ${pullRequest.number}'); - return presubmitTargets.toList(); + return presubmitTargets; + } + if (includePostsubmitAsPresubmit) { + log.info('Postsubmit targets included as presubmit, scheduling all targets for ${pullRequest.number}'); + return presubmitTargets; } // Filter builders based on the PR diff diff --git a/app_dart/test/service/scheduler_test.dart b/app_dart/test/service/scheduler_test.dart index 0592d5f80..fdc460416 100644 --- a/app_dart/test/service/scheduler_test.dart +++ b/app_dart/test/service/scheduler_test.dart @@ -698,11 +698,22 @@ targets: return http.Response( ''' enabled_branches: + - main - master targets: - name: Linux Presubmit presubmit: true scheduler: luci + - name: Linux Conditional Presubmit (runIf) + presubmit: true + scheduler: luci + runIf: + - dev/run_if/** + - name: Linux Conditional Presubmit (runIfNot) + presubmit: true + scheduler: luci + runIfNot: + - dev/run_if_not/** - name: Linux Postsubmit presubmit: false scheduler: luci @@ -721,37 +732,56 @@ targets: test('with a specific label in the flutter/engine repo', () async { final enginePr = generatePullRequest( + branch: Config.defaultBranch(Config.engineSlug), labels: [runAllTests], repo: Config.engineSlug.name, ); final List presubmitTargets = await scheduler.getPresubmitTargets(enginePr); expect( presubmitTargets.map((Target target) => target.value.name).toList(), - ['Linux Presubmit', 'Linux Postsubmit'], + [ + // Always runs. + 'Linux Presubmit', + // test: all label is present, so runIf is skipped. + 'Linux Conditional Presubmit (runIf)', + 'Linux Conditional Presubmit (runIfNot)', + // test: all label is present, so postsubmit is treated as presubmit. + 'Linux Postsubmit', + ], ); }); test('with a specific label in the flutter/flutter repo', () async { - final enginePr = generatePullRequest( + final frameworkPr = generatePullRequest( + branch: Config.defaultBranch(Config.flutterSlug), labels: [runAllTests], repo: Config.flutterSlug.name, ); - final List presubmitTargets = await scheduler.getPresubmitTargets(enginePr); + final List presubmitTargets = await scheduler.getPresubmitTargets(frameworkPr); expect( presubmitTargets.map((Target target) => target.value.name).toList(), - ['Linux Presubmit'], + [ + // Always runs. + 'Linux Presubmit', + 'Linux Conditional Presubmit (runIfNot)', + ], ); }); test('without a specific label', () async { final enginePr = generatePullRequest( + branch: Config.defaultBranch(Config.engineSlug), labels: [], repo: Config.engineSlug.name, ); final List presubmitTargets = await scheduler.getPresubmitTargets(enginePr); expect( presubmitTargets.map((Target target) => target.value.name).toList(), - (['Linux Presubmit']), + ([ + // Always runs. + 'Linux Presubmit', + 'Linux Conditional Presubmit (runIfNot)', + ]), ); }); }); From 5126de09405ee511cf73c48e87114e5bae1e61e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:15:51 +0000 Subject: [PATCH 15/49] Bump mockito from 5.4.2 to 5.4.3 in /dashboard (#3266) Bumps [mockito](https://github.com/dart-lang/mockito) from 5.4.2 to 5.4.3.
Changelog

Sourced from mockito's changelog.

5.4.3

  • Require analyzer 5.12.0, allow analyzer version 6.x;
  • Add example of writing a class to mock function objects.
  • Add support for the build_extensions build.yaml option
  • Require Dart >=3.1.0.
  • Potentially breaking Changed default String value returned by nice mocks' unstubbed method to include some useful info. This could break the tests that relied on getting an empty String from unstubbed methods.
  • Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull MockSpec options.
Commits
  • fb8a2b5 No public description
  • 2f41028 Merge pull request #719 from dart-lang:latest_lints
  • 8b5036b release later
  • ecc62f6 Update to the latest lints, require Dart 3.1, prepare release
  • dc3eb65 Generate valid functions with optional non-nullable arguments
  • fcb9779 Bump actions/checkout from 4.1.0 to 4.1.1 (#713)
  • 1c4a6ff Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (#712)
  • b7d752e Use Dart SDK 3.1.0 for format check
  • ca537db Remove unneeded deprecation warning disable comment
  • 1a0d0e7 Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mockito&package-manager=pub&previous-version=5.4.2&new-version=5.4.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- dashboard/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index e168bc597..e3ff9dee5 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -42,7 +42,7 @@ dev_dependencies: flutter_lints: 3.0.1 flutter_test: sdk: flutter - mockito: 5.4.2 # Remember to run ./regen_mocks.sh! + mockito: 5.4.3 # Remember to run ./regen_mocks.sh! path: 1.8.3 url_launcher_platform_interface: 2.2.0 From 85e58f1e865c0bc9f2d51c4e08a29ab2846f925e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:36:04 +0000 Subject: [PATCH 16/49] Bump mockito from 5.4.2 to 5.4.3 in /app_dart (#3267) Bumps [mockito](https://github.com/dart-lang/mockito) from 5.4.2 to 5.4.3.
Changelog

Sourced from mockito's changelog.

5.4.3

  • Require analyzer 5.12.0, allow analyzer version 6.x;
  • Add example of writing a class to mock function objects.
  • Add support for the build_extensions build.yaml option
  • Require Dart >=3.1.0.
  • Potentially breaking Changed default String value returned by nice mocks' unstubbed method to include some useful info. This could break the tests that relied on getting an empty String from unstubbed methods.
  • Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull MockSpec options.
Commits
  • fb8a2b5 No public description
  • 2f41028 Merge pull request #719 from dart-lang:latest_lints
  • 8b5036b release later
  • ecc62f6 Update to the latest lints, require Dart 3.1, prepare release
  • dc3eb65 Generate valid functions with optional non-nullable arguments
  • fcb9779 Bump actions/checkout from 4.1.0 to 4.1.1 (#713)
  • 1c4a6ff Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (#712)
  • b7d752e Use Dart SDK 3.1.0 for format check
  • ca537db Remove unneeded deprecation warning disable comment
  • 1a0d0e7 Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mockito&package-manager=pub&previous-version=5.4.2&new-version=5.4.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index 99e1d2777..024784144 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -47,7 +47,7 @@ dev_dependencies: fake_async: 1.3.1 flutter_lints: 3.0.1 json_serializable: 6.7.1 - mockito: 5.4.2 + mockito: 5.4.3 platform: 3.1.3 test: 1.24.9 From 6a18056e10021ee7802f6b4ca9ac4b06b42567b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:52:33 +0000 Subject: [PATCH 17/49] Bump @types/node from 20.9.0 to 20.9.1 in /gh_actions/third_party/no-response (#3270) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.9.0 to 20.9.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.9.0&new-version=20.9.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 4ae9f74d2..f1e461c1f 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", + "@types/node": "^20.9.1", "@typescript-eslint/parser": "^6.11.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.53.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "version": "20.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz", + "integrity": "sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8504,9 +8504,9 @@ "dev": true }, "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "version": "20.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz", + "integrity": "sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==", "dev": true, "requires": { "undici-types": "~5.26.4" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 6503e2a42..af292ee19 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", + "@types/node": "^20.9.1", "@typescript-eslint/parser": "^6.11.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.53.0", From 43afc33fa53399c9e6159093acb1af0da36abdd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:55:45 +0000 Subject: [PATCH 18/49] Bump mockito from 5.4.2 to 5.4.3 in /analyze (#3268) Bumps [mockito](https://github.com/dart-lang/mockito) from 5.4.2 to 5.4.3.
Changelog

Sourced from mockito's changelog.

5.4.3

  • Require analyzer 5.12.0, allow analyzer version 6.x;
  • Add example of writing a class to mock function objects.
  • Add support for the build_extensions build.yaml option
  • Require Dart >=3.1.0.
  • Potentially breaking Changed default String value returned by nice mocks' unstubbed method to include some useful info. This could break the tests that relied on getting an empty String from unstubbed methods.
  • Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull MockSpec options.
Commits
  • fb8a2b5 No public description
  • 2f41028 Merge pull request #719 from dart-lang:latest_lints
  • 8b5036b release later
  • ecc62f6 Update to the latest lints, require Dart 3.1, prepare release
  • dc3eb65 Generate valid functions with optional non-nullable arguments
  • fcb9779 Bump actions/checkout from 4.1.0 to 4.1.1 (#713)
  • 1c4a6ff Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (#712)
  • b7d752e Use Dart SDK 3.1.0 for format check
  • ca537db Remove unneeded deprecation warning disable comment
  • 1a0d0e7 Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mockito&package-manager=pub&previous-version=5.4.2&new-version=5.4.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- analyze/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analyze/pubspec.yaml b/analyze/pubspec.yaml index 46bce17e5..9241662d2 100644 --- a/analyze/pubspec.yaml +++ b/analyze/pubspec.yaml @@ -11,5 +11,5 @@ dependencies: platform: 3.1.3 dev_dependencies: - mockito: 5.4.2 + mockito: 5.4.3 test_api: 0.6.1 From 8e9f76560f957afc43da0341e06ab33bc0d455a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:55:47 +0000 Subject: [PATCH 19/49] Bump mockito from 5.4.2 to 5.4.3 in /auto_submit (#3269) Bumps [mockito](https://github.com/dart-lang/mockito) from 5.4.2 to 5.4.3.
Changelog

Sourced from mockito's changelog.

5.4.3

  • Require analyzer 5.12.0, allow analyzer version 6.x;
  • Add example of writing a class to mock function objects.
  • Add support for the build_extensions build.yaml option
  • Require Dart >=3.1.0.
  • Potentially breaking Changed default String value returned by nice mocks' unstubbed method to include some useful info. This could break the tests that relied on getting an empty String from unstubbed methods.
  • Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull MockSpec options.
Commits
  • fb8a2b5 No public description
  • 2f41028 Merge pull request #719 from dart-lang:latest_lints
  • 8b5036b release later
  • ecc62f6 Update to the latest lints, require Dart 3.1, prepare release
  • dc3eb65 Generate valid functions with optional non-nullable arguments
  • fcb9779 Bump actions/checkout from 4.1.0 to 4.1.1 (#713)
  • 1c4a6ff Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (#712)
  • b7d752e Use Dart SDK 3.1.0 for format check
  • ca537db Remove unneeded deprecation warning disable comment
  • 1a0d0e7 Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mockito&package-manager=pub&previous-version=5.4.2&new-version=5.4.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- auto_submit/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml index f4d0453a6..38159bfb8 100644 --- a/auto_submit/pubspec.yaml +++ b/auto_submit/pubspec.yaml @@ -34,7 +34,7 @@ dev_dependencies: build_runner: 2.4.6 json_serializable: 6.7.1 flutter_lints: 3.0.1 - mockito: 5.4.2 + mockito: 5.4.3 test: 1.24.9 builders: From 2f29b2836504f9448eab197baad0f05c2bc5d6ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 23:10:23 +0000 Subject: [PATCH 20/49] Bump mockito from 5.4.2 to 5.4.3 in /licenses (#3272) Bumps [mockito](https://github.com/dart-lang/mockito) from 5.4.2 to 5.4.3.
Changelog

Sourced from mockito's changelog.

5.4.3

  • Require analyzer 5.12.0, allow analyzer version 6.x;
  • Add example of writing a class to mock function objects.
  • Add support for the build_extensions build.yaml option
  • Require Dart >=3.1.0.
  • Potentially breaking Changed default String value returned by nice mocks' unstubbed method to include some useful info. This could break the tests that relied on getting an empty String from unstubbed methods.
  • Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull MockSpec options.
Commits
  • fb8a2b5 No public description
  • 2f41028 Merge pull request #719 from dart-lang:latest_lints
  • 8b5036b release later
  • ecc62f6 Update to the latest lints, require Dart 3.1, prepare release
  • dc3eb65 Generate valid functions with optional non-nullable arguments
  • fcb9779 Bump actions/checkout from 4.1.0 to 4.1.1 (#713)
  • 1c4a6ff Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (#712)
  • b7d752e Use Dart SDK 3.1.0 for format check
  • ca537db Remove unneeded deprecation warning disable comment
  • 1a0d0e7 Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mockito&package-manager=pub&previous-version=5.4.2&new-version=5.4.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- licenses/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/licenses/pubspec.yaml b/licenses/pubspec.yaml index 39f954358..7c244dd85 100644 --- a/licenses/pubspec.yaml +++ b/licenses/pubspec.yaml @@ -9,5 +9,5 @@ dependencies: platform: 3.1.3 dev_dependencies: - mockito: 5.4.2 + mockito: 5.4.3 test_api: 0.6.1 From 42a4d80977a1185eabe9570610811a331ce38dc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 23:23:06 +0000 Subject: [PATCH 21/49] Bump mockito from 5.4.2 to 5.4.3 in /cipd_packages/device_doctor (#3271) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- Bumps [mockito](https://github.com/dart-lang/mockito) from 5.4.2 to 5.4.3.
Changelog

Sourced from mockito's changelog.

5.4.3

  • Require analyzer 5.12.0, allow analyzer version 6.x;
  • Add example of writing a class to mock function objects.
  • Add support for the build_extensions build.yaml option
  • Require Dart >=3.1.0.
  • Potentially breaking Changed default String value returned by nice mocks' unstubbed method to include some useful info. This could break the tests that relied on getting an empty String from unstubbed methods.
  • Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull MockSpec options.
Commits
  • fb8a2b5 No public description
  • 2f41028 Merge pull request #719 from dart-lang:latest_lints
  • 8b5036b release later
  • ecc62f6 Update to the latest lints, require Dart 3.1, prepare release
  • dc3eb65 Generate valid functions with optional non-nullable arguments
  • fcb9779 Bump actions/checkout from 4.1.0 to 4.1.1 (#713)
  • 1c4a6ff Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (#712)
  • b7d752e Use Dart SDK 3.1.0 for format check
  • ca537db Remove unneeded deprecation warning disable comment
  • 1a0d0e7 Remove deprecated returnNullOnMissingStub and OnMissingStub.returnNull
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mockito&package-manager=pub&previous-version=5.4.2&new-version=5.4.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- cipd_packages/device_doctor/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cipd_packages/device_doctor/pubspec.yaml b/cipd_packages/device_doctor/pubspec.yaml index 79e3fcf06..4f1ce7a84 100644 --- a/cipd_packages/device_doctor/pubspec.yaml +++ b/cipd_packages/device_doctor/pubspec.yaml @@ -18,5 +18,5 @@ dependencies: dev_dependencies: build_runner: 2.4.6 fake_async: 1.3.1 - mockito: 5.4.2 + mockito: 5.4.3 test: 1.24.9 From 8d41087188435e14d03df0ef3e129d62aadcc5e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:37:19 +0000 Subject: [PATCH 22/49] Bump analyzer from 5.13.0 to 6.3.0 in /app_dart (#3273) Bumps [analyzer](https://github.com/dart-lang/sdk/tree/main/pkg) from 5.13.0 to 6.3.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=analyzer&package-manager=pub&previous-version=5.13.0&new-version=6.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index 024784144..b2a57b8e8 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -42,7 +42,7 @@ dependencies: yaml: 3.1.2 dev_dependencies: - analyzer: 5.13.0 + analyzer: 6.3.0 build_runner: 2.4.6 fake_async: 1.3.1 flutter_lints: 3.0.1 From aca5037353a63c0712dcd9b7298292f33dc5902b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:43:43 +0000 Subject: [PATCH 23/49] Bump eslint from 8.53.0 to 8.54.0 in /gh_actions/third_party/no-response (#3274) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [eslint](https://github.com/eslint/eslint) from 8.53.0 to 8.54.0.
Release notes

Sourced from eslint's releases.

v8.54.0

Features

  • a7a883b feat: for-direction rule add check for condition in reverse order (#17755) (Angelo Annunziata)
  • 1452dc9 feat: Add suggestions to no-console (#17680) (Joel Mathew Koshy)
  • 21ebf8a feat: update no-array-constructor rule (#17711) (Francesco Trotta)

Bug Fixes

  • 98926e6 fix: Ensure that extra data is not accidentally stored in the cache file (#17760) (Milos Djermanovic)
  • e8cf9f6 fix: Make dark scroll bar in dark theme (#17753) (Pavel)
  • 3cbeaad fix: Use cwd constructor option as config basePath in Linter (#17705) (Milos Djermanovic)

Documentation

  • becfdd3 docs: Make clear when rules are removed (#17728) (Nicholas C. Zakas)
  • 05d6e99 docs: update "Submit a Pull Request" page (#17712) (Francesco Trotta)
  • eb2279e docs: display info about deprecated rules (#17749) (Percy Ma)
  • d245326 docs: Correct working in migrating plugin docs (#17722) (Filip TammergÃ¥rd)

Chores

  • d644de9 chore: upgrade @​eslint/js@​8.54.0 (#17773) (Milos Djermanovic)
  • 1e6e314 chore: package.json update for @​eslint/js release (Jenkins)
  • 6fb8805 chore: Fixed grammar in issue_templates/rule_change (#17770) (Joel Mathew Koshy)
  • 85db724 chore: upgrade markdownlint to 0.31.1 (#17754) (Nitin Kumar)
  • 6d470d2 chore: update dependency recast to ^0.23.0 (#17736) (renovate[bot])
  • b7121b5 chore: update dependency markdownlint-cli to ^0.37.0 (#17735) (renovate[bot])
  • 633b9a1 chore: update dependency regenerator-runtime to ^0.14.0 (#17739) (renovate[bot])
  • acac16f chore: update dependency vite-plugin-commonjs to ^0.10.0 (#17740) (renovate[bot])
  • ba8ca7e chore: add .github/renovate.json5 (#17567) (Josh Goldberg ✨)
Changelog

Sourced from eslint's changelog.

v8.54.0 - November 17, 2023

  • d644de9 chore: upgrade @​eslint/js@​8.54.0 (#17773) (Milos Djermanovic)
  • 1e6e314 chore: package.json update for @​eslint/js release (Jenkins)
  • 98926e6 fix: Ensure that extra data is not accidentally stored in the cache file (#17760) (Milos Djermanovic)
  • a7a883b feat: for-direction rule add check for condition in reverse order (#17755) (Angelo Annunziata)
  • 1452dc9 feat: Add suggestions to no-console (#17680) (Joel Mathew Koshy)
  • 6fb8805 chore: Fixed grammar in issue_templates/rule_change (#17770) (Joel Mathew Koshy)
  • becfdd3 docs: Make clear when rules are removed (#17728) (Nicholas C. Zakas)
  • e8cf9f6 fix: Make dark scroll bar in dark theme (#17753) (Pavel)
  • 85db724 chore: upgrade markdownlint to 0.31.1 (#17754) (Nitin Kumar)
  • 21ebf8a feat: update no-array-constructor rule (#17711) (Francesco Trotta)
  • 05d6e99 docs: update "Submit a Pull Request" page (#17712) (Francesco Trotta)
  • eb2279e docs: display info about deprecated rules (#17749) (Percy Ma)
  • 6d470d2 chore: update dependency recast to ^0.23.0 (#17736) (renovate[bot])
  • b7121b5 chore: update dependency markdownlint-cli to ^0.37.0 (#17735) (renovate[bot])
  • 633b9a1 chore: update dependency regenerator-runtime to ^0.14.0 (#17739) (renovate[bot])
  • acac16f chore: update dependency vite-plugin-commonjs to ^0.10.0 (#17740) (renovate[bot])
  • ba8ca7e chore: add .github/renovate.json5 (#17567) (Josh Goldberg ✨)
  • 3cbeaad fix: Use cwd constructor option as config basePath in Linter (#17705) (Milos Djermanovic)
  • d245326 docs: Correct working in migrating plugin docs (#17722) (Filip TammergÃ¥rd)
  • 5454c22 Revert "chore: remove metascraper (#17707)" (#17708) (Milos Djermanovic)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint&package-manager=npm_and_yarn&previous-version=8.53.0&new-version=8.54.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 30 +++++++++---------- .../third_party/no-response/package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index f1e461c1f..522e9ebd7 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -20,7 +20,7 @@ "@types/node": "^20.9.1", "@typescript-eslint/parser": "^6.11.0", "@vercel/ncc": "^0.38.1", - "eslint": "^8.53.0", + "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", "eslint-plugin-jest": "^27.6.0", "extract-pr-titles": "^1.1.0", @@ -771,9 +771,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2969,14 +2969,14 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -7874,9 +7874,9 @@ } }, "@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==" + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==" }, "@fastify/busboy": { "version": "2.0.0", @@ -9489,14 +9489,14 @@ "dev": true }, "eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index af292ee19..75edfac19 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -36,7 +36,7 @@ "@types/node": "^20.9.1", "@typescript-eslint/parser": "^6.11.0", "@vercel/ncc": "^0.38.1", - "eslint": "^8.53.0", + "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", "eslint-plugin-jest": "^27.6.0", "extract-pr-titles": "^1.1.0", From fcd264400109d6b1d0156a5148ffc1b573a0fcc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:17:55 +0000 Subject: [PATCH 24/49] Bump analyzer from 5.13.0 to 6.3.0 in /cipd_packages/device_doctor (#3275) Bumps [analyzer](https://github.com/dart-lang/sdk/tree/main/pkg) from 5.13.0 to 6.3.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=analyzer&package-manager=pub&previous-version=5.13.0&new-version=6.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- cipd_packages/device_doctor/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cipd_packages/device_doctor/pubspec.yaml b/cipd_packages/device_doctor/pubspec.yaml index 4f1ce7a84..4fc066e6d 100644 --- a/cipd_packages/device_doctor/pubspec.yaml +++ b/cipd_packages/device_doctor/pubspec.yaml @@ -6,7 +6,7 @@ environment: sdk: ">=2.18.0 <4.0.0" dependencies: - analyzer: 5.13.0 + analyzer: 6.3.0 args: 2.4.2 logging: 1.2.0 meta: 1.11.0 From 65bba1500e1fee92e50f352ad89a0ec831895fac Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:34:49 -0800 Subject: [PATCH 25/49] Reschedule presubmit targets when base ref is changed (#3211) When the base reference is automatically switched we now rescheduler the try targets so it does not have to be done manually. *List which issues are fixed by this PR. You must list at least one issue.* Fixes https://github.com/flutter/flutter/issues/137776 *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].* --- .../github/webhook_subscription.dart | 6 +- .../github/webhook_subscription_test.dart | 55 ++++++++++++++++++- app_dart/test/src/service/fake_scheduler.dart | 24 ++++++-- .../src/utilities/webhook_generators.dart | 15 +++++ 4 files changed, 91 insertions(+), 9 deletions(-) diff --git a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart index b436a182b..dd5d75e70 100644 --- a/app_dart/lib/src/request_handlers/github/webhook_subscription.dart +++ b/app_dart/lib/src/request_handlers/github/webhook_subscription.dart @@ -183,9 +183,11 @@ class GithubWebhookSubscription extends SubscriptionHandler { } break; case 'edited': - // Editing a PR should not trigger new jobs, but may update whether - // it has tests. await _checkForTests(pullRequestEvent); + // In the event of the base ref changing we want to start new checks. + if (pullRequestEvent.changes != null && pullRequestEvent.changes!.base != null) { + await _scheduleIfMergeable(pullRequestEvent); + } break; case 'opened': case 'reopened': diff --git a/app_dart/test/request_handlers/github/webhook_subscription_test.dart b/app_dart/test/request_handlers/github/webhook_subscription_test.dart index 8808a745a..7abf5fe24 100644 --- a/app_dart/test/request_handlers/github/webhook_subscription_test.dart +++ b/app_dart/test/request_handlers/github/webhook_subscription_test.dart @@ -4,6 +4,7 @@ import 'package:cocoon_service/src/model/appengine/commit.dart'; import 'package:cocoon_service/src/model/luci/buildbucket.dart'; +import 'package:cocoon_service/src/model/luci/push_message.dart' as pm; import 'package:cocoon_service/src/request_handlers/github/webhook_subscription.dart'; import 'package:cocoon_service/src/service/cache_service.dart'; import 'package:cocoon_service/src/service/config.dart'; @@ -272,13 +273,15 @@ void main() { test('Acts on opened against master when default is main', () async { const int issueNumber = 123; - tester.message = generateGithubWebhookMessage( + final pm.PushMessage pushMessage = generateGithubWebhookMessage( action: 'opened', number: issueNumber, baseRef: 'master', slug: Config.engineSlug, ); + tester.message = pushMessage; + when(pullRequestsService.listFiles(Config.engineSlug, issueNumber)).thenAnswer( (_) => Stream.value( PullRequestFile()..filename = 'packages/flutter/blah.dart', @@ -308,6 +311,56 @@ void main() { argThat(contains('master -> main')), ), ).called(1); + + expect(scheduler.triggerPresubmitTargetsCallCount, 1); + scheduler.resetTriggerPresubmitTargetsCallCount(); + }); + + test('Acts on edited against master when default is main', () async { + const int issueNumber = 123; + + final pm.PushMessage pushMessage = generateGithubWebhookMessage( + action: 'edited', + number: issueNumber, + baseRef: 'master', + slug: Config.engineSlug, + includeChanges: true, + ); + + tester.message = pushMessage; + + when(pullRequestsService.listFiles(Config.engineSlug, issueNumber)).thenAnswer( + (_) => Stream.value( + PullRequestFile()..filename = 'packages/flutter/blah.dart', + ), + ); + + when(issuesService.listCommentsByIssue(Config.engineSlug, issueNumber)).thenAnswer( + (_) => Stream.value( + IssueComment()..body = 'some other comment', + ), + ); + + await tester.post(webhook); + + verify( + pullRequestsService.edit( + Config.engineSlug, + issueNumber, + base: 'main', + ), + ).called(1); + + verify( + issuesService.createComment( + Config.engineSlug, + issueNumber, + argThat(contains('master -> main')), + ), + ).called(1); + + expect(scheduler.triggerPresubmitTargetsCallCount, 1); + scheduler.resetTriggerPresubmitTargetsCallCount(); }); // We already schedule checks when a draft is opened, don't need to re-test diff --git a/app_dart/test/src/service/fake_scheduler.dart b/app_dart/test/src/service/fake_scheduler.dart index c07e772bc..e4c0db816 100644 --- a/app_dart/test/src/service/fake_scheduler.dart +++ b/app_dart/test/src/service/fake_scheduler.dart @@ -61,13 +61,9 @@ class FakeScheduler extends Scheduler { int cancelPreSubmitTargetsCallCnt = 0; - int get cancelPreSubmitTargetsCallCount { - return cancelPreSubmitTargetsCallCnt; - } + int get cancelPreSubmitTargetsCallCount => cancelPreSubmitTargetsCallCnt; - void resetCancelPreSubmitTargetsCallCount() { - cancelPreSubmitTargetsCallCnt = 0; - } + void resetCancelPreSubmitTargetsCallCount() => cancelPreSubmitTargetsCallCnt = 0; @override Future cancelPreSubmitTargets({ @@ -78,6 +74,22 @@ class FakeScheduler extends Scheduler { cancelPreSubmitTargetsCallCnt++; } + int triggerPresubmitTargetsCnt = 0; + + int get triggerPresubmitTargetsCallCount => triggerPresubmitTargetsCnt; + + void resetTriggerPresubmitTargetsCallCount() => triggerPresubmitTargetsCnt = 0; + + @override + Future triggerPresubmitTargets({ + required PullRequest pullRequest, + String reason = 'Newer commit available', + List? builderTriggerList, + }) async { + await super.triggerPresubmitTargets(pullRequest: pullRequest); + triggerPresubmitTargetsCnt++; + } + int addPullRequestCallCnt = 0; int get addPullRequestCallCount { diff --git a/app_dart/test/src/utilities/webhook_generators.dart b/app_dart/test/src/utilities/webhook_generators.dart index aa9c9a281..960f0f21e 100644 --- a/app_dart/test/src/utilities/webhook_generators.dart +++ b/app_dart/test/src/utilities/webhook_generators.dart @@ -23,6 +23,7 @@ PushMessage generateGithubWebhookMessage({ bool mergeable = true, String mergeCommitSha = 'fd6b46416c18de36ce87d0241994b2da180cab4c', RepositorySlug? slug, + bool includeChanges = false, }) { final String data = (pb.GithubWebhookMessage.create() ..event = event @@ -38,6 +39,7 @@ PushMessage generateGithubWebhookMessage({ isMergeable: mergeable, slug: slug, mergeCommitSha: mergeCommitSha, + includeChanges: includeChanges, )) .writeToJson(); return PushMessage(data: data, messageId: 'abc123'); @@ -56,9 +58,11 @@ String _generatePullRequestEvent( bool merged = false, bool isMergeable = true, String mergeCommitSha = 'fd6b46416c18de36ce87d0241994b2da180cab4c', + bool includeChanges = false, }) { slug ??= Config.flutterSlug; baseRef ??= Config.defaultBranch(slug); + return '''{ "action": "$action", "number": $number, @@ -436,6 +440,17 @@ String _generatePullRequestEvent( "deletions": 36, "changed_files": 5 }, + ${includeChanges ? ''' + "changes": { + "base": { + "ref": { + "from": "master" + }, + "sha": { + "from": "b3af5d64d3e6e2110b07d71909fc432537339659" + } + } + },''' : ''} "repository": { "id": 1868532, "node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=", From 034463e42ce635c7cc2c92d844c12d9630d21bd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 22:31:20 +0000 Subject: [PATCH 26/49] Bump @typescript-eslint/parser from 6.11.0 to 6.12.0 in /gh_actions/third_party/no-response (#3276) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.11.0 to 6.12.0.
Release notes

Sourced from @​typescript-eslint/parser's releases.

v6.12.0

6.12.0 (2023-11-20)

Bug Fixes

  • eslint-plugin: [class-methods-use-this] detect a problematic case for private/protected members if ignoreClassesThatImplementAnInterface is set (#7705) (155aa1f)
  • eslint-plugin: [no-unnecessary-condition] fix false positive with computed member access and branded key type (#7706) (f151b26)
  • eslint-plugin: [switch-exhaustiveness-check] enum members with new line or single quotes are not being fixed correctly (#7806) (a034d0a), closes #7768
  • utils: add missing fields to flat config types (#7933) (533861a)
  • utils: allow string processor in flat config (024ed9e)

Features

  • [member-ordering] add accessor support for member-ordering (#7927) (3c8312d)
  • eslint-plugin: [switch-exhaustiveness-check] add requireDefaultForNonUnion option (#7880) (4cfcd45)
  • update TypeScript to 5.3-rc (#7923) (9034d17)

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/parser's changelog.

6.12.0 (2023-11-20)

Note: Version bump only for package @​typescript-eslint/parser

You can read about our versioning strategy and releases on our website.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=6.11.0&new-version=6.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 98 +++++++++---------- .../third_party/no-response/package.json | 2 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 522e9ebd7..865d1c5aa 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -18,7 +18,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.8", "@types/node": "^20.9.1", - "@typescript-eslint/parser": "^6.11.0", + "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", @@ -1640,15 +1640,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4" }, "engines": { @@ -1668,13 +1668,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1685,9 +1685,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1698,13 +1698,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1725,12 +1725,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/types": "6.12.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -8570,42 +8570,42 @@ } }, "@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" } }, "@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -8614,12 +8614,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/types": "6.12.0", "eslint-visitor-keys": "^3.4.1" } }, diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 75edfac19..326b7ef31 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -34,7 +34,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.8", "@types/node": "^20.9.1", - "@typescript-eslint/parser": "^6.11.0", + "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", From 55a6aa4fcdbb10ab2b0212e70b7322dce9a3f2a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 22:33:57 +0000 Subject: [PATCH 27/49] Bump typescript from 5.2.2 to 5.3.2 in /gh_actions/third_party/no-response (#3277) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.2.2 to 5.3.2.
Release notes

Sourced from typescript's releases.

TypeScript 5.3

For release notes, check out the release announcement.

For the complete list of fixed issues, check out the

Downloads are available on:

TypeScript 5.3 RC

For release notes, check out the release announcement.

For the complete list of fixed issues, check out the

Downloads are available on:

TypeScript 5.3 Beta

For release notes, check out the release announcement.

For the complete list of fixed issues, check out the

Downloads are available on npm.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript&package-manager=npm_and_yarn&previous-version=5.2.2&new-version=5.3.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 865d1c5aa..b9438361d 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -28,7 +28,7 @@ "js-yaml": "^4.1.0", "prettier": "3.0.3", "ts-jest": "^29.1.1", - "typescript": "^5.2.2" + "typescript": "^5.3.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -7001,9 +7001,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12350,9 +12350,9 @@ } }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true }, "unbox-primitive": { diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 326b7ef31..d2f188ee0 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -44,6 +44,6 @@ "js-yaml": "^4.1.0", "prettier": "3.0.3", "ts-jest": "^29.1.1", - "typescript": "^5.2.2" + "typescript": "^5.3.2" } } From e8bcbb152961b0f40d866bc96e0253edec530a14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 22:35:18 +0000 Subject: [PATCH 28/49] Bump url_launcher_web from 2.2.0 to 2.2.1 in /dashboard (#3279) Bumps [url_launcher_web](https://github.com/flutter/packages/tree/main/packages/url_launcher) from 2.2.0 to 2.2.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=url_launcher_web&package-manager=pub&previous-version=2.2.0&new-version=2.2.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- dashboard/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index e3ff9dee5..a593c517a 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: url_launcher: 6.2.1 flutter_app_icons: 0.0.8 truncate: 3.0.1 - url_launcher_web: 2.2.0 + url_launcher_web: 2.2.1 dev_dependencies: build_runner: 2.4.6 From 90fc549e0d576fd6a38b317169d4925318378799 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 22:52:43 +0000 Subject: [PATCH 29/49] Bump @types/jest from 29.5.8 to 29.5.9 in /gh_actions/third_party/no-response (#3281) Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 29.5.8 to 29.5.9.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/jest&package-manager=npm_and_yarn&previous-version=29.5.8&new-version=29.5.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index b9438361d..2b89398c1 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@octokit/webhooks-types": "^7.3.1", - "@types/jest": "^29.5.8", + "@types/jest": "^29.5.9", "@types/node": "^20.9.1", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", @@ -1532,9 +1532,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.9", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz", + "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -8482,9 +8482,9 @@ } }, "@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.9", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz", + "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==", "dev": true, "requires": { "expect": "^29.0.0", diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index d2f188ee0..c63e5488b 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -32,7 +32,7 @@ }, "devDependencies": { "@octokit/webhooks-types": "^7.3.1", - "@types/jest": "^29.5.8", + "@types/jest": "^29.5.9", "@types/node": "^20.9.1", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", From de5178e46f48148d1c418287e4b3403e6e95a927 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 22:53:33 +0000 Subject: [PATCH 30/49] Bump @types/node from 20.9.1 to 20.9.3 in /gh_actions/third_party/no-response (#3280) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.9.1 to 20.9.3.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.9.1&new-version=20.9.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 2b89398c1..4ab86bc07 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.1", + "@types/node": "^20.9.3", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz", - "integrity": "sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==", + "version": "20.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", + "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8504,9 +8504,9 @@ "dev": true }, "@types/node": { - "version": "20.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz", - "integrity": "sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==", + "version": "20.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", + "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", "dev": true, "requires": { "undici-types": "~5.26.4" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index c63e5488b..e9c57be77 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.1", + "@types/node": "^20.9.3", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", From e781b1cf43ec27bf7575ae3549f2a8efc3712fdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 23:03:05 +0000 Subject: [PATCH 31/49] Bump dart from `041c562` to `8ecef6d` in /app_dart (#3282) Bumps dart from `041c562` to `8ecef6d`. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dart&package-manager=docker&previous-version=beta&new-version=beta)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/Dockerfile b/app_dart/Dockerfile index bcd0e5c70..16a8b0921 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:041c5624cabe298d12774cd03969e8139c02e73055d2f3edd7f5d1c2f7e943a3 +FROM dart:beta@sha256:8ecef6dda0e56347ce8ec6c5b114e7a6c599d041651c39b57eae160e178f4c9a WORKDIR /app From 39da6db67ffb11af623611f5212c052ffa33e686 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 22:48:06 +0000 Subject: [PATCH 32/49] Bump http from 1.1.0 to 1.1.1 in /app_dart (#3284) Bumps [http](https://github.com/dart-lang/http/tree/master/pkgs) from 1.1.0 to 1.1.1.
Commits
  • 5e84d9f Update platform-specific imports for wasm (#1051)
  • 8c9feb5 [http] Fix type cast for dart2wasm (#1050)
  • a2f0b25 [http] use pkg:web, require Dart 3.2 (#1049)
  • f0a02f9 Require a package:jni version without known buffer overflows (#1044)
  • b2717ba Create a flutter example application that uses multiple client implementation...
  • a2f3c1d Require package:jni >= 0.7.1 to fix macOS build (#1041)
  • f953aec Fix obsolete CronetClient() constructor usage (#1042)
  • 04777ac Add a skeleton "http_profile" package (#1036)
  • 7240d0a Remove obsolete pigeon-generated file (#1032)
  • 827f4fe Prepare to release cronet 0.4.0 (#1031)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=http&package-manager=pub&previous-version=1.1.0&new-version=1.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index b2a57b8e8..d6a44ab01 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: gql: 1.0.1-alpha+1696717343881 graphql: 5.2.0-beta.6 grpc: 3.2.4 - http: 1.1.0 + http: 1.1.1 json_annotation: 4.8.1 logging: 1.2.0 meta: 1.11.0 From dff1557fec1e8443b6607f7e188621a23de63d9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 23:04:53 +0000 Subject: [PATCH 33/49] Bump @types/node from 20.9.3 to 20.9.4 in /gh_actions/third_party/no-response (#3288) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.9.3 to 20.9.4.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.9.3&new-version=20.9.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 4ab86bc07..e5a195d61 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.3", + "@types/node": "^20.9.4", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", - "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", + "version": "20.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", + "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8504,9 +8504,9 @@ "dev": true }, "@types/node": { - "version": "20.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", - "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", + "version": "20.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", + "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", "dev": true, "requires": { "undici-types": "~5.26.4" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index e9c57be77..489fd3cb1 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.3", + "@types/node": "^20.9.4", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", From 3c0d502f92146db7f0887485d96bed881036132b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 22:17:12 +0000 Subject: [PATCH 34/49] Bump @types/node from 20.9.4 to 20.9.5 in /gh_actions/third_party/no-response (#3289) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.9.4 to 20.9.5.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.9.4&new-version=20.9.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index e5a195d61..328dcf629 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.4", + "@types/node": "^20.9.5", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", - "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", + "version": "20.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.5.tgz", + "integrity": "sha512-Uq2xbNq0chGg+/WQEU0LJTSs/1nKxz6u1iemLcGomkSnKokbW1fbLqc3HOqCf2JP7KjlL4QkS7oZZTrOQHQYgQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8504,9 +8504,9 @@ "dev": true }, "@types/node": { - "version": "20.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", - "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", + "version": "20.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.5.tgz", + "integrity": "sha512-Uq2xbNq0chGg+/WQEU0LJTSs/1nKxz6u1iemLcGomkSnKokbW1fbLqc3HOqCf2JP7KjlL4QkS7oZZTrOQHQYgQ==", "dev": true, "requires": { "undici-types": "~5.26.4" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 489fd3cb1..2dc5f31ef 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.4", + "@types/node": "^20.9.5", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", From dd9a246ba518cdf3a09cb486378f5a1ec7ae2403 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 22:46:16 +0000 Subject: [PATCH 35/49] Bump @types/node from 20.9.5 to 20.10.0 in /gh_actions/third_party/no-response (#3290) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.9.5 to 20.10.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.9.5&new-version=20.10.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 328dcf629..b7b5e17b5 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.5", + "@types/node": "^20.10.0", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.5.tgz", - "integrity": "sha512-Uq2xbNq0chGg+/WQEU0LJTSs/1nKxz6u1iemLcGomkSnKokbW1fbLqc3HOqCf2JP7KjlL4QkS7oZZTrOQHQYgQ==", + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8504,9 +8504,9 @@ "dev": true }, "@types/node": { - "version": "20.9.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.5.tgz", - "integrity": "sha512-Uq2xbNq0chGg+/WQEU0LJTSs/1nKxz6u1iemLcGomkSnKokbW1fbLqc3HOqCf2JP7KjlL4QkS7oZZTrOQHQYgQ==", + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", "dev": true, "requires": { "undici-types": "~5.26.4" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 2dc5f31ef..953aabaf7 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.9", - "@types/node": "^20.9.5", + "@types/node": "^20.10.0", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", From 165579b3e197c6e7b1935276fd75519b08ed29e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 19:25:01 +0000 Subject: [PATCH 36/49] Bump @types/jest from 29.5.9 to 29.5.10 in /gh_actions/third_party/no-response (#3287) Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 29.5.9 to 29.5.10.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/jest&package-manager=npm_and_yarn&previous-version=29.5.9&new-version=29.5.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index b7b5e17b5..936c5dfc1 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@octokit/webhooks-types": "^7.3.1", - "@types/jest": "^29.5.9", + "@types/jest": "^29.5.10", "@types/node": "^20.10.0", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", @@ -1532,9 +1532,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.9", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz", - "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -8482,9 +8482,9 @@ } }, "@types/jest": { - "version": "29.5.9", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz", - "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, "requires": { "expect": "^29.0.0", diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 953aabaf7..e2daa2dd2 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -32,7 +32,7 @@ }, "devDependencies": { "@octokit/webhooks-types": "^7.3.1", - "@types/jest": "^29.5.9", + "@types/jest": "^29.5.10", "@types/node": "^20.10.0", "@typescript-eslint/parser": "^6.12.0", "@vercel/ncc": "^0.38.1", From 46c4a9f121dfee10ae3d4d84b90e44dfdd16a4ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 22:35:47 +0000 Subject: [PATCH 37/49] Bump http from 1.1.0 to 1.1.2 in /dashboard (#3291) Bumps [http](https://github.com/dart-lang/http/tree/master/pkgs) from 1.1.0 to 1.1.2.
Commits
  • c125ed5 [http] Allow pkg:web v0.3.0 (#1055)
  • 9fb4cfa Update lints to latest, etc (#1048)
  • 5e84d9f Update platform-specific imports for wasm (#1051)
  • 8c9feb5 [http] Fix type cast for dart2wasm (#1050)
  • a2f0b25 [http] use pkg:web, require Dart 3.2 (#1049)
  • f0a02f9 Require a package:jni version without known buffer overflows (#1044)
  • b2717ba Create a flutter example application that uses multiple client implementation...
  • a2f3c1d Require package:jni >= 0.7.1 to fix macOS build (#1041)
  • f953aec Fix obsolete CronetClient() constructor usage (#1042)
  • 04777ac Add a skeleton "http_profile" package (#1036)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=http&package-manager=pub&previous-version=1.1.0&new-version=1.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- dashboard/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index a593c517a..4cfee65d6 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -29,7 +29,7 @@ dependencies: google_sign_in: 6.1.6 google_sign_in_platform_interface: any # Match google_sign_in google_sign_in_web: any # Match google_sign_in - http: 1.1.0 + http: 1.1.2 protobuf: 3.1.0 provider: 6.1.1 url_launcher: 6.2.1 From 55721ff2f8949ddd5a59b37c0b5c7144a5d66866 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 22:42:33 +0000 Subject: [PATCH 38/49] Bump http from 1.1.1 to 1.1.2 in /app_dart (#3293) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- Bumps [http](https://github.com/dart-lang/http/tree/master/pkgs) from 1.1.1 to 1.1.2.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=http&package-manager=pub&previous-version=1.1.1&new-version=1.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index d6a44ab01..98c626f41 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: gql: 1.0.1-alpha+1696717343881 graphql: 5.2.0-beta.6 grpc: 3.2.4 - http: 1.1.1 + http: 1.1.2 json_annotation: 4.8.1 logging: 1.2.0 meta: 1.11.0 From 6ebab8bbc4efeccafff9abc3e678547f00cd0425 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 22:56:05 +0000 Subject: [PATCH 39/49] Bump @typescript-eslint/parser from 6.12.0 to 6.13.0 in /gh_actions/third_party/no-response (#3294) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.12.0 to 6.13.0.
Release notes

Sourced from @​typescript-eslint/parser's releases.

v6.13.0

6.13.0 (2023-11-27)

Note for eslint plugin authors and other API consumers

TypeScript v5.3 shipped with a type change that was incompatible with our types. This change has been fixed and will be released in v5.3.3. Until that time you can work around this error using skipLibCheck.

Bug Fixes

  • typescript-estree: ensure backwards compat with pre-5.3 import attributes (#7967) (810fc8c)

Features

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/parser's changelog.

6.13.0 (2023-11-27)

Note: Version bump only for package @​typescript-eslint/parser

You can read about our versioning strategy and releases on our website.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=6.12.0&new-version=6.13.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 98 +++++++++---------- .../third_party/no-response/package.json | 2 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 936c5dfc1..5a8f733ff 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -18,7 +18,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.10", "@types/node": "^20.10.0", - "@typescript-eslint/parser": "^6.12.0", + "@typescript-eslint/parser": "^6.13.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", @@ -1640,15 +1640,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", - "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.0.tgz", + "integrity": "sha512-VpG+M7GNhHLI/aTDctqAV0XbzB16vf+qDX9DXuMZSe/0bahzDA9AKZB15NDbd+D9M4cDsJvfkbGOA7qiZ/bWJw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.0", + "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/typescript-estree": "6.13.0", + "@typescript-eslint/visitor-keys": "6.13.0", "debug": "^4.3.4" }, "engines": { @@ -1668,13 +1668,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", - "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.0.tgz", + "integrity": "sha512-2x0K2/CujsokIv+LN2T0l5FVDMtsCjkUyYtlcY4xxnxLAW+x41LXr16duoicHpGtLhmtN7kqvuFJ3zbz00Ikhw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0" + "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/visitor-keys": "6.13.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1685,9 +1685,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", - "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.0.tgz", + "integrity": "sha512-oXg7DFxx/GmTrKXKKLSoR2rwiutOC7jCQ5nDH5p5VS6cmHE1TcPTaYQ0VPSSUvj7BnNqCgQ/NXcTBxn59pfPTQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1698,13 +1698,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", - "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.0.tgz", + "integrity": "sha512-IT4O/YKJDoiy/mPEDsfOfp+473A9GVqXlBKckfrAOuVbTqM8xbc0LuqyFCcgeFWpqu3WjQexolgqN2CuWBYbog==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/visitor-keys": "6.13.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1725,12 +1725,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", - "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.0.tgz", + "integrity": "sha512-UQklteCEMCRoq/1UhKFZsHv5E4dN1wQSzJoxTfABasWk1HgJRdg1xNUve/Kv/Sdymt4x+iEzpESOqRFlQr/9Aw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/types": "6.13.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -8570,42 +8570,42 @@ } }, "@typescript-eslint/parser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", - "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.0.tgz", + "integrity": "sha512-VpG+M7GNhHLI/aTDctqAV0XbzB16vf+qDX9DXuMZSe/0bahzDA9AKZB15NDbd+D9M4cDsJvfkbGOA7qiZ/bWJw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.0", + "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/typescript-estree": "6.13.0", + "@typescript-eslint/visitor-keys": "6.13.0", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", - "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.0.tgz", + "integrity": "sha512-2x0K2/CujsokIv+LN2T0l5FVDMtsCjkUyYtlcY4xxnxLAW+x41LXr16duoicHpGtLhmtN7kqvuFJ3zbz00Ikhw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0" + "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/visitor-keys": "6.13.0" } }, "@typescript-eslint/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", - "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.0.tgz", + "integrity": "sha512-oXg7DFxx/GmTrKXKKLSoR2rwiutOC7jCQ5nDH5p5VS6cmHE1TcPTaYQ0VPSSUvj7BnNqCgQ/NXcTBxn59pfPTQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", - "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.0.tgz", + "integrity": "sha512-IT4O/YKJDoiy/mPEDsfOfp+473A9GVqXlBKckfrAOuVbTqM8xbc0LuqyFCcgeFWpqu3WjQexolgqN2CuWBYbog==", "dev": true, "requires": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/visitor-keys": "6.13.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -8614,12 +8614,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", - "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.0.tgz", + "integrity": "sha512-UQklteCEMCRoq/1UhKFZsHv5E4dN1wQSzJoxTfABasWk1HgJRdg1xNUve/Kv/Sdymt4x+iEzpESOqRFlQr/9Aw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/types": "6.13.0", "eslint-visitor-keys": "^3.4.1" } }, diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index e2daa2dd2..f89b40cad 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -34,7 +34,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.10", "@types/node": "^20.10.0", - "@typescript-eslint/parser": "^6.12.0", + "@typescript-eslint/parser": "^6.13.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", From db5e47b66d4efb7af863d9a060aaee0c552389ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 23:04:05 +0000 Subject: [PATCH 40/49] Bump http from 1.1.0 to 1.1.2 in /auto_submit (#3292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- Bumps [http](https://github.com/dart-lang/http/tree/master/pkgs) from 1.1.0 to 1.1.2.
Commits
  • c125ed5 [http] Allow pkg:web v0.3.0 (#1055)
  • 9fb4cfa Update lints to latest, etc (#1048)
  • 5e84d9f Update platform-specific imports for wasm (#1051)
  • 8c9feb5 [http] Fix type cast for dart2wasm (#1050)
  • a2f0b25 [http] use pkg:web, require Dart 3.2 (#1049)
  • f0a02f9 Require a package:jni version without known buffer overflows (#1044)
  • b2717ba Create a flutter example application that uses multiple client implementation...
  • a2f3c1d Require package:jni >= 0.7.1 to fix macOS build (#1041)
  • f953aec Fix obsolete CronetClient() constructor usage (#1042)
  • 04777ac Add a skeleton "http_profile" package (#1036)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=http&package-manager=pub&previous-version=1.1.0&new-version=1.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- auto_submit/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml index 38159bfb8..3f2ab57d7 100644 --- a/auto_submit/pubspec.yaml +++ b/auto_submit/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: googleapis_auth: 1.4.1 graphql: 5.2.0-beta.6 gql: 1.0.1-alpha+1691943394579 - http: 1.1.0 + http: 1.1.2 json_annotation: 4.8.1 meta: 1.11.0 neat_cache: 2.0.3 From c6526dc988d666232b0ad9374705e896f0c8f656 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:30:58 +0000 Subject: [PATCH 41/49] Bump build_runner from 2.4.6 to 2.4.7 in /cipd_packages/device_doctor (#3295) Bumps [build_runner](https://github.com/dart-lang/build) from 2.4.6 to 2.4.7.
Release notes

Sourced from build_runner's releases.

package:build_runner v2.4.7

  • Fix broken link in README.md.
  • Bump the min sdk to 3.0.0.
  • Add a warning to the doctor command if a build.yml file is found (instead of a build.yaml file).
Commits
  • df76f89 add a warning if a build.yml file is found in the doctor command (#3616)
  • 7f5b103 [web_compilers] Add support for js_interop_unsafe (#3613)
  • 2550caf use base64UrlEncode instead of base64Encode (#3609)
  • 766cf18 use base64 encoded md5 hash of working dir to build the unique workspace dir ...
  • fae6ed1 Fix type in exceptions.dart (#3602)
  • ec7896c Use dart pub add to add build_runner dependency (#3599)
  • 9fe0f98 allow the 3.3.x SDK in build_web_compilers and build_modules (#3593)
  • 2a66be2 Freshen docs for aggregate builders (#3590)
  • 2ba1102 release build_resolvers 2.4.1 (#3587)
  • 5eb5d9b update to the latest dart_flutter_team_lints (#3582)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=build_runner&package-manager=pub&previous-version=2.4.6&new-version=2.4.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- cipd_packages/device_doctor/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cipd_packages/device_doctor/pubspec.yaml b/cipd_packages/device_doctor/pubspec.yaml index 4fc066e6d..cdc143177 100644 --- a/cipd_packages/device_doctor/pubspec.yaml +++ b/cipd_packages/device_doctor/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: yaml: 3.1.2 dev_dependencies: - build_runner: 2.4.6 + build_runner: 2.4.7 fake_async: 1.3.1 mockito: 5.4.3 test: 1.24.9 From e99f4cb658d8556fa8605b8f380159bf1c221e13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:51:32 +0000 Subject: [PATCH 42/49] Bump build_runner from 2.4.6 to 2.4.7 in /auto_submit (#3296) Bumps [build_runner](https://github.com/dart-lang/build) from 2.4.6 to 2.4.7.
Release notes

Sourced from build_runner's releases.

package:build_runner v2.4.7

  • Fix broken link in README.md.
  • Bump the min sdk to 3.0.0.
  • Add a warning to the doctor command if a build.yml file is found (instead of a build.yaml file).
Commits
  • df76f89 add a warning if a build.yml file is found in the doctor command (#3616)
  • 7f5b103 [web_compilers] Add support for js_interop_unsafe (#3613)
  • 2550caf use base64UrlEncode instead of base64Encode (#3609)
  • 766cf18 use base64 encoded md5 hash of working dir to build the unique workspace dir ...
  • fae6ed1 Fix type in exceptions.dart (#3602)
  • ec7896c Use dart pub add to add build_runner dependency (#3599)
  • 9fe0f98 allow the 3.3.x SDK in build_web_compilers and build_modules (#3593)
  • 2a66be2 Freshen docs for aggregate builders (#3590)
  • 2ba1102 release build_resolvers 2.4.1 (#3587)
  • 5eb5d9b update to the latest dart_flutter_team_lints (#3582)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=build_runner&package-manager=pub&previous-version=2.4.6&new-version=2.4.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- auto_submit/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml index 3f2ab57d7..70277c69b 100644 --- a/auto_submit/pubspec.yaml +++ b/auto_submit/pubspec.yaml @@ -31,7 +31,7 @@ dependencies: mutex: 3.1.0 dev_dependencies: - build_runner: 2.4.6 + build_runner: 2.4.7 json_serializable: 6.7.1 flutter_lints: 3.0.1 mockito: 5.4.3 From a850833b1ccd4db1a96bd31fee61413f39e9e47e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:57:39 +0000 Subject: [PATCH 43/49] Bump @typescript-eslint/parser from 6.13.0 to 6.13.1 in /gh_actions/third_party/no-response (#3299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.13.0 to 6.13.1.
Release notes

Sourced from @​typescript-eslint/parser's releases.

v6.13.1

6.13.1 (2023-11-28)

Bug Fixes

  • default to parse all JSDoc and provide options to configure it (#7999) (779e13e)

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/parser's changelog.

6.13.1 (2023-11-28)

Note: Version bump only for package @​typescript-eslint/parser

You can read about our versioning strategy and releases on our website.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=6.13.0&new-version=6.13.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 98 +++++++++---------- .../third_party/no-response/package.json | 2 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index 5a8f733ff..ceb94e572 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -18,7 +18,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.10", "@types/node": "^20.10.0", - "@typescript-eslint/parser": "^6.13.0", + "@typescript-eslint/parser": "^6.13.1", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", @@ -1640,15 +1640,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.0.tgz", - "integrity": "sha512-VpG+M7GNhHLI/aTDctqAV0XbzB16vf+qDX9DXuMZSe/0bahzDA9AKZB15NDbd+D9M4cDsJvfkbGOA7qiZ/bWJw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.13.0", - "@typescript-eslint/types": "6.13.0", - "@typescript-eslint/typescript-estree": "6.13.0", - "@typescript-eslint/visitor-keys": "6.13.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "engines": { @@ -1668,13 +1668,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.0.tgz", - "integrity": "sha512-2x0K2/CujsokIv+LN2T0l5FVDMtsCjkUyYtlcY4xxnxLAW+x41LXr16duoicHpGtLhmtN7kqvuFJ3zbz00Ikhw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.0", - "@typescript-eslint/visitor-keys": "6.13.0" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1685,9 +1685,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.0.tgz", - "integrity": "sha512-oXg7DFxx/GmTrKXKKLSoR2rwiutOC7jCQ5nDH5p5VS6cmHE1TcPTaYQ0VPSSUvj7BnNqCgQ/NXcTBxn59pfPTQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1698,13 +1698,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.0.tgz", - "integrity": "sha512-IT4O/YKJDoiy/mPEDsfOfp+473A9GVqXlBKckfrAOuVbTqM8xbc0LuqyFCcgeFWpqu3WjQexolgqN2CuWBYbog==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.0", - "@typescript-eslint/visitor-keys": "6.13.0", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1725,12 +1725,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.0.tgz", - "integrity": "sha512-UQklteCEMCRoq/1UhKFZsHv5E4dN1wQSzJoxTfABasWk1HgJRdg1xNUve/Kv/Sdymt4x+iEzpESOqRFlQr/9Aw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -8570,42 +8570,42 @@ } }, "@typescript-eslint/parser": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.0.tgz", - "integrity": "sha512-VpG+M7GNhHLI/aTDctqAV0XbzB16vf+qDX9DXuMZSe/0bahzDA9AKZB15NDbd+D9M4cDsJvfkbGOA7qiZ/bWJw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.13.0", - "@typescript-eslint/types": "6.13.0", - "@typescript-eslint/typescript-estree": "6.13.0", - "@typescript-eslint/visitor-keys": "6.13.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.0.tgz", - "integrity": "sha512-2x0K2/CujsokIv+LN2T0l5FVDMtsCjkUyYtlcY4xxnxLAW+x41LXr16duoicHpGtLhmtN7kqvuFJ3zbz00Ikhw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.13.0", - "@typescript-eslint/visitor-keys": "6.13.0" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" } }, "@typescript-eslint/types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.0.tgz", - "integrity": "sha512-oXg7DFxx/GmTrKXKKLSoR2rwiutOC7jCQ5nDH5p5VS6cmHE1TcPTaYQ0VPSSUvj7BnNqCgQ/NXcTBxn59pfPTQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.0.tgz", - "integrity": "sha512-IT4O/YKJDoiy/mPEDsfOfp+473A9GVqXlBKckfrAOuVbTqM8xbc0LuqyFCcgeFWpqu3WjQexolgqN2CuWBYbog==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.13.0", - "@typescript-eslint/visitor-keys": "6.13.0", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -8614,12 +8614,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.0.tgz", - "integrity": "sha512-UQklteCEMCRoq/1UhKFZsHv5E4dN1wQSzJoxTfABasWk1HgJRdg1xNUve/Kv/Sdymt4x+iEzpESOqRFlQr/9Aw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.13.0", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" } }, diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index f89b40cad..5a694c09a 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -34,7 +34,7 @@ "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.10", "@types/node": "^20.10.0", - "@typescript-eslint/parser": "^6.13.0", + "@typescript-eslint/parser": "^6.13.1", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", "eslint-plugin-github": "^4.10.1", From f67027d0be8c288c0e73184728332ef3c071bb24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 23:04:03 +0000 Subject: [PATCH 44/49] Bump build_runner from 2.4.6 to 2.4.7 in /app_dart (#3298) Bumps [build_runner](https://github.com/dart-lang/build) from 2.4.6 to 2.4.7.
Release notes

Sourced from build_runner's releases.

package:build_runner v2.4.7

  • Fix broken link in README.md.
  • Bump the min sdk to 3.0.0.
  • Add a warning to the doctor command if a build.yml file is found (instead of a build.yaml file).
Commits
  • df76f89 add a warning if a build.yml file is found in the doctor command (#3616)
  • 7f5b103 [web_compilers] Add support for js_interop_unsafe (#3613)
  • 2550caf use base64UrlEncode instead of base64Encode (#3609)
  • 766cf18 use base64 encoded md5 hash of working dir to build the unique workspace dir ...
  • fae6ed1 Fix type in exceptions.dart (#3602)
  • ec7896c Use dart pub add to add build_runner dependency (#3599)
  • 9fe0f98 allow the 3.3.x SDK in build_web_compilers and build_modules (#3593)
  • 2a66be2 Freshen docs for aggregate builders (#3590)
  • 2ba1102 release build_resolvers 2.4.1 (#3587)
  • 5eb5d9b update to the latest dart_flutter_team_lints (#3582)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=build_runner&package-manager=pub&previous-version=2.4.6&new-version=2.4.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- app_dart/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index 98c626f41..00cfffac5 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -43,7 +43,7 @@ dependencies: dev_dependencies: analyzer: 6.3.0 - build_runner: 2.4.6 + build_runner: 2.4.7 fake_async: 1.3.1 flutter_lints: 3.0.1 json_serializable: 6.7.1 From bb56094f16eeefd495202272ec0c914c198fa5bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 23:04:05 +0000 Subject: [PATCH 45/49] Bump build_runner from 2.4.6 to 2.4.7 in /dashboard (#3297) Bumps [build_runner](https://github.com/dart-lang/build) from 2.4.6 to 2.4.7.
Release notes

Sourced from build_runner's releases.

package:build_runner v2.4.7

  • Fix broken link in README.md.
  • Bump the min sdk to 3.0.0.
  • Add a warning to the doctor command if a build.yml file is found (instead of a build.yaml file).
Commits
  • df76f89 add a warning if a build.yml file is found in the doctor command (#3616)
  • 7f5b103 [web_compilers] Add support for js_interop_unsafe (#3613)
  • 2550caf use base64UrlEncode instead of base64Encode (#3609)
  • 766cf18 use base64 encoded md5 hash of working dir to build the unique workspace dir ...
  • fae6ed1 Fix type in exceptions.dart (#3602)
  • ec7896c Use dart pub add to add build_runner dependency (#3599)
  • 9fe0f98 allow the 3.3.x SDK in build_web_compilers and build_modules (#3593)
  • 2a66be2 Freshen docs for aggregate builders (#3590)
  • 2ba1102 release build_resolvers 2.4.1 (#3587)
  • 5eb5d9b update to the latest dart_flutter_team_lints (#3582)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=build_runner&package-manager=pub&previous-version=2.4.6&new-version=2.4.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- dashboard/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index 4cfee65d6..93e9b5c6f 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -38,7 +38,7 @@ dependencies: url_launcher_web: 2.2.1 dev_dependencies: - build_runner: 2.4.6 + build_runner: 2.4.7 flutter_lints: 3.0.1 flutter_test: sdk: flutter From 661d605908db27e1919fbbc7354655324ac38e42 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Wed, 29 Nov 2023 07:10:06 -0800 Subject: [PATCH 46/49] [dashboard] Fix overlay box size (#3257) Fixes https://github.com/flutter/flutter/issues/137705 --- dashboard/lib/main.dart | 61 +++++++++++++++------------- dashboard/lib/widgets/task_grid.dart | 12 +++--- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/dashboard/lib/main.dart b/dashboard/lib/main.dart index 05ce466c5..b985897a3 100644 --- a/dashboard/lib/main.dart +++ b/dashboard/lib/main.dart @@ -15,6 +15,7 @@ import 'service/google_authentication.dart'; import 'state/build.dart'; import 'widgets/now.dart'; import 'widgets/state_provider.dart'; +import 'widgets/task_box.dart'; void usage() { // ignore: avoid_print @@ -60,37 +61,39 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Build Dashboard — Cocoon', - shortcuts: { - ...WidgetsApp.defaultShortcuts, - const SingleActivator(LogicalKeyboardKey.select): const ActivateIntent(), - }, - theme: ThemeData( - useMaterial3: false, - primaryTextTheme: const TextTheme( - bodyLarge: TextStyle(color: Colors.black87), + return TaskBox( + child: MaterialApp( + title: 'Flutter Build Dashboard — Cocoon', + shortcuts: { + ...WidgetsApp.defaultShortcuts, + const SingleActivator(LogicalKeyboardKey.select): const ActivateIntent(), + }, + theme: ThemeData( + useMaterial3: false, + primaryTextTheme: const TextTheme( + bodyLarge: TextStyle(color: Colors.black87), + ), ), + darkTheme: ThemeData.dark(), + initialRoute: BuildDashboardPage.routeName, + routes: { + BuildDashboardPage.routeName: (BuildContext context) => const BuildDashboardPage(), + }, + onGenerateRoute: (RouteSettings settings) { + final Uri uriData = Uri.parse(settings.name!); + if (uriData.path == BuildDashboardPage.routeName) { + return MaterialPageRoute( + settings: RouteSettings(name: uriData.toString()), + builder: (BuildContext context) { + return BuildDashboardPage( + queryParameters: uriData.queryParameters, + ); + }, + ); + } + return null; + }, ), - darkTheme: ThemeData.dark(), - initialRoute: BuildDashboardPage.routeName, - routes: { - BuildDashboardPage.routeName: (BuildContext context) => const BuildDashboardPage(), - }, - onGenerateRoute: (RouteSettings settings) { - final Uri uriData = Uri.parse(settings.name!); - if (uriData.path == BuildDashboardPage.routeName) { - return MaterialPageRoute( - settings: RouteSettings(name: uriData.toString()), - builder: (BuildContext context) { - return BuildDashboardPage( - queryParameters: uriData.queryParameters, - ); - }, - ); - } - return null; - }, ); } } diff --git a/dashboard/lib/widgets/task_grid.dart b/dashboard/lib/widgets/task_grid.dart index fe20c07fe..d3b93cdcb 100644 --- a/dashboard/lib/widgets/task_grid.dart +++ b/dashboard/lib/widgets/task_grid.dart @@ -55,13 +55,11 @@ class TaskGridContainer extends StatelessWidget { ); } - return TaskBox( - child: TaskGrid( - buildState: buildState, - commitStatuses: commitStatuses, - filter: filter, - useAnimatedLoading: useAnimatedLoading, - ), + return TaskGrid( + buildState: buildState, + commitStatuses: commitStatuses, + filter: filter, + useAnimatedLoading: useAnimatedLoading, ); }, ); From 4223dc1ae78f8a30283f7d772fea6ff705c7c66e Mon Sep 17 00:00:00 2001 From: Gray Mackall <34871572+gmackall@users.noreply.github.com> Date: Wed, 29 Nov 2023 08:14:07 -0800 Subject: [PATCH 47/49] Change autosubmit comment from 'You' to 'The PR author' (#3300) Example of the current bot comment: >auto label is removed for flutter/flutter/138973, due to This PR has not met approval requirements for merging. You are not a member of flutter-hackers and need 1 more review(s) in order to merge this PR. > >Merge guidelines: You need at least one approved review if you are already part of flutter-hackers or two member reviews if you are not a flutter-hacker before re-applying the autosubmit label. Reviewers: If you left a comment approving, please use the "approve" review action instead. This message is confusing when the person adding the "autosubmit" label is not the author of the PR (which is common in the case that the author is not a regular contributor), because the use of 'you' can be interpreted as 'the person who added the label'. Context https://discord.com/channels/608014603317936148/608021351567065092/1179214124538921100 --- auto_submit/lib/service/config.dart | 4 +-- auto_submit/lib/validations/approval.dart | 8 ++--- .../test/validations/approval_test.dart | 30 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/auto_submit/lib/service/config.dart b/auto_submit/lib/service/config.dart index c1c0d9647..51f783a87 100644 --- a/auto_submit/lib/service/config.dart +++ b/auto_submit/lib/service/config.dart @@ -127,8 +127,8 @@ class Config { /// Pull request approval message static const String pullRequestApprovalRequirementsMessage = - '- Merge guidelines: You need at least one approved review if you are already ' - 'part of flutter-hackers or two member reviews if you are not a flutter-hacker ' + '- Merge guidelines: A PR needs at least one approved review if the author is already ' + 'part of flutter-hackers or two member reviews if the author is not a flutter-hacker ' 'before re-applying the autosubmit label. __Reviewers__: If you left a comment ' 'approving, please use the "approve" review action instead.'; diff --git a/auto_submit/lib/validations/approval.dart b/auto_submit/lib/validations/approval.dart index ee87b0f03..b65c93974 100644 --- a/auto_submit/lib/validations/approval.dart +++ b/auto_submit/lib/validations/approval.dart @@ -57,19 +57,19 @@ class Approval extends Validation { String approvedMessage; final String flutterHackerMessage = (authorIsFlutterHacker) - ? 'You are a member of ${repositoryConfiguration.approvalGroup}' - : 'You are not a member of ${repositoryConfiguration.approvalGroup}'; + ? 'The PR author is a member of ${repositoryConfiguration.approvalGroup}' + : 'The PR author is not a member of ${repositoryConfiguration.approvalGroup}'; // Changes were requested, review count does not matter. if (approver.changeRequestAuthors.isNotEmpty) { approved = false; approvedMessage = 'This PR has not met approval requirements for merging. Changes were requested by ${approver.changeRequestAuthors}, please make the needed changes and resubmit this PR.\n' - '$flutterHackerMessage and need ${approver.remainingReviews} more review(s) in order to merge this PR.\n'; + '$flutterHackerMessage and needs ${approver.remainingReviews} more review(s) in order to merge this PR.\n'; } else { // No changes were requested so check approval count. approvedMessage = approved ? 'This PR has met approval requirements for merging.\n' - : 'This PR has not met approval requirements for merging. $flutterHackerMessage and need ${approver.remainingReviews} more review(s) in order to merge this PR.\n'; + : 'This PR has not met approval requirements for merging. $flutterHackerMessage and needs ${approver.remainingReviews} more review(s) in order to merge this PR.\n'; if (!approved && authorIsFlutterHacker) { // Flutter hackers are aware of the review requirements, and can add // the autosubmit label without waiting on review. diff --git a/auto_submit/test/validations/approval_test.dart b/auto_submit/test/validations/approval_test.dart index 71884fa07..175757c21 100644 --- a/auto_submit/test/validations/approval_test.dart +++ b/auto_submit/test/validations/approval_test.dart @@ -56,7 +56,7 @@ void main() { expect(result.message.contains('This PR has met approval requirements for merging.'), isTrue); }); - test('Author is a NON member and reviewer is a member, need 1 more review', () async { + test('Author is a NON member and reviewer is a member, needs 1 more review', () async { // githubService.isTeamMemberMockList = [true, true]; githubService.isTeamMemberMockMap['author1'] = false; githubService.isTeamMemberMockMap['keyonghan'] = true; @@ -69,10 +69,10 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.REMOVE_LABEL); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 1 more review'), isTrue); + expect(result.message.contains('needs 1 more review'), isTrue); }); - test('Author is a NON member and reviewer is a NON member, need 2 more reviews', () async { + test('Author is a NON member and reviewer is a NON member, needs 2 more reviews', () async { // githubService.isTeamMemberMockList = [true, true]; githubService.isTeamMemberMockMap['author1'] = false; githubService.isTeamMemberMockMap['keyonghan'] = false; @@ -85,10 +85,10 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.REMOVE_LABEL); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 2 more review'), isTrue); + expect(result.message.contains('needs 2 more review'), isTrue); }); - test('Author is a member and reviewer is NON member, need 1 more review', () async { + test('Author is a member and reviewer is NON member, needs 1 more review', () async { // githubService.isTeamMemberMockList = [true, true]; githubService.isTeamMemberMockMap['author1'] = true; githubService.isTeamMemberMockMap['keyonghan'] = false; @@ -101,7 +101,7 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.IGNORE_TEMPORARILY); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 1 more review'), isTrue); + expect(result.message.contains('needs 1 more review'), isTrue); }); test('Author is NON member and reviewers are members, pr approved', () async { @@ -120,7 +120,7 @@ void main() { expect(result.message.contains('This PR has met approval requirements for merging.'), isTrue); }); - test('Author is NON member and one reviewer is a NON member, need 1 more review', () async { + test('Author is NON member and one reviewer is a NON member, needs 1 more review', () async { githubService.isTeamMemberMockMap['author1'] = false; githubService.isTeamMemberMockMap['author2'] = true; githubService.isTeamMemberMockMap['author3'] = false; @@ -134,10 +134,10 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.REMOVE_LABEL); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 1 more review'), isTrue); + expect(result.message.contains('needs 1 more review'), isTrue); }); - test('Author is member and reviewers are NON members, need 1 more review', () async { + test('Author is member and reviewers are NON members, needs 1 more review', () async { githubService.isTeamMemberMockMap['author1'] = true; githubService.isTeamMemberMockMap['author2'] = false; githubService.isTeamMemberMockMap['author3'] = false; @@ -151,10 +151,10 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.IGNORE_TEMPORARILY); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 1 more review'), isTrue); + expect(result.message.contains('needs 1 more review'), isTrue); }); - test('Author is NON member and reviewers are NON members, need 2 reviews', () async { + test('Author is NON member and reviewers are NON members, needs 2 reviews', () async { githubService.isTeamMemberMockMap['author1'] = false; githubService.isTeamMemberMockMap['author2'] = false; githubService.isTeamMemberMockMap['author3'] = false; @@ -168,7 +168,7 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.REMOVE_LABEL); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 2 more review'), isTrue); + expect(result.message.contains('needs 2 more review'), isTrue); }); test('Verify author review count does not go negative', () async { @@ -187,7 +187,7 @@ void main() { expect(result.result, isFalse); expect(result.action, Action.REMOVE_LABEL); expect(result.message.contains('This PR has not met approval requirements for merging.'), isTrue); - expect(result.message.contains('need 2 more review'), isTrue); + expect(result.message.contains('needs 2 more review'), isTrue); }); test('Verify author review count does not go negative', () async { @@ -256,7 +256,7 @@ void main() { expect(result.action, Action.REMOVE_LABEL); expect( result.message.contains( - 'This PR has not met approval requirements for merging. You are not a member of flutter-hackers and need 1 more review(s) in order to merge this PR.', + 'This PR has not met approval requirements for merging. The PR author is not a member of flutter-hackers and needs 1 more review(s) in order to merge this PR.', ), isTrue, ); @@ -288,7 +288,7 @@ void main() { expect(result.action, Action.REMOVE_LABEL); expect( result.message.contains( - 'This PR has not met approval requirements for merging. You are not a member of flutter-hackers', + 'This PR has not met approval requirements for merging. The PR author is not a member of flutter-hackers', ), isTrue, ); From 1c19213931de075c37153bca92184585abc26d71 Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Wed, 29 Nov 2023 13:06:56 -0800 Subject: [PATCH 48/49] Triage Bot 1.0 (#3036) This is the code that's been running for a few weeks now. It's time to get it onto Appengine. --- CODEOWNERS | 3 +- triage_bot/.gitignore | 2 + triage_bot/Dockerfile | 16 + triage_bot/README.md | 142 ++ triage_bot/analysis_options.yaml | 211 +++ triage_bot/app.yaml | 10 + triage_bot/bin/triage_bot.dart | 7 + triage_bot/cloudbuild_triage_bot.yaml | 27 + triage_bot/cloudbuild_triage_bot_deploy.yaml | 39 + triage_bot/lib/bytes.dart | 223 +++ triage_bot/lib/discord.dart | 135 ++ triage_bot/lib/engine.dart | 1510 ++++++++++++++++++ triage_bot/lib/json.dart | 257 +++ triage_bot/lib/utils.dart | 7 + triage_bot/pubspec.yaml | 21 + triage_bot/test/bytes_test.dart | 78 + triage_bot/test/discord_test.dart | 49 + triage_bot/test/json_test.dart | 21 + triage_bot/test/utils_test.dart | 26 + 19 files changed, 2783 insertions(+), 1 deletion(-) create mode 100644 triage_bot/.gitignore create mode 100644 triage_bot/Dockerfile create mode 100644 triage_bot/README.md create mode 100644 triage_bot/analysis_options.yaml create mode 100644 triage_bot/app.yaml create mode 100644 triage_bot/bin/triage_bot.dart create mode 100644 triage_bot/cloudbuild_triage_bot.yaml create mode 100644 triage_bot/cloudbuild_triage_bot_deploy.yaml create mode 100644 triage_bot/lib/bytes.dart create mode 100644 triage_bot/lib/discord.dart create mode 100644 triage_bot/lib/engine.dart create mode 100644 triage_bot/lib/json.dart create mode 100644 triage_bot/lib/utils.dart create mode 100644 triage_bot/pubspec.yaml create mode 100644 triage_bot/test/bytes_test.dart create mode 100644 triage_bot/test/discord_test.dart create mode 100644 triage_bot/test/json_test.dart create mode 100644 triage_bot/test/utils_test.dart diff --git a/CODEOWNERS b/CODEOWNERS index b38f42cac..8bfc94786 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -31,8 +31,9 @@ app_dart/lib/src/request_handlers/update_existing_flaky_issues.dart @key app_dart/lib/src/request_handlers/update_task_status.dart @keyonghan app_dart/lib/src/request_handlers/vacuum_github_commits.dart @keyonghan -## auto_submit app +## apps auto_submit @ricardoamador +triage_bot @Hixie ## cipd packages cipd_packages/codesign/** @XilaiZhang diff --git a/triage_bot/.gitignore b/triage_bot/.gitignore new file mode 100644 index 000000000..9336dae66 --- /dev/null +++ b/triage_bot/.gitignore @@ -0,0 +1,2 @@ +.dart_tool/ +secrets/ \ No newline at end of file diff --git a/triage_bot/Dockerfile b/triage_bot/Dockerfile new file mode 100644 index 000000000..4618011ee --- /dev/null +++ b/triage_bot/Dockerfile @@ -0,0 +1,16 @@ +# Copyright 2022 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. + +# Dart Docker official images can be found here: https://hub.docker.com/_/dart +FROM dart:beta@sha256:d19a5c7453c9ff7f977dfc6956a1a61042386c5572a4dcc249c5b3705b10d41f + +WORKDIR /app + +# Copy app source code (except anything in .dockerignore). +COPY . . +RUN dart pub get + +# Start server. +EXPOSE 8213 +CMD ["/usr/lib/dart/bin/dart", "/app/bin/triage_bot.dart"] diff --git a/triage_bot/README.md b/triage_bot/README.md new file mode 100644 index 000000000..4d536eba5 --- /dev/null +++ b/triage_bot/README.md @@ -0,0 +1,142 @@ +# Triage Automation Bot + +This bot implements the automations originally proposed in +[https://docs.google.com/document/d/1RBvsolWL9nUkcEFhPZV4b-tstVUDHfHKzs-uQ3HiX-w/edit#heading=h.34a91yqebirw](Flutter +project proposed new triage processes for 2023). + +## Implemented automations + +The core logic is in `lib/engine.dart`. + +There are four components: + +- the GitHub webhook +- background updates +- the cleanup process +- the tidy process + +In addition, there is an internal model that tracks the state of the +project. Most notably, it tracks various attributes of the project's +open issues. This is stored in memory as a Hash table and takes about +200MB of RAM for about 10,000 issues. It is written to disk +periodically, taking about 2MB of disk. This is used on startup to +warm the cache, so that brief interruptions in service do not require +the multiple days of probing GitHub APIs to fetch all the data. + +You can see the current state of this data model by fetching the +`/debug` HTTP endpoint from a browser. + +## The GitHub webhook + +The triage bot listens to notifications from GitHub. When it receives +them, it first updates the issue model accordingly, then (if +appropriate) sends a message Discord. + +The following updates are among those that update the model: + + - new issues, closing issues, reopening issues + - issue comments + - changes to the assignee + - changes to labels + - updates to who is a team member + - changes to an issue's lock state + +Most of these updates are just a matter of tracking whether the issue +is still open, and whether the update came from a team member, so that +we can track how long it's been since an issue was updated. + +The following updates are among those repeated on Discord: + + - when someone stars a repo + - when someone creates a new label + - when issues are opened, closed, or reopened + - when PRs are filed or closed + - when comments are left on issues and PRs + - when issues are locked or unlocked + - when the wiki is updated + +The channels used vary based on the message. Most of them go to +`#github2`, some go to `#hidden-chat`. + +## Background updates + +Every few seconds (`backgroundUpdatePeriod`), the bot attempts to +fetch an issue from GitHub. If the issue is open (and not a pull +request), the model is updated with the information obtained from +GitHub. + +## The cleanup process + +Issues that have recently been examined (either for the webhook or the +background updates) are added to a cleanup queue. + +Roughly every minute (`cleanupUpdatePeriod`), all the issues in the +queue that were last touched more than 45 minutes ago +(`cleanupUpdateDelay`) are checked to see if they need cleaning up. +Cleaning up in this context means making automated changes to the +issue that enforce invariants. Specifically: + + - If an issue has multiple priorities, all but the highest one are + removed. + - Issues with multiple `team-*` labels lose all of them (sending the + issue back to front-line triage). + - `fyi-*` labels are removed if they're redundant with a `team-*` + label or acknowledged by a `triaged-*` label. + - `triaged-*` labels that don't have a corresponding `team-*` label + are removed as redundant. + - Issues that have a `triaged-*` label but no priority have their + `triaged-*` label removed. This only happens once every two days or + so (`refeedDelay`) per team; if more than one issue has this + condition at a time, the other issues are left alone until the next + time the issue is examined by the background update process. + - The thumbs-up label is removed if the issue has been marked as + triaged. + - The "stale issue" label (the hourglass) is removed if the issue has + received an update from a team member since it was added. + - Recently re-opened issues are unlocked if necessary. + +## The tidy process + +Every few hours (`longTermTidyingPeriod`), all the known open issues +that are _not_ pending a cleanup update are examined, and have +invariants applied, as follows: + + - If the issue is "stale" (`timeUntilStale`), i.e. is assigned or + marked P1 and hasn't received an update from a team member in some + time, it is pinged and labeled with the "stale issue" label (the + hourglass). + - If the issue doesn't receive an update even after getting pinged + (`timeUntilReallyStale`), the assignee is removed and the issue is + sent back to the team's triage meeting. This process is subject to + the same per-team rate-limiting (`refeedDelay`) as the removal of + priority labels discussed in the cleanup process section. + - Issues that have been locked for a while (`timeUntilUnlock`) are + automatically unlocked. + - Issues that have gained a lot of thumbs-up recently are flagged for + additional triage. + +## The self-test issue + +Every now and then (`selfTestPeriod`), an issue is filed to test the +triage process itself. After some additional time (`selfTestWindow`), +if the issue is open, it is assigned to the critical triage meeting +for further follow-up. + +## Secrets + +The following files need to exist in the `secrets` subdirectory to run +this locally: + +* `discord.appid`: The Discord app ID. +* `discord.token`: The Discord authentication token. +* `github.app.id`: The GitHub app ID. +* `github.app.key.pem`: The GitHub application private key. +* `github.installation.id`: The GitHub application installation ID. +* `github.webhook.secret`: The GitHub webhook secret password. +* `server.cert.pem`: The TLS certificate. +* `server.intermediates.pem`: The TLS intermediate certificates, if + any, or else an empty file. +* `server.key.pem`: The TLS private key. + +Alternatively, these files can be provided as secrets in Google +Cloud's secrets manager. diff --git a/triage_bot/analysis_options.yaml b/triage_bot/analysis_options.yaml new file mode 100644 index 000000000..33f9ba46a --- /dev/null +++ b/triage_bot/analysis_options.yaml @@ -0,0 +1,211 @@ +linter: + rules: + - always_declare_return_types + - always_put_control_body_on_new_line + # - always_put_required_named_parameters_first + - always_specify_types + # - always_use_package_imports + - annotate_overrides + # - avoid_annotating_with_dynamic + - avoid_bool_literals_in_conditional_expressions + # - avoid_catches_without_on_clauses + - avoid_catching_errors + # - avoid_classes_with_only_static_members + - avoid_double_and_int_checks + # - avoid_dynamic_calls # we use this for Json + - avoid_empty_else + - avoid_equals_and_hash_code_on_mutable_classes + # - avoid_escaping_inner_quotes + - avoid_field_initializers_in_const_classes + # - avoid_final_parameters + - avoid_function_literals_in_foreach_calls + - avoid_implementing_value_types + - avoid_init_to_null + # - avoid_js_rounded_ints + # - avoid_multiple_declarations_per_line + - avoid_null_checks_in_equality_operators + - avoid_positional_boolean_parameters + # - avoid_print + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_relative_lib_imports + - avoid_renaming_method_parameters + - avoid_return_types_on_setters + - avoid_returning_null_for_void + - avoid_returning_this + - avoid_setters_without_getters + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + # - avoid_slow_async_io + - avoid_type_to_string + # - avoid_types_as_parameter_names + # - avoid_types_on_closure_parameters + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - avoid_void_async + - avoid_web_libraries_in_flutter + - await_only_futures + - camel_case_extensions + - camel_case_types + - cancel_subscriptions + # - cascade_invocations + - cast_nullable_to_non_nullable + - close_sinks + - collection_methods_unrelated_type + - combinators_ordering + - comment_references + - conditional_uri_does_not_exist + - constant_identifier_names + - control_flow_in_finally + - curly_braces_in_flow_control_structures + - dangling_library_doc_comments + - depend_on_referenced_packages + - deprecated_consistency + # - diagnostic_describe_all_properties + - directives_ordering + - discarded_futures + - do_not_use_environment + - empty_catches + - empty_constructor_bodies + - empty_statements + - eol_at_end_of_file + - exhaustive_cases + - file_names + - flutter_style_todos + - hash_and_equals + - implementation_imports + - implicit_call_tearoffs + - invalid_case_patterns + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_annotations + - library_names + - library_prefixes + - library_private_types_in_public_api + # - lines_longer_than_80_chars + - literal_only_boolean_expressions + - missing_whitespace_between_adjacent_strings + - no_adjacent_strings_in_list + - no_default_cases + - no_duplicate_case_values + - no_leading_underscores_for_library_prefixes + - no_leading_underscores_for_local_identifiers + - no_logic_in_create_state + - no_runtimeType_toString + - non_constant_identifier_names + - noop_primitive_operations + - null_check_on_nullable_type_parameter + - null_closures + # - omit_local_variable_types + - one_member_abstracts + - only_throw_errors + - overridden_fields + - package_api_docs + - package_names + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + # - prefer_asserts_with_message + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + # - prefer_double_quotes + # - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + # - prefer_final_parameters + - prefer_for_elements_to_map_fromIterable + - prefer_foreach + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + # - prefer_int_literals + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_iterable_whereType + - prefer_mixin + - prefer_null_aware_method_calls + - prefer_null_aware_operators + - prefer_relative_imports + - prefer_single_quotes + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - prefer_void_to_null + - provide_deprecation_message + # - public_member_api_docs + - recursive_getters + # - require_trailing_commas + - secure_pubspec_urls + - sized_box_for_whitespace + - sized_box_shrink_expand + - slash_for_doc_comments + - sort_child_properties_last + - sort_constructors_first + - sort_pub_dependencies + - sort_unnamed_constructors_first + - test_types_in_equals + - throw_in_finally + - tighten_type_of_initializing_formals + - type_annotate_public_apis + - type_init_formals + - unawaited_futures + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_breaks + - unnecessary_const + - unnecessary_constructor_name + # - unnecessary_final + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_late + - unnecessary_library_directive + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_aware_operator_on_extension_on_nullable + - unnecessary_null_checks + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_overrides + - unnecessary_parenthesis + # - unnecessary_raw_strings + - unnecessary_statements + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - unnecessary_to_list_in_spreads + - unreachable_from_main + - unrelated_type_equality_checks + - unsafe_html + - use_build_context_synchronously + - use_colored_box + - use_decorated_box + - use_enums + - use_full_hex_values_for_flutter_colors + - use_function_type_syntax_for_parameters + - use_if_null_to_convert_nulls_to_bools + - use_is_even_rather_than_modulo + - use_key_in_widget_constructors + - use_late_for_private_fields_and_variables + - use_named_constants + - use_raw_strings + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_string_buffers + - use_string_in_part_of_directives + - use_super_parameters + - use_test_throws_matchers + - use_to_and_as_if_applicable + - valid_regexps + - void_checks diff --git a/triage_bot/app.yaml b/triage_bot/app.yaml new file mode 100644 index 000000000..88f17ccdd --- /dev/null +++ b/triage_bot/app.yaml @@ -0,0 +1,10 @@ +# 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. + +runtime: custom +env: flex +service: triage_bot + +resources: + memory_gb: 2.0 diff --git a/triage_bot/bin/triage_bot.dart b/triage_bot/bin/triage_bot.dart new file mode 100644 index 000000000..1cfd3671a --- /dev/null +++ b/triage_bot/bin/triage_bot.dart @@ -0,0 +1,7 @@ +// 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:triage_bot/engine.dart'; + +void main() async => startEngine(null); diff --git a/triage_bot/cloudbuild_triage_bot.yaml b/triage_bot/cloudbuild_triage_bot.yaml new file mode 100644 index 000000000..940fb3fe3 --- /dev/null +++ b/triage_bot/cloudbuild_triage_bot.yaml @@ -0,0 +1,27 @@ +# 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. + +steps: + # Build docker image + - name: 'us-docker.pkg.dev/cloud-builders/ga/v1/docker' + args: ['build', '-t', 'us-docker.pkg.dev/$PROJECT_ID/appengine/triage_bot.version-$SHORT_SHA', 'triage_bot'] + + # Trigger the cloud build that deploys the docker image + - name: gcr.io/cloud-builders/gcloud + entrypoint: '/bin/bash' + args: + - '-c' + - |- + gcloud builds submit \ + --config triage_bot/cloudbuild_triage_bot_deploy.yaml \ + --substitutions="SHORT_SHA=$SHORT_SHA" \ + --async + +timeout: 1200s + +images: ['us-docker.pkg.dev/$PROJECT_ID/appengine/triage_bot.version-$SHORT_SHA'] + +# If build provenance is not generated, the docker deployment will fail. +options: + requestedVerifyOption: VERIFIED diff --git a/triage_bot/cloudbuild_triage_bot_deploy.yaml b/triage_bot/cloudbuild_triage_bot_deploy.yaml new file mode 100644 index 000000000..0eb2aa35b --- /dev/null +++ b/triage_bot/cloudbuild_triage_bot_deploy.yaml @@ -0,0 +1,39 @@ +# 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. + +steps: + # Get recently pushed docker image and associated provenance, along with the + # correct docker digest url, including the hash. + - name: gcr.io/cloud-builders/gcloud + entrypoint: '/bin/bash' + args: + - '-c' + - |- + cloud_build/get_docker_image_provenance.sh \ + us-docker.pkg.dev/$PROJECT_ID/appengine/triage_bot.version-$SHORT_SHA:latest \ + unverified_provenance.json + + # Verify provenance is valid before proceeding with deployment. + - name: 'golang:1.20' + entrypoint: '/bin/bash' + args: + - '-c' + - |- + cloud_build/verify_provenance.sh unverified_provenance.json + + # Deploy a new version to google cloud. + - name: gcr.io/cloud-builders/gcloud + entrypoint: '/bin/bash' + args: + - '-c' + - |- + gcloud config set project $PROJECT_ID + latest_version=$(gcloud app versions list --hide-no-traffic --format 'value(version.id)') + if [ "$latest_version" = "version-$SHORT_SHA" ]; then + echo "No updates since last deployment." + else + bash cloud_build/deploy_triage_bot.sh $PROJECT_ID $SHORT_SHA + fi + +timeout: 1200s diff --git a/triage_bot/lib/bytes.dart b/triage_bot/lib/bytes.dart new file mode 100644 index 000000000..74def6a5f --- /dev/null +++ b/triage_bot/lib/bytes.dart @@ -0,0 +1,223 @@ +// 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 'dart:io'; +import 'dart:typed_data'; + +typedef Reader = T Function(); +typedef CustomReader = T Function(FileReader reader); +typedef Writer = void Function(T value); +typedef CustomWriter = void Function(FileWriter reader, T value); + +const int _typeNullable = 0x01; +const int _typeBool = 0x02; +const int _typeInt = 0x03; +const int _typeString = 0x04; +const int _typeDateTime = 0x05; +const int _typeSet = 0x10; +const int _typeMap = 0x11; +const int _typeCustom = 0xFE; +const int _typeEnd = 0xFF; + +class FileReader { + FileReader(this._buffer) : _endianness = Endian.host; + + final ByteData _buffer; + final Endian _endianness; + int _position = 0; + + static Future open(File file) async { + final Uint8List bytes = await file.readAsBytes(); + return FileReader(bytes.buffer.asByteData(bytes.offsetInBytes, bytes.length)); + } + + void _readType(int expected) { + final int type = _buffer.getUint8(_position); + _position += 1; + if (expected != type) { + throw FormatException('expected $expected but got $type at byte ${_position - 1}'); + } + } + + T? readNullOr(Reader reader) { + _readType(_typeNullable); + final int result = _buffer.getUint8(_position); + _position += 1; + if (result == 0) { + return null; + } + return reader(); + } + + bool readBool() { + _readType(_typeBool); + final int result = _buffer.getUint8(_position); + _position += 1; + return result != 0x00; + } + + int readInt() { + _readType(_typeInt); + final int result = _buffer.getInt64(_position, _endianness); + _position += 8; + return result; + } + + String readString() { + _readType(_typeString); + final int length = readInt(); + final String result = utf8.decode(_buffer.buffer.asUint8List(_buffer.offsetInBytes + _position, length)); + _position += length; + return result; + } + + DateTime readDateTime() { + _readType(_typeDateTime); + return DateTime.fromMicrosecondsSinceEpoch(readInt(), isUtc: true); + } + + Reader> readerForSet(Reader reader) { + return () { + _readType(_typeSet); + final int count = readInt(); + final Set result = {}; + for (int index = 0; index < count; index += 1) { + result.add(reader()); + } + return result; + }; + } + + Set readSet(Reader reader) { + return readerForSet(reader)(); + } + + Reader> readerForMap(Reader keyReader, Reader valueReader) { + return () { + _readType(_typeMap); + final int count = readInt(); + final Map result = {}; + for (int index = 0; index < count; index += 1) { + result[keyReader()] = valueReader(); + } + return result; + }; + } + + Map readMap(Reader keyReader, Reader valueReader) { + return readerForMap(keyReader, valueReader)(); + } + + Reader readerForCustom(CustomReader reader) { + return () { + _readType(_typeCustom); + return reader(this); + }; + } + + void close() { + _readType(_typeEnd); + if (_position != _buffer.lengthInBytes) { + throw StateError('read failed; position=$_position, expected ${_buffer.lengthInBytes}'); + } + } +} + +class FileWriter { + FileWriter() : _endianness = Endian.host; + + final BytesBuilder _buffer = BytesBuilder(); + final Endian _endianness; + + void _writeType(int type) { + _buffer.addByte(type); + } + + void writeNullOr(T? value, Writer writer) { + _writeType(_typeNullable); + if (value == null) { + _buffer.addByte(0x00); + } else { + _buffer.addByte(0xFF); + writer(value); + } + } + + void writeBool(bool value) { // ignore: avoid_positional_boolean_parameters + _writeType(_typeBool); + _buffer.addByte(value ? 0x01 : 0x00); + } + + final ByteData _intBuffer = ByteData(8); + late final Uint8List _intBytes = _intBuffer.buffer.asUint8List(); + + void writeInt(int value) { + _writeType(_typeInt); + _intBuffer.setInt64(0, value, _endianness); + _buffer.add(_intBytes); + } + + void writeString(String value) { + _writeType(_typeString); + final List stringBuffer = utf8.encode(value); + writeInt(stringBuffer.length); + _buffer.add(stringBuffer); + } + + void writeDateTime(DateTime value) { + _writeType(_typeDateTime); + writeInt(value.microsecondsSinceEpoch); + } + + Writer> writerForSet(Writer writer) { + return (Set value) { + _writeType(_typeSet); + writeInt(value.length); + value.forEach(writer); + }; + } + + void writeSet(Writer writer, Set value) { + writerForSet(writer)(value); + } + + Writer> writerForMap(Writer keyWriter, Writer valueWriter) { + return (Map value) { + _writeType(_typeMap); + writeInt(value.length); + value.forEach((K key, V value) { + keyWriter(key); + valueWriter(value); + }); + }; + } + + void writeMap(Writer keyWriter, Writer valueWriter, Map value) { + writerForMap(keyWriter, valueWriter)(value); + } + + Writer writerForCustom(CustomWriter writer) { + return (T value) { + _writeType(_typeCustom); + writer(this, value); + }; + } + + Future write(File file) async { + _writeType(_typeEnd); + final File temp = File('${file.path}.\$\$\$'); + await temp.writeAsBytes(_buffer.takeBytes()); + if (file.existsSync()) { + await file.delete(); + } + await temp.rename(file.path); + } + + ByteData serialize() { + _writeType(_typeEnd); + final int length = _buffer.length; + return _buffer.takeBytes().buffer.asByteData(0, length); + } +} diff --git a/triage_bot/lib/discord.dart b/triage_bot/lib/discord.dart new file mode 100644 index 000000000..3c780f753 --- /dev/null +++ b/triage_bot/lib/discord.dart @@ -0,0 +1,135 @@ +// 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:nyxx/nyxx.dart'; + +sealed class DiscordChannels { + static const Snowflake botTest = Snowflake.value(945411053179764736); + static const Snowflake hiddenChat = Snowflake.value(610574672865656952); + static const Snowflake github2 = Snowflake.value(1116095786657267722); // this value is >2^53 and thus cannot be used in JS mode +} + +List get boilerplates => [ + '\r', + r'### Is there an existing issue for this?', + RegExp(r'- \[[ xX]] I have searched the \[existing issues]\(https://github\.com/flutter/flutter/issues\)'), + RegExp(r'- \[[ xX]] I have read the \[guide to filing a bug]\(https://flutter\.dev/docs/resources/bug-reports\)'), + r'*Replace this paragraph with a description of what this PR is changing or adding, and why. Consider including before/after screenshots.*', + r'*List which issues are fixed by this PR. You must list at least one issue.*', + r'*If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*', + r'## Pre-launch Checklist', + RegExp(r'- \[[ xX]] I read the \[Contributor Guide] and followed the process outlined there for submitting PRs\.'), + RegExp(r'- \[[ xX]] I read the \[Tree Hygiene] wiki page, which explains my responsibilities\.'), + RegExp(r'- \[[ xX]] I read and followed the \[Flutter Style Guide], including \[Features we expect every widget to implement]\.'), + RegExp(r'- \[[ xX]] I read the \[Flutter Style Guide] _recently_, and have followed its advice\.'), + RegExp(r'- \[[ xX]] I read and followed the \[Flutter Style Guide] and the \[C\+\+, Objective-C, Java style guides]\.'), + RegExp(r'- \[[ xX]] I read and followed the \[relevant style guides] and ran the auto-formatter\. \(Unlike the flutter/flutter repo, the flutter/packages repo does use `dart format`\.\)'), + RegExp(r'- \[[ xX]] I signed the \[CLA]\.'), + RegExp(r'- \[[ xX]] I listed at least one issue that this PR fixes in the description above\.'), + RegExp(r'- \[[ xX]] I updated/added relevant documentation \(doc comments with `///`\)\.'), + RegExp(r'- \[[ xX]] I added new tests to check the change I am making, or this PR is \[test-exempt]\.'), + RegExp(r'- \[[ xX]] I added new tests to check the change I am making or feature I am adding, or Hixie said the PR is test-exempt\. See \[testing the engine] for instructions on writing and running engine tests\.'), + RegExp(r'- \[[ xX]] All existing and new tests are passing\.'), + RegExp(r'- \[[ xX]] The title of the PR starts with the name of the package surrounded by square brackets, e\.g\. `\[shared_preferences]`'), + RegExp(r'- \[[ xX]] I updated `pubspec.yaml` with an appropriate new version according to the \[pub versioning philosophy], or this PR is \[exempt from version changes]\.'), + RegExp(r'- \[[ xX]] I updated `CHANGELOG.md` to add a description of the change, \[following repository CHANGELOG style]\.'), + r'If you need help, consider asking for advice on the #hackers-new channel on [Discord].', + r'', + r'[Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview', + r'[Contributor Guide]: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md', + r'[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene', + r'[test-exempt]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests', + r'[Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo', + r'[Features we expect every widget to implement]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement', + r'[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style', + r'[relevant style guides]: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md#style', + r'[testing the engine]: https://github.com/flutter/flutter/wiki/Testing-the-engine', + r'[CLA]: https://cla.developers.google.com/', + r'[flutter/tests]: https://github.com/flutter/tests', + r'[breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes', + r'[Discord]: https://github.com/flutter/flutter/wiki/Chat', + r'[pub versioning philosophy]: https://dart.dev/tools/pub/versioning', + r'[exempt from version changes]: https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#version-and-changelog-updates', + '### Screenshots or Video\n\n
\nScreenshots / Video demonstration\n\n[Upload media here]\n\n
', + '### Logs\n\n
Logs\n\n```console\n[Paste your logs here]\n```\n\n
', + '### Code sample\n\n
Code sample\n\n```dart\n[Paste your code here]\n```\n\n
', + '', + r'
', + r'', + r'
', + r'', +]; + +String stripBoilerplate(String message, { bool inline = false }) { + String current = message; + for (final Pattern candidate in boilerplates) { + current = current.replaceAll(candidate, ''); + } + current = current + .replaceAll(RegExp(r'\n( *\n)+'), '\n\n') + .trim(); + if (current.isEmpty) { + return ''; + } + if (current.contains('\n') && inline) { + return '\n$current'; + } + return current; +} + +const int _maxLength = 2000; +const String _truncationMarker = '\n**[...truncated]**'; +const String _padding = '\n╰╴ '; +final RegExp _imagePattern = RegExp(r'!\[[^\]]*]\(([^)]+)\)$'); + +Future sendDiscordMessage({ + required INyxx discord, + required String body, + String suffix = '', + required Snowflake channel, + IEmoji? emoji, + String? embedTitle, + String? embedDescription, + String? embedColor, + required void Function(String) log, +}) async { + assert(_maxLength > _truncationMarker.length + _padding.length + suffix.length); + assert((embedTitle == null) == (embedDescription == null) && (embedDescription == null) == (embedColor == null)); + final String content; + final List embeds = []; + body = body.replaceAllMapped(_imagePattern, (Match match) { // this replaces a trailing markdown image with actually showing that image in discord + embeds.add(match.group(1)!); + return ''; + }); + if (body.length + _padding.length + suffix.length > _maxLength) { + content = body.substring(0, _maxLength - _truncationMarker.length - _padding.length - suffix.length) + _truncationMarker + _padding + suffix; + } else if (suffix.isNotEmpty) { + content = body + _padding + suffix; + } else { + content = body; + } + final MessageBuilder messageBuilder = MessageBuilder( + content: content, + embeds: [ + for (final String url in embeds) + EmbedBuilder( + imageUrl: url, + ), + if (embedDescription != null) + EmbedBuilder( + title: embedTitle, + description: embedDescription, + color: DiscordColor.fromHexString(embedColor!), + ), + ], + )..flags = (MessageFlagBuilder()..suppressEmbeds = embeds.isEmpty && embedDescription == null); + try { + final IMessage message = await discord.httpEndpoints.sendMessage(channel, messageBuilder); + if (emoji != null) { + await message.createReaction(emoji); + } + } catch (e) { + log('Discord error: $e (${e.runtimeType})'); + } +} diff --git a/triage_bot/lib/engine.dart b/triage_bot/lib/engine.dart new file mode 100644 index 000000000..2d5d030a5 --- /dev/null +++ b/triage_bot/lib/engine.dart @@ -0,0 +1,1510 @@ +// 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 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:appengine/appengine.dart' show authClientService, runAppEngine, withAppEngineServices; +import 'package:crypto/crypto.dart'; +import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart'; +import 'package:github/github.dart'; +import 'package:googleapis/secretmanager/v1.dart'; +import 'package:http/http.dart' as http show Client; +import 'package:nyxx/nyxx.dart'; + +import 'bytes.dart'; +import 'discord.dart'; +import 'json.dart'; +import 'utils.dart'; + +const int port = 8213; // used only when not using appengine +const int maxLogLength = 1024; + +sealed class GitHubSettings { + static const String organization = 'flutter'; + static const String teamName = 'flutter-hackers'; + static final RepositorySlug primaryRepository = RepositorySlug(organization, 'flutter'); + static const String teamPrefix = 'team-'; + static const String triagedPrefix = 'triaged-'; + static const String fyiPrefix = 'fyi-'; + static const String designDoc = 'design doc'; + static const String permanentlyLocked = 'permanently locked'; + static const String thumbsUpLabel = ':+1:'; + static const String staleIssueLabel = ':hourglass_flowing_sand:'; + static const Set priorities = { 'P0', 'P1', 'P2', 'P3' }; + static const String staleP1Message = 'This issue is marked P1 but has had no recent status updates.\n' + '\n' + 'The P1 label indicates high-priority issues that are at the top of the work list. ' + 'This is the highest priority level a bug can have ' + 'if it isn\'t affecting a top-tier customer or breaking the build. ' + 'Bugs marked P1 are generally actively being worked on ' + 'unless the assignee is dealing with a P0 bug (or another P1 bug). ' + 'Issues at this level should be resolved in a matter of months and should have monthly updates on GitHub.\n' + '\n' + 'Please consider where this bug really falls in our current priorities, and label it or assign it accordingly. ' + 'This allows people to have a clearer picture of what work is actually planned. Thanks!'; + static const String willNeedAdditionalTriage = 'will need additional triage'; + static const Set teams = { + // these are the teams that the self-test issue is assigned to + 'android', + 'codelabs', + 'design', + 'desktop', + 'ecosystem', + 'engine', + 'framework', + 'games', + 'google-testing', + 'go_router', + 'infra', + 'ios', + 'news', + 'release', + 'tool', + 'web', + }; + static const int thumbsMinimum = 100; // an issue needs at least this many thumbs up to trigger retriage + static const double thumbsThreshold = 2.0; // and the count must have increased by this factor since last triage + static const Set knownBots = { // we don't report events from bots to Discord + 'auto-submit[bot]', + 'DartDevtoolWorkflowBot', + 'dependabot[bot]', + 'engine-flutter-autoroll', + 'flutter-dashboard[bot]', + 'flutter-triage-bot[bot]', // that's us! + 'fluttergithubbot', + 'github-actions[bot]', + 'google-cla[bot]', + 'google-ospo-administrator[bot]', + 'skia-flutter-autoroll', + }; + + static bool isRelevantLabel(String label, { bool ignorePriorities = false }) { + return label.startsWith(GitHubSettings.teamPrefix) + || label.startsWith(GitHubSettings.triagedPrefix) + || label.startsWith(GitHubSettings.fyiPrefix) + || label == GitHubSettings.designDoc + || label == GitHubSettings.permanentlyLocked + || label == GitHubSettings.thumbsUpLabel + || label == GitHubSettings.staleIssueLabel + || (!ignorePriorities && GitHubSettings.priorities.contains(label)); + } +} + +sealed class Timings { + static const Duration backgroundUpdatePeriod = Duration(seconds: 1); // how long to wait between issues when scanning in the background + static const Duration cleanupUpdateDelay = Duration(minutes: 45); // how long to wait for an issue to be idle before cleaning it up + static const Duration cleanupUpdatePeriod = Duration(seconds: 60); // time between attempting to clean up the pending cleanup issues + static const Duration longTermTidyingPeriod = Duration(hours: 5); // time between attempting to run long-term tidying of all issues + static const Duration credentialsUpdatePeriod = Duration(minutes: 45); // how often to update GitHub credentials + static const Duration timeUntilStale = Duration(days: 20 * 7); // how long since the last team interaction before considering an issue stale + static const Duration timeUntilReallyStale = Duration(days: 30 * 7); // how long since the last team interaction before unassigning an issue + static const Duration timeUntilUnlock = Duration(days: 28); // how long to leave open issues locked + static const Duration selfTestPeriod = Duration(days: 4 * 7); // how often to file an issue to test the triage process + static const Duration selfTestWindow = Duration(days: 14); // how long to leave the self-test issue open before assigning it to critical triage + static const Duration refeedDelay = Duration(hours: 48); // how long between times we mark an issue as needing retriage (~3 a week) +} + +final class Secrets { + Future> get serverCertificate => _getSecret('server.cert.pem'); + Future get serverCertificateModificationDate => _getSecretModificationDate('server.cert.pem'); + Future> get serverIntermediateCertificates => _getSecret('server.intermediates.pem'); + Future get serverIntermediateCertificatesModificationDate => _getSecretModificationDate('server.intermediates.pem'); + Future> get serverKey => _getSecret('server.key.pem'); + Future get serverKeyModificationDate => _getSecretModificationDate('server.key.pem'); + Future get discordToken async => utf8.decode(await _getSecret('discord.token')); + Future get discordAppId async => int.parse(utf8.decode(await _getSecret('discord.appid'))); + Future> get githubWebhookSecret => _getSecret('github.webhook.secret'); + Future get githubAppKey async => utf8.decode(await _getSecret('github.app.key.pem')); + Future get githubAppId async => utf8.decode(await _getSecret('github.app.id')); + Future get githubInstallationId async => utf8.decode(await _getSecret('github.installation.id')); + final File store = File('store.db'); + + static const String _projectId = 'xxxxx?????xxxxx'; // TODO(ianh): we should update this appropriately + + static File asFile(String name) => File('secrets/$name'); + + static String asKey(String name) => 'projects/$_projectId/secrets/$name/versions/latest'; + + static Future> _getSecret(String name) async { + final File file = asFile(name); + if (await file.exists()) { + return file.readAsBytes(); + } + // authClientService is https://pub.dev/documentation/gcloud/latest/http/authClientService.html + final SecretManagerApi secretManager = SecretManagerApi(authClientService); + final String key = asKey(name); + final AccessSecretVersionResponse response = await secretManager.projects.secrets.versions.access(key); + return response.payload!.dataAsBytes; + } + + static Future _getSecretModificationDate(String name) async { + final File file = asFile(name); + if (await file.exists()) { + return file.lastModified(); + } + // authClientService is https://pub.dev/documentation/gcloud/latest/http/authClientService.html + final SecretManagerApi secretManager = SecretManagerApi(authClientService); + final String key = asKey(name); + final SecretVersion response = await secretManager.projects.secrets.versions.get(key); + return DateTime.parse(response.createTime!); + } +} + +class IssueStats { + IssueStats({ + this.lastContributorTouch, + this.lastAssigneeTouch, + Set? labels, + this.openedAt, + this.lockedAt, + this.assignedAt, + this.assignedToTeamMemberReporter = false, + this.triagedAt, + this.thumbsAtTriageTime, + this.thumbs = 0, + }) : labels = labels ?? {}; + + factory IssueStats.read(FileReader reader) { + return IssueStats( + lastContributorTouch: reader.readNullOr(reader.readDateTime), + lastAssigneeTouch: reader.readNullOr(reader.readDateTime), + labels: reader.readSet(reader.readString), + openedAt: reader.readNullOr(reader.readDateTime), + lockedAt: reader.readNullOr(reader.readDateTime), + assignedAt: reader.readNullOr(reader.readDateTime), + assignedToTeamMemberReporter: reader.readBool(), + triagedAt: reader.readNullOr(reader.readDateTime), + thumbsAtTriageTime: reader.readNullOr(reader.readInt), + thumbs: reader.readInt(), + ); + } + + static void write(FileWriter writer, IssueStats value) { + writer.writeNullOr(value.lastContributorTouch, writer.writeDateTime); + writer.writeNullOr(value.lastAssigneeTouch, writer.writeDateTime); + writer.writeSet(writer.writeString, value.labels); + writer.writeNullOr(value.openedAt, writer.writeDateTime); + writer.writeNullOr(value.lockedAt, writer.writeDateTime); + writer.writeNullOr(value.assignedAt, writer.writeDateTime); + writer.writeBool(value.assignedToTeamMemberReporter); + writer.writeNullOr(value.triagedAt, writer.writeDateTime); + writer.writeNullOr(value.thumbsAtTriageTime, writer.writeInt); + writer.writeInt(value.thumbs); + } + + DateTime? lastContributorTouch; + DateTime? lastAssigneeTouch; + Set labels; + DateTime? openedAt; + DateTime? lockedAt; + DateTime? assignedAt; + bool assignedToTeamMemberReporter = false; + DateTime? triagedAt; + int? thumbsAtTriageTime; + int thumbs; + + @override + String toString() { + final StringBuffer buffer = StringBuffer(); + buffer.write('{${(labels.toList()..sort()).join(', ')}} and $thumbs 👍'); + if (openedAt != null) { + buffer.write('; openedAt: $openedAt'); + } + if (lastContributorTouch != null) { + buffer.write('; lastContributorTouch: $lastContributorTouch'); + } else { + buffer.write('; lastContributorTouch: never'); + } + if (assignedAt != null) { + buffer.write('; assignedAt: $assignedAt'); + if (assignedToTeamMemberReporter) { + buffer.write(' (to team-member reporter)'); + } + if (lastAssigneeTouch != null) { + buffer.write('; lastAssigneeTouch: $lastAssigneeTouch'); + } else { + buffer.write('; lastAssigneeTouch: never'); + } + } else { + if (lastAssigneeTouch != null) { + buffer.write('; lastAssigneeTouch: $lastAssigneeTouch (?!)'); + } + if (assignedToTeamMemberReporter) { + buffer.write('; assigned to team-member reporter (?!)'); + } + } + if (lockedAt != null) { + buffer.write('; lockedAt: $lockedAt'); + } + if (triagedAt != null) { + buffer.write('; triagedAt: $triagedAt'); + if (thumbsAtTriageTime != null) { + buffer.write(' with $thumbsAtTriageTime 👍'); + } + } else { + if (thumbsAtTriageTime != null) { + buffer.write('; not triaged with $thumbsAtTriageTime 👍 when triaged (?!)'); + } + } + return buffer.toString(); + } +} + +typedef StoreFields = ({ + Map issues, + Map pendingCleanupIssues, + int? selfTestIssue, + DateTime? selfTestClosedDate, + int currentBackgroundIssue, + int highestKnownIssue, + Map lastRefeedByTime, + DateTime? lastCleanupStart, + DateTime? lastCleanupEnd, + DateTime? lastTidyStart, + DateTime? lastTidyEnd, +}); + +class Engine { + Engine._({ + required this.webhookSecret, + required this.discord, + required this.github, + required this.secrets, + required Set contributors, + required StoreFields? store, + }) : _contributors = contributors, + _issues = store?.issues ?? {}, + _pendingCleanupIssues = store?.pendingCleanupIssues ?? {}, + _selfTestIssue = store?.selfTestIssue, + _selfTestClosedDate = store?.selfTestClosedDate, + _currentBackgroundIssue = store?.currentBackgroundIssue ?? 1, + _highestKnownIssue = store?.highestKnownIssue ?? 1, + _lastRefeedByTime = store?.lastRefeedByTime ?? {}, + _lastCleanupStart = store?.lastCleanupStart, + _lastCleanupEnd = store?.lastCleanupEnd, + _lastTidyStart = store?.lastTidyStart, + _lastTidyEnd = store?.lastTidyEnd { + _startup = DateTime.timestamp(); + scheduleMicrotask(_updateStoreInBackground); + _nextCleanup = (_lastCleanupEnd ?? _startup).add(Timings.cleanupUpdatePeriod); + _cleanupTimer = Timer(_nextCleanup.difference(_startup), _performCleanups); + _nextTidy = (_lastTidyEnd ?? _startup).add(Timings.longTermTidyingPeriod); + _tidyTimer = Timer(_nextTidy.difference(_startup), _performLongTermTidying); + log('Startup'); + } + + static Future initialize({ + required List webhookSecret, + required INyxx discord, + required GitHub github, + void Function()? onChange, + required Secrets secrets, + }) async { + return Engine._( + webhookSecret: webhookSecret, + discord: discord, + github: github, + secrets: secrets, + contributors: await _loadContributors(github), + store: await _read(secrets), + ); + } + + final List webhookSecret; + final INyxx discord; + final GitHub github; + final Secrets secrets; + + // data this is stored on local disk + final Set _contributors; + final Map _issues; + final Map _pendingCleanupIssues; + int? _selfTestIssue; + DateTime? _selfTestClosedDate; + int _currentBackgroundIssue; + int _highestKnownIssue; + final Map _lastRefeedByTime; // last time we forced an otherwise normal issue to get retriaged by each team + + final Set _recentIds = {}; // used to detect duplicate messages and discard them + final List _log = []; + late final DateTime _startup; + DateTime? _lastCleanupStart; + DateTime? _lastCleanupEnd; + late DateTime _nextCleanup; + Timer? _cleanupTimer; + DateTime? _lastTidyStart; + DateTime? _lastTidyEnd; + late DateTime _nextTidy; + Timer? _tidyTimer; + + void log(String message) { + stderr.writeln(message); + _log.add('${DateTime.timestamp().toIso8601String()} $message'); + while (_log.length > maxLogLength) { + _log.removeAt(0); + } + } + + int _actives = 0; + bool _shuttingDown = false; + Completer _pendingIdle = Completer(); + Future shutdown(Future Function() shutdownCallback) async { + assert(!_shuttingDown, 'shutdown called reentrantly'); + _shuttingDown = true; + while (_actives > 0) { + await _pendingIdle.future; + } + return shutdownCallback(); + } + + static Future> _loadContributors(GitHub github) async { + final int teamId = (await github.organizations.getTeamByName(GitHubSettings.organization, GitHubSettings.teamName)).id!; + return github.organizations.listTeamMembers(teamId).map((TeamMember member) => member.login!).toSet(); + } + + static Future _read(Secrets secrets) async { + if (await secrets.store.exists()) { + try { + final FileReader reader = FileReader((await secrets.store.readAsBytes()).buffer.asByteData()); + return ( + issues: reader.readMap(reader.readInt, reader.readerForCustom(IssueStats.read)), + pendingCleanupIssues: reader.readMap(reader.readInt, reader.readDateTime), + selfTestIssue: reader.readNullOr(reader.readInt), + selfTestClosedDate: reader.readNullOr(reader.readDateTime), + currentBackgroundIssue: reader.readInt(), + highestKnownIssue: reader.readInt(), + lastRefeedByTime: reader.readMap(reader.readString, reader.readDateTime), + lastCleanupStart: reader.readNullOr(reader.readDateTime), + lastCleanupEnd: reader.readNullOr(reader.readDateTime), + lastTidyStart: reader.readNullOr(reader.readDateTime), + lastTidyEnd: reader.readNullOr(reader.readDateTime), + ); + } catch (e) { + print('Error loading issue store, consider deleting ${secrets.store.path} file.'); + rethrow; + } + } + return null; + } + + bool _writing = false; + bool _dirty = false; + Future _write() async { + if (_writing) { + _dirty = true; + return; + } + try { + _writing = true; + final FileWriter writer = FileWriter(); + writer.writeMap(writer.writeInt, writer.writerForCustom(IssueStats.write), _issues); + writer.writeMap(writer.writeInt, writer.writeDateTime, _pendingCleanupIssues); + writer.writeNullOr(_selfTestIssue, writer.writeInt); + writer.writeNullOr(_selfTestClosedDate, writer.writeDateTime); + writer.writeInt(_currentBackgroundIssue); + writer.writeInt(_highestKnownIssue); + writer.writeMap(writer.writeString, writer.writeDateTime, _lastRefeedByTime); + writer.writeNullOr(_lastCleanupStart, writer.writeDateTime); + writer.writeNullOr(_lastCleanupEnd, writer.writeDateTime); + writer.writeNullOr(_lastTidyStart, writer.writeDateTime); + writer.writeNullOr(_lastTidyEnd, writer.writeDateTime); + await writer.write(secrets.store); + } finally { + _writing = false; + } + if (_dirty) { + _dirty = false; + return _write(); + } + } + + // the maxFraction argument represents the fraction of the total rate limit that is allowed to be + // used before waiting. + // + // the background update code sets it to 0.5 so that there is still a buffer for the other calls, + // otherwise the background update code could just use it all up and then stall everything else. + Future _githubReady([double maxFraction = 0.95]) async { + if (github.rateLimitRemaining != null && github.rateLimitRemaining! < (github.rateLimitLimit! * (1.0 - maxFraction)).round()) { + assert(github.rateLimitReset != null); + await _until(github.rateLimitReset!); + } + } + + static Future _until(DateTime target) { + final DateTime now = DateTime.timestamp(); + if (!now.isBefore(target)) { + return Future.value(); + } + final Duration delta = target.difference(now); + return Future.delayed(delta); + } + + Future handleRequest(HttpRequest request) async { + _actives += 1; + try { + try { + if (await _handleDebugRequests(request)) { + return; + } + final List bytes = await request.expand((Uint8List sublist) => sublist).toList(); + final String expectedSignature = 'sha256=${Hmac(sha256, webhookSecret).convert(bytes).bytes.map(hex).join()}'; + final List actualSignatures = request.headers['X-Hub-Signature-256'] ?? const []; + final List eventKind = request.headers['X-GitHub-Event'] ?? const []; + final List eventId = request.headers['X-GitHub-Delivery'] ?? const []; + if (actualSignatures.length != 1 || expectedSignature != actualSignatures.single || + eventKind.length != 1 || eventId.length != 1) { + request.response.writeln('Invalid metadata.'); + return; + } + if (_recentIds.contains(eventId.single)) { + request.response.writeln('I got that one already.'); + return; + } + _recentIds.add(eventId.single); + while (_recentIds.length > 50) { + _recentIds.remove(_recentIds.first); + } + final dynamic payload = Json.parse(utf8.decode(bytes)); + await _updateModelFromWebhook(eventKind.single, payload); + await _updateDiscordFromWebhook(eventKind.single, payload); + request.response.writeln('Acknowledged.'); + } catch (e, s) { + log('Failed to handle ${request.uri}: $e (${e.runtimeType})\n$s'); + } finally { + await request.response.close(); + } + } finally { + _actives -= 1; + if (_shuttingDown && _actives == 0) { + _pendingIdle.complete(); + _pendingIdle = Completer(); + } + } + } + + Future _handleDebugRequests(HttpRequest request) async { + if (request.uri.path == '/debug') { + final DateTime now = DateTime.timestamp(); + request.response.writeln('FLUTTER TRIAGE BOT'); + request.response.writeln('=================='); + request.response.writeln(); + request.response.writeln('Current time: $now'); + request.response.writeln('Uptime: ${now.difference(_startup)} (startup at $_startup).'); + request.response.writeln('Cleaning: ${_cleaning ? "active" : "pending"} (${_pendingCleanupIssues.length} issue${s(_pendingCleanupIssues.length)}); last started $_lastCleanupStart, last ended $_lastCleanupEnd, next in ${_nextCleanup.difference(now)}.'); + request.response.writeln('Tidying: ${_tidying ? "active" : "pending"}; last started $_lastTidyStart, last ended $_lastTidyEnd, next in ${_nextTidy.difference(now)}.'); + request.response.writeln('Background scan: currently fetching issue #$_currentBackgroundIssue, highest known issue #$_highestKnownIssue.'); + request.response.writeln('${_contributors.length} known contributor${s(_contributors.length)}.'); + request.response.writeln('GitHub Rate limit status: ${github.rateLimitRemaining}/${github.rateLimitLimit} (reset at ${github.rateLimitReset})'); + if (_selfTestIssue != null) { + request.response.writeln('Current self test issue: #$_selfTestIssue'); + } + if (_selfTestClosedDate != null) { + request.response.writeln('Self test last closed on: $_selfTestClosedDate (${now.difference(_selfTestClosedDate!)} ago, next in ${_selfTestClosedDate!.add(Timings.selfTestPeriod).difference(now)})'); + } + request.response.writeln(); + request.response.writeln('Last refeeds (refeed delay: ${Timings.refeedDelay}):'); + for (final String team in _lastRefeedByTime.keys.toList()..sort((String a, String b) => _lastRefeedByTime[a]!.compareTo(_lastRefeedByTime[b]!))) { + final Duration delta = now.difference(_lastRefeedByTime[team]!); + final String annotation = delta > Timings.refeedDelay + ? '' + : '; blocking immediate refeeds'; + request.response.writeln('${team.padRight(30, '.')}.${_lastRefeedByTime[team]} ($delta ago$annotation)'); + } + request.response.writeln(); + request.response.writeln('Tracking ${_issues.length} issue${s(_issues.length)}:'); + for (final int number in _issues.keys.toList()..sort()) { + String cleanup = ''; + if (_pendingCleanupIssues.containsKey(number)) { + final Duration delta = Timings.cleanupUpdateDelay - now.difference(_pendingCleanupIssues[number]!); + if (delta < Duration.zero) { + cleanup = ' [cleanup pending]'; + } else if (delta.inMinutes <= 1) { + cleanup = ' [cleanup soon]'; + } else { + cleanup = ' [cleanup in ${delta.inMinutes} minute${s(delta.inMinutes)}]'; + } + } + request.response.writeln(' #${number.toString().padLeft(6, "0")}: ${_issues[number]}$cleanup'); + } + request.response.writeln(); + request.response.writeln('LOG'); + _log.forEach(request.response.writeln); + return true; + } + if (request.uri.path == '/force-update') { + final int number = int.parse(request.uri.query); // if input is not an integer, this'll throw + await _updateStoreInBackgroundForIssue(number); + request.response.writeln('${_issues[number]}'); + return true; + } + if (request.uri.path == '/force-cleanup') { + log('User-triggered forced cleanup'); + await _performCleanups(); + _log.forEach(request.response.writeln); + return true; + } + if (request.uri.path == '/force-tidy') { + log('User-triggered forced tidy'); + await _performLongTermTidying(); + _log.forEach(request.response.writeln); + return true; + } + return false; + } + + // Called when we get a webhook message. + Future _updateModelFromWebhook(String event, dynamic payload) async { + final DateTime now = DateTime.timestamp(); + switch (event) { + case 'issue_comment': + if (!payload.issue.hasKey('pull_request') && payload.repository.full_name.toString() == GitHubSettings.primaryRepository.fullName) { + _updateIssueFromWebhook(payload.sender.login.toString(), payload.issue, now); + } + case 'issues': + if (payload.repository.full_name.toString() != GitHubSettings.primaryRepository.fullName) { + return; + } + if (payload.action.toString() == 'closed') { + final int number = payload.issue.number.toInt(); + _issues.remove(number); + _pendingCleanupIssues.remove(number); + if (number == _selfTestIssue) { + _selfTestIssue = null; + _selfTestClosedDate = now; + } + } else { + final IssueStats? issue = _updateIssueFromWebhook(payload.sender.login.toString(), payload.issue, now); + if (issue != null) { + if (payload.action.toString() == 'assigned') { + // if we are adding a second assignee, _updateIssueFromWebhook won't update the assignedAt timestamp + _issues[payload.issue.number.toInt()]!.assignedAt = now; + } else if (payload.action.toString() == 'opened' || payload.action.toString() == 'reopened') { + _issues[payload.issue.number.toInt()]!.openedAt = now; + } else if (payload.action.toString() == 'labeled') { + final String label = payload.label.name.toString(); + final String? team = getTeamFor(GitHubSettings.triagedPrefix, label); + if (team != null) { + final Set teams = getTeamsFor(GitHubSettings.teamPrefix, issue.labels); + if (teams.length == 1) { + if (teams.single == team) { + issue.triagedAt = now; + } + } + } + } + } + } + case 'membership': + if (payload.team.slug.toString() == '${GitHubSettings.organization}/${GitHubSettings.teamName}') { + switch (payload.action.toString()) { + case 'added': + _contributors.add(payload.member.login.toString()); + case 'removed': + _contributors.remove(payload.member.login.toString()); + } + } + } + await _write(); + } + + // Called when we get a webhook message that we've established is an + // interesting update to an issue. + // Attempts to build up and/or update the data for an issue based on + // the data in a change event. This will be approximate until we can actually + // scan the issue properly in _updateStoreInBackground. + IssueStats? _updateIssueFromWebhook(String user, dynamic data, DateTime now) { + final int number = data.number.toInt(); + if (number > _highestKnownIssue) { + _highestKnownIssue = number; + } + if (data.state.toString() == 'closed') { + _issues.remove(number); + _pendingCleanupIssues.remove(number); + if (number == _selfTestIssue) { + _selfTestIssue = null; + _selfTestClosedDate = now; + } + return null; + } + final IssueStats issue = _issues.putIfAbsent(number, IssueStats.new); + final Set newLabels = {}; + for (final dynamic label in data.labels.asIterable()) { + final String name = label.name.toString(); + if (GitHubSettings.isRelevantLabel(name)) { + newLabels.add(name); + } + } + issue.labels = newLabels; + final Set assignees = {}; + for (final dynamic assignee in data.assignees.asIterable()) { + assignees.add(assignee.login.toString()); + } + final String reporter = data.user.login.toString(); + if (assignees.isEmpty) { + issue.lastAssigneeTouch = null; + issue.assignedAt = null; + issue.assignedToTeamMemberReporter = false; + } else { + issue.assignedAt ??= now; + if (assignees.contains(user)) { + issue.lastAssigneeTouch = now; + } + issue.assignedToTeamMemberReporter = assignees.contains(reporter) && _contributors.contains(reporter); + } + if (_contributors.contains(user)) { + issue.lastContributorTouch = now; + } + if (!data.locked.toBoolean()) { + issue.lockedAt = null; + } else { + issue.lockedAt ??= now; + } + final Set teams = getTeamsFor(GitHubSettings.triagedPrefix, newLabels); + if (teams.isEmpty) { + issue.thumbsAtTriageTime = null; + issue.triagedAt = null; + } + _pendingCleanupIssues[number] = now; + return issue; + } + + Future _updateDiscordFromWebhook(String event, dynamic payload) async { + if (GitHubSettings.knownBots.contains(payload.sender.login.toString())) { + return; + } + switch (event) { + case 'star': + switch (payload.action.toString()) { + case 'created': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** starred ${payload.repository.full_name}', + channel: DiscordChannels.github2, + emoji: UnicodeEmoji('🌟'), + log: log, + ); + } + case 'label': + switch (payload.action.toString()) { + case 'created': + String message; + if (payload.label.description.toString().isEmpty) { + message = '**@${payload.sender.login}** created a new label in ${payload.repository.full_name}, `${payload.label.name}`, but did not give it a description!'; + } else { + message = '**@${payload.sender.login}** created a new label in ${payload.repository.full_name}, `${payload.label.name}`, with the description "${payload.label.description}".'; + } + await sendDiscordMessage( + discord: discord, + body: message, + channel: DiscordChannels.hiddenChat, + embedTitle: '${payload.label.name}', + embedDescription: '${payload.label.description}', + embedColor: '${payload.label.color}', + log: log, + ); + } + case 'pull_request': + switch (payload.action.toString()) { + case 'closed': + final bool merged = payload.pull_request.merged_at.toScalar() != null; + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** ${ merged ? "merged" : "closed" } *${payload.pull_request.title}* (${payload.pull_request.html_url})', + channel: DiscordChannels.github2, + log: log, + ); + case 'opened': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** submitted a new pull request: **${payload.pull_request.title}** (${payload.repository.full_name} #${payload.pull_request.number.toInt()})\n${stripBoilerplate(payload.pull_request.body.toString())}', + suffix: '*${payload.pull_request.html_url}*', + channel: DiscordChannels.github2, + log: log, + ); + } + case 'pull_request_review': + switch (payload.action.toString()) { + case 'submitted': + switch (payload.review.state.toString()) { + case 'approved': + await sendDiscordMessage( + discord: discord, + body: payload.review.body.toString().isEmpty ? + '**@${payload.sender.login}** gave **LGTM** for *${payload.pull_request.title}* (${payload.pull_request.html_url})' : + '**@${payload.sender.login}** gave **LGTM** for *${payload.pull_request.title}* (${payload.pull_request.html_url}): ${stripBoilerplate(payload.review.body.toString(), inline: true)}', + channel: DiscordChannels.github2, + log: log, + ); + } + } + case 'pull_request_review_comment': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** wrote: ${stripBoilerplate(payload.comment.body.toString(), inline: true)}', + suffix: '*${payload.comment.html_url} ${payload.pull_request.title}*', + channel: DiscordChannels.github2, + log: log, + ); + case 'issue_comment': + switch (payload.action.toString()) { + case 'created': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** wrote: ${stripBoilerplate(payload.comment.body.toString(), inline: true)}', + suffix: '*${payload.comment.html_url} ${payload.issue.title}*', + channel: DiscordChannels.github2, + log: log, + ); + } + case 'issues': + switch (payload.action.toString()) { + case 'closed': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** closed *${payload.issue.title}* (${payload.issue.html_url})', + channel: DiscordChannels.github2, + log: log, + ); + case 'reopened': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** reopened *${payload.issue.title}* (${payload.issue.html_url})', + channel: DiscordChannels.github2, + log: log, + ); + case 'opened': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** filed a new issue: **${payload.issue.title}** (${payload.repository.full_name} #${payload.issue.number.toInt()})\n${stripBoilerplate(payload.issue.body.toString())}', + suffix: '*${payload.issue.html_url}*', + channel: DiscordChannels.github2, + log: log, + ); + bool isDesignDoc = false; + for (final dynamic label in payload.issue.labels.asIterable()) { + final String name = label.name.toString(); + if (name == GitHubSettings.designDoc) { + isDesignDoc = true; + break; + } + } + if (isDesignDoc) { + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** wrote a new design doc: **${payload.issue.title}**\n${stripBoilerplate(payload.issue.body.toString())}', + suffix: '*${payload.issue.html_url}*', + channel: DiscordChannels.hiddenChat, + log: log, + ); + } + case 'locked': + case 'unlocked': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** ${payload.action} ${payload.issue.html_url} - ${payload.issue.title}', + channel: DiscordChannels.github2, + log: log, + ); + } + case 'membership': + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** ${payload.action} user **@${payload.member.login}** (${payload.team.name})', + channel: DiscordChannels.github2, + log: log, + ); + case 'gollum': + for (final dynamic page in payload.pages.asIterable()) { + // sadly the commit message doesn't get put into the event payload + await sendDiscordMessage( + discord: discord, + body: '**@${payload.sender.login}** ${page.action} the **${page.title}** wiki page', + suffix: '*${page.html_url}*', + channel: DiscordChannels.github2, + log: log, + ); + } + } + } + + // This is called every few seconds to update one issue in our store. + // We do this because (a) initially, we don't have any data so we need + // to fill our database somehow, and (b) thereafter, we might go out of + // sync if we miss an event, e.g. due to network issues. + Future _updateStoreInBackground() async { + await _updateStoreInBackgroundForIssue(_currentBackgroundIssue); + _currentBackgroundIssue -= 1; + if (_currentBackgroundIssue <= 0) { + _currentBackgroundIssue = _highestKnownIssue; + } + await _write(); + await Future.delayed(Timings.backgroundUpdatePeriod); + scheduleMicrotask(_updateStoreInBackground); + } + + Future _updateStoreInBackgroundForIssue(int number) async { + try { + await _githubReady(0.5); + final Issue githubIssue = await github.issues.get(GitHubSettings.primaryRepository, number); + if (githubIssue.pullRequest == null && githubIssue.isOpen) { + final String? reporter = githubIssue.user?.login; + bool open = true; + final Set assignees = {}; + final Set labels = {}; + DateTime? lastContributorTouch; + DateTime? lastAssigneeTouch; + DateTime? openedAt = githubIssue.createdAt; + DateTime? lockedAt; + DateTime? assignedAt; + DateTime? triagedAt; + DateTime? lastChange; + await _githubReady(); + await for (final TimelineEvent event in github.issues.listTimeline(GitHubSettings.primaryRepository, number)) { + String? user; + DateTime? time; + // event.actor could be null if the original user was deleted (shows as "ghost" in GitHub's web UI) + // see e.g. https://github.com/flutter/flutter/issues/93070 + switch (event.event) { + case 'renamed': // The issue or pull request title was changed. + case 'commented': + user = event.actor?.login; + time = event.createdAt; + case 'locked': // The issue or pull request was locked. + user = event.actor?.login; + time = event.createdAt; + lockedAt = time; + case 'unlocked': // The issue was unlocked. + user = event.actor?.login; + time = event.createdAt; + lockedAt = null; + case 'assigned': + event as AssigneeEvent; + if (event.assignee != null && event.assignee!.login != null) { + user = event.actor?.login; + time = event.createdAt; + assignees.add(event.assignee!.login!); + assignedAt = time; + } + case 'unassigned': + event as AssigneeEvent; + user = event.actor?.login; + time = event.createdAt; + if (event.assignee != null) { + assignees.remove(event.assignee!.login); + if (assignees.isEmpty) { + assignedAt = null; + lastAssigneeTouch = null; + } + } + case 'labeled': + event as LabelEvent; + user = event.actor?.login; + time = event.createdAt; + final String label = event.label!.name; + if (GitHubSettings.isRelevantLabel(label, ignorePriorities: true)) { + // we add the priority labels later to avoid confusion from the renames + labels.add(label); + } + final String? triagedTeam = getTeamFor(GitHubSettings.triagedPrefix, label); + if (triagedTeam != null) { + final Set teams = getTeamsFor(GitHubSettings.teamPrefix, labels); + if (teams.length == 1 && teams.single == triagedTeam) { + triagedAt = event.createdAt; + } + } + case 'unlabeled': + event as LabelEvent; + user = event.actor?.login; + time = event.createdAt; + final String label = event.label!.name; + labels.remove(label); + final Set teams = getTeamsFor(GitHubSettings.teamPrefix, labels); + final Set triagedTeams = getTeamsFor(GitHubSettings.triagedPrefix, labels); + if (teams.intersection(triagedTeams).isEmpty) { + triagedAt = null; + } + case 'closed': + user = event.actor?.login; + time = event.createdAt; + open = false; + case 'reopened': + user = event.actor?.login; + time = event.createdAt; + openedAt = event.createdAt; + open = true; + } + if (user != null) { + assert(time != null); + if (_contributors.contains(user)) { + lastContributorTouch = time; + } + if (assignees.contains(user)) { + lastAssigneeTouch = time; + } + } + if (lastChange == null || (time != null && time.isAfter(lastChange))) { + lastChange = time; + } + await _githubReady(); + } + if (open) { + // Because we renamed some of the labels, we can't trust the + // historical names we get from the timeline. We have to use the + // actual current labels from the githubIssue. + // Also, there might be missing labels because the timeline doesn't + // include the issue's original labels from when the issue was filed. + final Set actualLabels = githubIssue.labels + .map((IssueLabel label) => label.name) + .where(GitHubSettings.isRelevantLabel) + .toSet(); + for (final String label in actualLabels.difference(labels)) { + // could have been renamed, but let's assume it was added when the issue was created (and never removed). + final String? triagedTeam = getTeamFor(GitHubSettings.triagedPrefix, label); + if (triagedTeam != null) { + final Set teams = getTeamsFor(GitHubSettings.teamPrefix, actualLabels); + if (teams.length == 1 && teams.single == triagedTeam) { + triagedAt = openedAt; + } + } + } + final IssueStats issue = _issues.putIfAbsent(number, IssueStats.new); + issue.lastContributorTouch = lastContributorTouch; + issue.lastAssigneeTouch = lastAssigneeTouch; + issue.labels = actualLabels; + issue.openedAt = openedAt; + issue.lockedAt = lockedAt; + assert((assignedAt != null) == (assignees.isNotEmpty)); + issue.assignedAt = assignedAt; + issue.assignedToTeamMemberReporter = reporter != null && assignees.contains(reporter) && _contributors.contains(reporter); + issue.thumbs = githubIssue.reactions?.plusOne ?? 0; + issue.triagedAt = triagedAt; + if (triagedAt != null) { + if (issue.thumbsAtTriageTime == null) { + int thumbsAtTriageTime = 0; + await _githubReady(); + await for (final Reaction reaction in github.issues.listReactions(GitHubSettings.primaryRepository, number)) { + if (reaction.createdAt != null && reaction.createdAt!.isAfter(triagedAt)) { + break; + } + if (reaction.content == '+1') { + thumbsAtTriageTime += 1; + } + await _githubReady(); + } + issue.thumbsAtTriageTime = thumbsAtTriageTime; + } + } else { + issue.thumbsAtTriageTime = null; + } + } else { + _issues.remove(number); + _pendingCleanupIssues.remove(number); + } + if (!_pendingCleanupIssues.containsKey(number)) { + _pendingCleanupIssues[number] = lastChange ?? DateTime.timestamp(); + } + } else { + if (_selfTestIssue == number) { + _selfTestIssue = null; + _selfTestClosedDate = githubIssue.closedAt; + } + } + } on NotFound { + _issues.remove(number); + _pendingCleanupIssues.remove(number); + } catch (e, s) { + log('Failed to perform background update of issue #$number: $e (${e.runtimeType})\n$s'); + } + } + + bool _cleaning = false; + // This is called periodically to look at recently-updated issues. + // This lets us enforce invariants but only after humans have had a chance + // to do whatever it is they are doing on the issue. + Future _performCleanups([Timer? timer]) async { + final DateTime now = DateTime.timestamp(); + _cleanupTimer?.cancel(); + _nextCleanup = now.add(Timings.cleanupUpdatePeriod); + _cleanupTimer = Timer(Timings.cleanupUpdatePeriod, _performCleanups); + if (_cleaning) { + return; + } + try { + _cleaning = true; + _lastCleanupStart = now; + final DateTime refeedThreshold = now.subtract(Timings.refeedDelay); + final DateTime cleanupThreshold = now.subtract(Timings.cleanupUpdateDelay); + final DateTime staleThreshold = now.subtract(Timings.timeUntilStale); + final List issues = _pendingCleanupIssues.keys.toList(); + for (final int number in issues) { + try { + if (_pendingCleanupIssues.containsKey(number) && _pendingCleanupIssues[number]!.isBefore(cleanupThreshold)) { + assert(_issues.containsKey(number)); + final IssueStats issue = _issues[number]!; + final Set labelsToRemove = {}; + final List messages = []; + // PRIORITY LABELS + final Set priorities = issue.labels.intersection(GitHubSettings.priorities); + if (priorities.length > 1) { + // When an issue has multiple priorities, remove all but the highest. + for (final String priority in GitHubSettings.priorities.toList().reversed) { + if (priorities.contains(priority)) { + labelsToRemove.add(priority); + priorities.remove(priority); + } + if (priorities.length == 1) { + break; + } + } + } + // TEAM LABELS + final Set teams = getTeamsFor(GitHubSettings.teamPrefix, issue.labels); + final Set triaged = getTeamsFor(GitHubSettings.triagedPrefix, issue.labels); + final Set fyi = getTeamsFor(GitHubSettings.fyiPrefix, issue.labels); + if (teams.length > 1 && number != _selfTestIssue) { + // Issues should only have a single "team-foo" label. + // When this is violated, we remove all of them to send the issue back to front-line triage. + messages.add( + 'Issue is assigned to multiple teams (${teams.join(", ")}). ' + 'Please ensure the issue has only one `${GitHubSettings.teamPrefix}*` label at a time. ' + 'Use `${GitHubSettings.fyiPrefix}*` labels to have another team look at the issue without reassigning it.' + ); + for (final String team in teams) { + labelsToRemove.add('${GitHubSettings.teamPrefix}$team'); + // Also remove the labels we'd end up removing below, to avoid having confusing messages. + if (triaged.contains(team)) { + labelsToRemove.add('${GitHubSettings.triagedPrefix}$team'); + triaged.remove(team); + } + if (fyi.contains(team)) { + labelsToRemove.add('${GitHubSettings.fyiPrefix}$team'); + fyi.remove(team); + } + } + teams.clear(); + } + for (final String team in fyi.toList()) { + if (teams.contains(team)) { + // Remove redundant fyi-* labels. + messages.add('The `${GitHubSettings.fyiPrefix}$team` label is redundant with the `${GitHubSettings.teamPrefix}$team` label.'); + labelsToRemove.add('${GitHubSettings.fyiPrefix}$team'); + fyi.remove(team); + } else if (triaged.contains(team)) { + // If an fyi-* label has been acknowledged by a triaged-* label, we can remove them both. + labelsToRemove.add('${GitHubSettings.fyiPrefix}$team'); + labelsToRemove.add('${GitHubSettings.triagedPrefix}$team'); + fyi.remove(team); + triaged.remove(team); + } + } + for (final String team in triaged.toList()) { + // Remove redundant triaged-* labels. + if (!teams.contains(team)) { + messages.add( + 'The `${GitHubSettings.triagedPrefix}$team` label is irrelevant if ' + 'there is no `${GitHubSettings.teamPrefix}$team` label or `${GitHubSettings.fyiPrefix}$team` label.' + ); + labelsToRemove.add('${GitHubSettings.triagedPrefix}$team'); + triaged.remove(team); + } + } + assert(teams.length <= 1 || number == _selfTestIssue); + assert(triaged.length <= teams.length); + if (triaged.isNotEmpty && priorities.isEmpty && number != _selfTestIssue) { + assert(triaged.length == 1); + final String team = triaged.single; + if (!_lastRefeedByTime.containsKey(team) || _lastRefeedByTime[team]!.isBefore(refeedThreshold)) { + messages.add( + 'This issue is missing a priority label. ' + 'Please set a priority label when adding the `${GitHubSettings.triagedPrefix}$team` label.' + ); + _lastRefeedByTime[team] = now; + labelsToRemove.add('${GitHubSettings.triagedPrefix}$team'); + triaged.remove(team); + assert(triaged.isEmpty); + } + } + // STALE THUMBS UP LABEL + if (triaged.isNotEmpty && issue.labels.contains(GitHubSettings.thumbsUpLabel)) { + labelsToRemove.add(GitHubSettings.thumbsUpLabel); + } + // STALE STALE ISSUE LABEL + if (issue.labels.contains(GitHubSettings.staleIssueLabel) && + ((issue.lastContributorTouch != null && issue.lastContributorTouch!.isAfter(staleThreshold)) || + (issue.assignedAt == null))) { + labelsToRemove.add(GitHubSettings.staleIssueLabel); + } + // LOCKED STATUS + final bool shouldUnlock = issue.openedAt != null && issue.lockedAt != null && issue.lockedAt!.isBefore(issue.openedAt!); + // APPLY PENDING CHANGES + if ((labelsToRemove.isNotEmpty || messages.isNotEmpty || shouldUnlock) && await isActuallyOpen(number)) { + for (final String label in labelsToRemove) { + log('Removing label "$label" on issue #$number'); + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, number, label); + issue.labels.remove(label); + } + if (messages.isNotEmpty) { + log('Posting message on issue #$number:\n ${messages.join("\n ")}'); + await _githubReady(); + await github.issues.createComment(GitHubSettings.primaryRepository, number, messages.join('\n')); + } + if (shouldUnlock) { + log('Unlocking issue #$number (reopened after being locked)'); + await _githubReady(); + await github.issues.unlock(GitHubSettings.primaryRepository, number); + } + } + _pendingCleanupIssues.remove(number); + } + } catch (e, s) { + log('Failure in cleanup for #$number: $e (${e.runtimeType})\n$s'); + } + } + } finally { + _cleaning = false; + _lastCleanupEnd = DateTime.timestamp(); + } + } + + bool _tidying = false; + // This is called periodically to enforce long-term policies (things that + // only apply after an issue has been in a particular state for weeks). + Future _performLongTermTidying([Timer? timer]) async { + _tidyTimer?.cancel(); + final DateTime now = DateTime.timestamp(); + _nextTidy = now.add(Timings.longTermTidyingPeriod); + _tidyTimer = Timer(Timings.longTermTidyingPeriod, _performLongTermTidying); + if (_tidying) { + return; + } + try { + _tidying = true; + _lastTidyStart = now; + final DateTime staleThreshold = now.subtract(Timings.timeUntilStale); + final DateTime reallyStaleThreshold = now.subtract(Timings.timeUntilReallyStale); + final DateTime unlockThreshold = now.subtract(Timings.timeUntilUnlock); + final DateTime refeedThreshold = now.subtract(Timings.refeedDelay); + int number = 1; + while (number < _highestKnownIssue) { + try { + if (_issues.containsKey(number) && !_pendingCleanupIssues.containsKey(number) && number != _selfTestIssue) { + // Tidy the issue. + final IssueStats issue = _issues[number]!; + final Set triagedTeams = getTeamsFor(GitHubSettings.triagedPrefix, issue.labels); + final Set assignedTeams = getTeamsFor(GitHubSettings.teamPrefix, issue.labels); + // Check for assigned issues that aren't making progress. + if (issue.assignedAt != null && + issue.lastContributorTouch != null && + issue.lastContributorTouch!.isBefore(staleThreshold) && + (!issue.assignedToTeamMemberReporter || issue.labels.contains(GitHubSettings.designDoc))) { + await _githubReady(); + final Issue actualIssue = await github.issues.get(GitHubSettings.primaryRepository, number); + if (actualIssue.assignees != null && actualIssue.assignees!.isNotEmpty && isActuallyOpenFromRawIssue(actualIssue)) { + final String assignee = actualIssue.assignees!.map((User user) => '@${user.login}').join(' and '); + if (!issue.labels.contains(GitHubSettings.staleIssueLabel)) { + log('Issue #$number is assigned to $assignee but not making progress; adding comment.'); + await _githubReady(); + await github.issues.addLabelsToIssue(GitHubSettings.primaryRepository, number, [GitHubSettings.staleIssueLabel]); + issue.labels.add(GitHubSettings.staleIssueLabel); + await _githubReady(); + await github.issues.createComment(GitHubSettings.primaryRepository, number, + 'This issue is assigned to $assignee but has had no recent status updates. ' + 'Please consider unassigning this issue if it is not going to be addressed in the near future. ' + 'This allows people to have a clearer picture of what work is actually planned. Thanks!', + ); + } else if (issue.lastContributorTouch!.isBefore(reallyStaleThreshold)) { + bool skip = false; + String team = 'primary triage'; + if (assignedTeams.length == 1) { // if it's more, then cleanup will take care of it + team = assignedTeams.single; + if (!_lastRefeedByTime.containsKey(team) || _lastRefeedByTime[team]!.isBefore(refeedThreshold)) { + _lastRefeedByTime[team] = now; + } else { + skip = true; + } + } + if (!skip) { + log('Issue #$number is assigned to $assignee but still not making progress (for ${now.difference(issue.lastContributorTouch!)}); sending back to triage (for $team team).'); + for (final String triagedTeam in triagedTeams) { + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, number, '${GitHubSettings.triagedPrefix}$triagedTeam'); + issue.labels.remove('${GitHubSettings.triagedPrefix}$triagedTeam'); + } + await _githubReady(); + await github.issues.edit(GitHubSettings.primaryRepository, number, IssueRequest(assignees: const [])); + await _githubReady(); + await github.issues.createComment(GitHubSettings.primaryRepository, number, + 'This issue was assigned to $assignee but has had no status updates in a long time. ' + 'To remove any ambiguity about whether the issue is being worked on, the assignee was removed.', + ); + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, number, GitHubSettings.staleIssueLabel); + issue.labels.remove(GitHubSettings.staleIssueLabel); + } + } + } + } + // Check for P1 issues that aren't making progress. + // We currently rate-limit this to only a few per week so that teams don't get overwhelmed. + if (issue.assignedAt == null && + issue.labels.contains('P1') && + issue.lastContributorTouch != null && + issue.lastContributorTouch!.isBefore(staleThreshold) && + triagedTeams.length == 1) { + final String team = triagedTeams.single; + if ((!_lastRefeedByTime.containsKey(team) || _lastRefeedByTime[team]!.isBefore(refeedThreshold)) && await isActuallyOpen(number)) { + log('Issue #$number is P1 but not assigned and not making progress; removing triage label and adding comment.'); + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, number, '${GitHubSettings.triagedPrefix}${triagedTeams.single}'); + issue.labels.remove('${GitHubSettings.triagedPrefix}${triagedTeams.single}'); + await _githubReady(); + await github.issues.createComment(GitHubSettings.primaryRepository, number, GitHubSettings.staleP1Message); + _lastRefeedByTime[team] = now; + } + } + // Unlock issues after a timeout. + if (issue.lockedAt != null && issue.lockedAt!.isBefore(unlockThreshold) && + !issue.labels.contains(GitHubSettings.permanentlyLocked) && + await isActuallyOpen(number)) { + log('Issue #$number has been locked for too long, unlocking.'); + await _githubReady(); + await github.issues.unlock(GitHubSettings.primaryRepository, number); + } + // Flag issues that have gained a lot of thumbs-up. + // We don't consider refeedThreshold for this because it should be relatively rare and + // is always noteworthy when it happens. + if (issue.thumbsAtTriageTime != null && triagedTeams.length == 1 && + issue.thumbs >= issue.thumbsAtTriageTime! * GitHubSettings.thumbsThreshold && + issue.thumbs >= GitHubSettings.thumbsMinimum && + await isActuallyOpen(number)) { + log('Issue #$number has gained a lot of thumbs-up, flagging for retriage.'); + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, number, '${GitHubSettings.triagedPrefix}${triagedTeams.single}'); + issue.labels.remove('${GitHubSettings.triagedPrefix}${triagedTeams.single}'); + await _githubReady(); + await github.issues.addLabelsToIssue(GitHubSettings.primaryRepository, number, [GitHubSettings.thumbsUpLabel]); + issue.labels.add(GitHubSettings.thumbsUpLabel); + } + } + } catch (e, s) { + log('Failure in tidying for #$number: $e (${e.runtimeType})\n$s'); + } + number += 1; + } + try { + if (_selfTestIssue == null) { + if (_selfTestClosedDate == null || _selfTestClosedDate!.isBefore(now.subtract(Timings.selfTestPeriod))) { + await _githubReady(); + final Issue issue = await github.issues.create(GitHubSettings.primaryRepository, IssueRequest( + title: 'Triage process self-test', + body: 'This is a test of our triage processes.\n' + '\n' + 'Please handle this issue the same way you would a normal valid but low-priority issue.\n' + '\n' + 'For more details see https://github.com/flutter/flutter/wiki/Triage', + labels: [ + ...GitHubSettings.teams.map((String team) => '${GitHubSettings.teamPrefix}$team'), + 'P2', + ], + )); + _selfTestIssue = issue.number; + _selfTestClosedDate = null; + log('Filed self-test issue #$_selfTestIssue.'); + } + } else if (_issues.containsKey(_selfTestIssue)) { + final IssueStats issue = _issues[_selfTestIssue]!; + if (!issue.labels.contains(GitHubSettings.willNeedAdditionalTriage) && + issue.lastContributorTouch!.isBefore(now.subtract(Timings.selfTestWindow)) && + await isActuallyOpen(_selfTestIssue!)) { + log('Flagging self-test issue #$_selfTestIssue for critical triage.'); + for (final String team in getTeamsFor(GitHubSettings.triagedPrefix, issue.labels)) { + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, _selfTestIssue!, '${GitHubSettings.teamPrefix}$team'); + issue.labels.remove('${GitHubSettings.teamPrefix}$team'); + await _githubReady(); + await github.issues.removeLabelForIssue(GitHubSettings.primaryRepository, _selfTestIssue!, '${GitHubSettings.triagedPrefix}$team'); + issue.labels.remove('${GitHubSettings.triagedPrefix}$team'); + } + await _githubReady(); + await github.issues.addLabelsToIssue(GitHubSettings.primaryRepository, _selfTestIssue!, [GitHubSettings.willNeedAdditionalTriage]); + issue.labels.add(GitHubSettings.willNeedAdditionalTriage); + } + } + } catch (e, s) { + log('Failure in self-test logic: $e (${e.runtimeType})\n$s'); + } + } finally { + _tidying = false; + _lastTidyEnd = DateTime.timestamp(); + } + } + + Future isActuallyOpen(int number) async { + if (!_issues.containsKey(number)) { + return false; + } + await _githubReady(); + final Issue rawIssue = await github.issues.get(GitHubSettings.primaryRepository, number); + return isActuallyOpenFromRawIssue(rawIssue); + } + + bool isActuallyOpenFromRawIssue(Issue rawIssue) { + if (rawIssue.isClosed) { + log('Issue #${rawIssue.number} was unexpectedly found to be closed when doing cleanup.'); + _issues.remove(rawIssue.number); + _pendingCleanupIssues.remove(rawIssue.number); + if (rawIssue.number == _selfTestIssue) { + _selfTestIssue = null; + } + return false; + } + return true; + } + + static String? getTeamFor(String prefix, String label) { + if (label.startsWith(prefix)) { + return label.substring(prefix.length); + } + return null; + } + + static Set getTeamsFor(String prefix, Set labels) { + if (labels.isEmpty) { + return const {}; + } + Set? result; + for (final String label in labels) { + final String? team = getTeamFor(prefix, label); + if (team != null) { + result ??= {}; + result.add(team); + } + } + return result ?? const {}; + } +} + +int secondsSinceEpoch(DateTime time) => time.millisecondsSinceEpoch ~/ 1000; + +Future obtainGitHubCredentials(Secrets secrets, http.Client client) async { + // https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app + final DateTime now = DateTime.timestamp(); + final String jwt = JWT({ + 'iat': secondsSinceEpoch(now.subtract(const Duration(seconds: 60))), + 'exp': secondsSinceEpoch(now.add(const Duration(minutes: 10))), + 'iss': await secrets.githubAppId, + }).sign( + RSAPrivateKey(await secrets.githubAppKey), + algorithm: JWTAlgorithm.RS256, + noIssueAt: true, + ); + final String installation = await secrets.githubInstallationId; + final dynamic response = Json.parse((await client.post( + Uri.parse('https://api.github.com/app/installations/$installation/access_tokens'), + body: '{}', + headers: { + 'Accept': 'application/vnd.github+json', + 'Authorization': 'Bearer $jwt', // should not need escaping, base64 is safe in a header value + 'X-GitHub-Api-Version': '2022-11-28', + }, + )).body); + return response.token.toString(); +} + +Future maintainGitHubCredentials(GitHub github, Secrets secrets, Engine engine, http.Client client) async { + try { + await Future.delayed(Timings.credentialsUpdatePeriod); + github.auth = Authentication.withToken(await obtainGitHubCredentials(secrets, client)); + } catch (e, s) { + engine.log('Failed to maintain GitHub credentials: $e (${e.runtimeType})\n$s'); + } +} + +DateTime _laterOf(DateTime a, DateTime b) { + if (a.isAfter(b)) { + return a; + } + return b; +} + +Future getCertificateTimestamp(Secrets secrets) async { + return _laterOf( + _laterOf( + await secrets.serverCertificateModificationDate, + await secrets.serverIntermediateCertificatesModificationDate, + ), + await secrets.serverKeyModificationDate, + ); +} + +Future loadCertificates(Secrets secrets) async { + return SecurityContext() + ..useCertificateChainBytes( + await secrets.serverCertificate + + await secrets.serverIntermediateCertificates, + ) + ..usePrivateKeyBytes(await secrets.serverKey); +} + +final bool usingAppEngine = Platform.environment.containsKey('APPENGINE_RUNTIME'); + +Future startEngine(void Function()? onChange) async { + final Secrets secrets = Secrets(); + + final INyxx discord = NyxxFactory.createNyxxRest( + await secrets.discordToken, + GatewayIntents.none, + Snowflake.value(await secrets.discordAppId), + ); + await discord.connect(); + + final http.Client httpClient = http.Client(); + + final GitHub github = GitHub( + client: httpClient, + auth: Authentication.withToken(await obtainGitHubCredentials(secrets, httpClient)), + ); + + final Engine engine = await Engine.initialize( + webhookSecret: await secrets.githubWebhookSecret, + discord: discord, + github: github, + onChange: onChange, + secrets: secrets, + ); + + if (usingAppEngine) { + await withAppEngineServices(() async { + runAppEngine(engine.handleRequest); // ignore: unawaited_futures + while (true) { + await maintainGitHubCredentials(github, secrets, engine, httpClient); + } + }); + } else { + scheduleMicrotask(() async { + DateTime activeCertificateTimestamp = await getCertificateTimestamp(secrets); + SecurityContext securityContext = await loadCertificates(secrets); + while (true) { + final HttpServer server = await HttpServer.bindSecure(InternetAddress.anyIPv4, port, securityContext); + server.listen(engine.handleRequest); + DateTime pendingCertificateTimestamp = activeCertificateTimestamp; + do { + await maintainGitHubCredentials(github, secrets, engine, httpClient); + pendingCertificateTimestamp = await getCertificateTimestamp(secrets); + } while (pendingCertificateTimestamp == activeCertificateTimestamp); + activeCertificateTimestamp = pendingCertificateTimestamp; + engine.log('Updating TLS credentials...'); + securityContext = await loadCertificates(secrets); + await engine.shutdown(server.close); + // There's a race condition here where we might miss messages because the server is down. + } + }); + } + + return engine; +} diff --git a/triage_bot/lib/json.dart b/triage_bot/lib/json.dart new file mode 100644 index 000000000..60c7d56a5 --- /dev/null +++ b/triage_bot/lib/json.dart @@ -0,0 +1,257 @@ +// Copyright 2017 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. + +// The whole point of this file is to wrap dynamic calls in a pretense of type safety, so we use dynamic calls a lot. +// Also the code uses a lot of one-line flow control so we don't bother wrapping them all in blocks. +// ignore_for_file: avoid_dynamic_calls, curly_braces_in_flow_control_structures + +import 'dart:convert' as dart show json; +import 'package:meta/meta.dart'; + +@immutable +class Json { + factory Json(dynamic input) { + if (input is Json) + return Json._wrap(input._value); + return Json._wrap(input); + } + + factory Json.list(List input) { + return Json._raw(input.map(Json._wrap).toList()); + } + + // (This differs from "real" JSON in that we don't allow duplicate keys.) + factory Json.map(Map input) { + final Map values = {}; + input.forEach((dynamic key, dynamic value) { + final String name = key.toString(); + assert(!values.containsKey(name), 'Json.map keys must be unique strings'); + values[name] = Json._wrap(value); + }); + return Json._raw(values); + } + + factory Json.parse(String value) { + return Json(dart.json.decode(value)); + } + + const Json._raw(this._value); + + factory Json._wrap(dynamic value) { + if (value == null) + return const Json._raw(null); + if (value is num) + return Json._raw(value.toDouble()); + if (value is List) + return Json.list(value); + if (value is Map) + return Json.map(value); + if (value == true) + return const Json._raw(true); + if (value == false) + return const Json._raw(false); + if (value is Json) + return value; + return Json._raw(value.toString()); + } + + final dynamic _value; + + dynamic unwrap() { + if (_value is Map) + return toMap(); + if (_value is List) + return toList(); + return _value; + } + + bool get isMap => _value is Map; + bool get isList => _value is List; + bool get isScalar => _value == null || _value is num || _value is bool || _value is String; + Type get valueType => _value.runtimeType; + + Map toMap() { + final Map values = {}; + if (_value is Map) { + _value.forEach((String key, Json value) { + values[key] = value.unwrap(); + }); + } else if (_value is List) { + for (int index = 0; index < (_value as List).length; index += 1) + values[index.toString()] = _value[index].unwrap(); + } else { + values['0'] = unwrap(); + } + return values; + } + + List toList() { + if (_value is Map) + return (_value as Map).values.map((Json value) => value.unwrap()).toList(); + if (_value is List) + return (_value as List).map((Json value) => value.unwrap()).toList(); + return [unwrap()]; + } + + dynamic toScalar() { + assert(isScalar, 'toScalar called on non-scalar. Check "isScalar" first.'); + return _value; + } + + Iterable asIterable() { + if (_value is Map) + return (_value as Map).values.toList(); + if (_value is List) + return _value as List; + return const []; + } + + double toDouble() => _value as double; + + int toInt() => (_value as double).toInt(); + + bool toBoolean() => _value as bool; + + @override + String toString() => _value.toString(); + + String toJson() { + return dart.json.encode(unwrap()); + } + + dynamic operator [](dynamic key) { + return _value[key]; + } + + void operator []=(dynamic key, dynamic value) { + _value[key] = Json._wrap(value); + } + + bool hasKey(String key) { + return _value is Map && (_value as Map).containsKey(key); + } + + @override + dynamic noSuchMethod(Invocation invocation) { + if (invocation.isGetter) { + final String name = _symbolName(invocation.memberName); + if (_value is Map) { + if ((_value as Map).containsKey(name)) + return this[name]; + return const Json._raw(null); + } + } + if (invocation.isSetter) + return this[_symbolName(invocation.memberName, stripEquals: true)] = invocation.positionalArguments[0]; + return super.noSuchMethod(invocation); + } + + // Workaround for https://github.com/dart-lang/sdk/issues/28372 + String _symbolName(Symbol symbol, { bool stripEquals = false }) { + // WARNING: Assumes a fixed format for Symbol.toString which is *not* + // guaranteed anywhere. + final String s = '$symbol'; + return s.substring(8, s.length - (2 + (stripEquals ? 1 : 0))); + } + + bool operator <(Object other) { + if (other is Json) + return _value < other._value as bool; + return _value < other as bool; + } + + bool operator <=(Object other) { + if (other is Json) + return _value <= other._value as bool; + return _value <= other as bool; + } + + bool operator >(Object other) { + if (other is Json) + return _value > other._value as bool; + return _value > other as bool; + } + + bool operator >=(Object other) { + if (other is Json) + return _value >= other._value as bool; + return _value >= other as bool; + } + + dynamic operator -(Object other) { + if (other is Json) + return _value - other._value; + return _value - other; + } + + dynamic operator +(Object other) { + if (other is Json) + return _value + other._value; + return _value + other; + } + + dynamic operator /(Object other) { + if (other is Json) + return _value / other._value; + return _value / other; + } + + dynamic operator ~/(Object other) { + if (other is Json) + return _value ~/ other._value; + return _value ~/ other; + } + + dynamic operator *(Object other) { + if (other is Json) + return _value * other._value; + return _value * other; + } + + dynamic operator %(Object other) { + if (other is Json) + return _value % other._value; + return _value % other; + } + + dynamic operator |(Object other) { + if (other is Json) + return _value.toInt() | other._value.toInt(); + return _value.toInt() | other; + } + + dynamic operator ^(Object other) { + if (other is Json) + return _value.toInt() ^ other._value.toInt(); + return _value.toInt() ^ other; + } + + dynamic operator &(Object other) { + if (other is Json) + return _value.toInt() & other._value.toInt(); + return _value.toInt() & other; + } + + dynamic operator <<(Object other) { + if (other is Json) + return _value.toInt() << other._value.toInt(); + return _value.toInt() << other; + } + + dynamic operator >>(Object other) { + if (other is Json) + return _value.toInt() >> other._value.toInt(); + return _value.toInt() >> other; + } + + @override + bool operator ==(Object other) { + if (other is Json) + return _value == other._value; + return _value == other; + } + + @override + int get hashCode => _value.hashCode; +} diff --git a/triage_bot/lib/utils.dart b/triage_bot/lib/utils.dart new file mode 100644 index 000000000..cc439c1c3 --- /dev/null +++ b/triage_bot/lib/utils.dart @@ -0,0 +1,7 @@ +// 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. + +String hex(int byte) => byte.toRadixString(16).padLeft(2, '0'); + +String s(int n) => n == 1 ? '' : 's'; diff --git a/triage_bot/pubspec.yaml b/triage_bot/pubspec.yaml new file mode 100644 index 000000000..bf6436417 --- /dev/null +++ b/triage_bot/pubspec.yaml @@ -0,0 +1,21 @@ +name: triage_bot +description: Flutter's triage bot. +version: 1.0.0 +repository: https://github.com/flutter/cocoon/ +publish_to: 'none' + +environment: + sdk: ^3.0.0 + +dependencies: + appengine: ^0.13.5 + crypto: ^3.0.3 + dart_jsonwebtoken: ^2.8.1 + github: ^9.14.0 + googleapis: ^11.2.0 + http: ^0.13.6 + meta: ^1.9.1 + nyxx: ^5.0.4 + +dev_dependencies: + test: ^1.21.0 diff --git a/triage_bot/test/bytes_test.dart b/triage_bot/test/bytes_test.dart new file mode 100644 index 000000000..fd5a9c281 --- /dev/null +++ b/triage_bot/test/bytes_test.dart @@ -0,0 +1,78 @@ +// 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:test/test.dart'; +import 'package:triage_bot/bytes.dart'; + +void main() { + test('roundtrip null', () { + final FileWriter writer = FileWriter(); + writer.writeNullOr(null, writer.writeBool); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readNullOr(reader.readBool), isNull); + reader.close(); + }); + + test('roundtrip true', () { + final FileWriter writer = FileWriter(); + writer.writeNullOr(true, writer.writeBool); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readNullOr(reader.readBool), isTrue); + reader.close(); + }); + + test('roundtrip false', () { + final FileWriter writer = FileWriter(); + writer.writeNullOr(false, writer.writeBool); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readNullOr(reader.readBool), isFalse); + reader.close(); + }); + + test('roundtrip integer', () { + final FileWriter writer = FileWriter(); + writer.writeInt(12345); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readInt(), 12345); + reader.close(); + }); + + test('roundtrip String', () { + final FileWriter writer = FileWriter(); + writer.writeString(''); + writer.writeString('abc'); + writer.writeString(String.fromCharCode(0)); + writer.writeString('🤷🏿'); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readString(), ''); + expect(reader.readString(), 'abc'); + expect(reader.readString(), '\x00'); + expect(reader.readString(), '🤷🏿'); + reader.close(); + }); + + test('roundtrip DateTime', () { + final FileWriter writer = FileWriter(); + writer.writeDateTime(DateTime.utc(2023, 6, 23, 15, 45)); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readDateTime().toIso8601String(), '2023-06-23T15:45:00.000Z'); + reader.close(); + }); + + test('roundtrip Set', () { + final FileWriter writer = FileWriter(); + writer.writeSet(writer.writeString, {'a', 'b', 'c'}); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readSet(reader.readString), {'c', 'b', 'a'}); + reader.close(); + }); + + test('roundtrip Map', () { + final FileWriter writer = FileWriter(); + writer.writeMap(writer.writeString, writer.writeInt, {'a': 1, 'b': 2, 'c': 3}); + final FileReader reader = FileReader(writer.serialize()); + expect(reader.readMap(reader.readString, reader.readInt), {'c': 3, 'b': 2, 'a': 1}); + reader.close(); + }); +} diff --git a/triage_bot/test/discord_test.dart b/triage_bot/test/discord_test.dart new file mode 100644 index 000000000..f8a15ef37 --- /dev/null +++ b/triage_bot/test/discord_test.dart @@ -0,0 +1,49 @@ +// 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:test/test.dart'; +import 'package:triage_bot/discord.dart'; + +void main() { + // copied from https://github.com/flutter/engine/pull/43163 + const String prText = ''' +*Replace this paragraph with a description of what this PR is changing or adding, and why. Consider including before/after screenshots.* + +*List which issues are fixed by this PR. You must list at least one issue.* + +*If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].* + +## Pre-launch Checklist + +- [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. +- [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. +- [ ] I read and followed the [Flutter Style Guide] and the [C++, Objective-C, Java style guides]. +- [ ] I listed at least one issue that this PR fixes in the description above. +- [ ] I added new tests to check the change I am making or feature I am adding, or Hixie said the PR is test-exempt. See [testing the engine] for instructions on writing and running engine tests. +- [ ] I updated/added relevant documentation (doc comments with `///`). +- [ ] I signed the [CLA]. +- [ ] All existing and new tests are passing. + +If you need help, consider asking for advice on the #hackers-new channel on [Discord]. + + +[Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview +[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene +[Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo +[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style +[testing the engine]: https://github.com/flutter/flutter/wiki/Testing-the-engine +[CLA]: https://cla.developers.google.com/ +[flutter/tests]: https://github.com/flutter/tests +[breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes +[Discord]: https://github.com/flutter/flutter/wiki/Chat +'''; + + test('hex', () { + expect(stripBoilerplate(prText), ''); + }); + + test('hex', () { + expect(stripBoilerplate('hello $prText'), 'hello'); + }); +} diff --git a/triage_bot/test/json_test.dart b/triage_bot/test/json_test.dart new file mode 100644 index 000000000..98e726c97 --- /dev/null +++ b/triage_bot/test/json_test.dart @@ -0,0 +1,21 @@ +// 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:test/test.dart'; +import 'package:triage_bot/json.dart'; + +void main() { + test('json', () { + expect(Json.parse('null').toScalar(), null); + expect(Json.parse('1.0').toScalar() is double, isTrue); + expect(Json.parse('1.0').toScalar(), 1.0); + expect(Json.parse('2').toScalar() is double, isTrue); + expect(Json.parse('2').toScalar(), 2.0); + expect(Json.parse('true').toScalar(), true); + expect(Json.parse('false').toScalar(), false); + expect(Json.parse('[1, 2, 3]').toList(), [1.0, 2.0, 3.0]); + expect(Json.parse('{"1": 2, "3": 4}').toMap(), {'1': 2.0, '3': 4.0}); + expect((Json.parse('{"a": {"b": {"c": "d"}}}') as dynamic).a.b.c.toString(), 'd'); + }); +} diff --git a/triage_bot/test/utils_test.dart b/triage_bot/test/utils_test.dart new file mode 100644 index 000000000..b6856d673 --- /dev/null +++ b/triage_bot/test/utils_test.dart @@ -0,0 +1,26 @@ +// 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:test/test.dart'; +import 'package:triage_bot/utils.dart'; + +void main() { + test('hex', () { + expect(hex(-1), '-1'); + expect(hex(0), '00'); + expect(hex(1), '01'); + expect(hex(15), '0f'); + expect(hex(16), '10'); + expect(hex(256), '100'); + }); + + test('s', () { + expect(s(-1), 's'); + expect(s(0), 's'); + expect(s(1), ''); + expect(s(15), 's'); + expect(s(16), 's'); + expect(s(256), 's'); + }); +} From 3ec1a413f79e622d886132fdeefbaa5aa711eae1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 22:59:08 +0000 Subject: [PATCH 49/49] Bump @types/node from 20.10.0 to 20.10.1 in /gh_actions/third_party/no-response (#3301) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.10.0 to 20.10.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.10.0&new-version=20.10.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--- .../third_party/no-response/package-lock.json | 14 +++++++------- gh_actions/third_party/no-response/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index ceb94e572..92de93180 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.10", - "@types/node": "^20.10.0", + "@types/node": "^20.10.1", "@typescript-eslint/parser": "^6.13.1", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "version": "20.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", + "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8504,9 +8504,9 @@ "dev": true }, "@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "version": "20.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", + "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", "dev": true, "requires": { "undici-types": "~5.26.4" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 5a694c09a..5e2bf9ef8 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.1", "@types/jest": "^29.5.10", - "@types/node": "^20.10.0", + "@types/node": "^20.10.1", "@typescript-eslint/parser": "^6.13.1", "@vercel/ncc": "^0.38.1", "eslint": "^8.54.0",