Skip to content

Commit 1267216

Browse files
committed
Merge branch 'master' into misc/minor-memory-index-cleanup
2 parents 534548f + 4e88f02 commit 1267216

File tree

74 files changed

+714
-302
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+714
-302
lines changed

analysis_options.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ linter:
5252
- prefer_conditional_assignment
5353
- prefer_contains
5454
- prefer_final_fields
55+
- prefer_final_in_for_each
5556
- prefer_final_locals
5657
- prefer_for_elements_to_map_fromIterable
5758
- prefer_generic_function_type_aliases
@@ -72,6 +73,7 @@ linter:
7273
- unnecessary_brace_in_string_interps
7374
- unnecessary_const
7475
- unnecessary_getters_setters
76+
- unnecessary_late
7577
- unnecessary_library_name
7678
- unnecessary_library_directive
7779
- unnecessary_new

app/lib/account/backend.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class AccountBackend {
241241
/// Uses in-memory cache to store entries locally for up to 10 minutes.
242242
Future<List<String?>> getEmailsOfUserIds(List<String> userIds) async {
243243
final result = <String?>[];
244-
for (String userId in userIds) {
244+
for (final userId in userIds) {
245245
result.add(await getEmailOfUserId(userId));
246246
}
247247
return result;

app/lib/account/consent_backend.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class ConsentBackend {
6161
final c = await _lookupAndCheck(consentId, user);
6262
final action = _actions[c.kind]!;
6363
final fromAgent = c.fromAgent!;
64-
late String invitingUserEmail;
64+
final String invitingUserEmail;
6565
if (looksLikeUserId(fromAgent)) {
6666
invitingUserEmail = (await accountBackend.getEmailOfUserId(fromAgent))!;
6767
} else {
@@ -231,7 +231,7 @@ class ConsentBackend {
231231
Future<void> deleteObsoleteConsents() async {
232232
final query = _db.query<Consent>()
233233
..filter('expires <', clock.now().toUtc());
234-
await for (var entry in query.run()) {
234+
await for (final entry in query.run()) {
235235
try {
236236
await _delete(entry, (a) => a.onExpire(entry));
237237
} catch (e) {

app/lib/account/models.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class User extends db.ExpandoModel<String> {
7575
}
7676

7777
late final isVisible = !isBlocked && !isModerated && !isDeleted;
78-
late final isNotVisible = !isVisible;
78+
bool get isNotVisible => !isVisible;
7979

8080
void updateIsModerated({
8181
required bool isModerated,

app/lib/account/session_cookie.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,5 @@ class ClientSessionCookieStatus {
101101
required this.isStrict,
102102
});
103103

104-
late final isPresent = sessionId != null && sessionId!.isNotEmpty;
104+
bool get isPresent => sessionId?.isNotEmpty ?? false;
105105
}

app/lib/admin/actions/actions.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ import 'moderation_case_list.dart';
1818
import 'moderation_case_resolve.dart';
1919
import 'moderation_case_update.dart';
2020
import 'moderation_transparency_metrics.dart';
21+
import 'package_discontinue.dart';
2122
import 'package_info.dart';
23+
import 'package_latest_update.dart';
2224
import 'package_reservation_create.dart';
2325
import 'package_reservation_delete.dart';
2426
import 'package_reservation_list.dart';
@@ -102,7 +104,9 @@ final class AdminAction {
102104
moderationCaseResolve,
103105
moderationCaseUpdate,
104106
moderationTransparencyMetrics,
107+
packageDiscontinue,
105108
packageInfo,
109+
packageLatestUpdate,
106110
packageReservationCreate,
107111
packageReservationDelete,
108112
packageReservationList,
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:clock/clock.dart';
6+
import 'package:pub_dev/package/backend.dart';
7+
import 'package:pub_dev/package/models.dart';
8+
import 'package:pub_dev/shared/datastore.dart';
9+
10+
import 'actions.dart';
11+
12+
final packageDiscontinue = AdminAction(
13+
name: 'package-discontinue',
14+
summary: 'Sets the package discontinued.',
15+
description: '''
16+
Sets the `Package.isDiscontinued` and `Package.replacedBy` properties.
17+
''',
18+
options: {
19+
'package': 'The package to be discontinued.',
20+
'value': 'The value to set (defaults to true).',
21+
'replaced-by':
22+
'The Package.replacedBy field (if not set will be set to `null`).',
23+
},
24+
invoke: (options) async {
25+
final package = options['package'];
26+
InvalidInputException.check(
27+
package != null && package.isNotEmpty,
28+
'`package` must be given',
29+
);
30+
final value = options['value'] ?? 'true';
31+
InvalidInputException.checkAnyOf(value, 'value', ['true', 'false']);
32+
final valueToSet = value == 'true';
33+
34+
final p = await packageBackend.lookupPackage(package!);
35+
if (p == null) {
36+
throw NotFoundException.resource(package);
37+
}
38+
39+
final replacedBy = options['replaced-by'];
40+
if (replacedBy != null) {
41+
final rp = await packageBackend.lookupPackage(replacedBy);
42+
if (rp == null) {
43+
throw NotFoundException('Replacing package "$replacedBy" not found.');
44+
}
45+
}
46+
47+
final info = await withRetryTransaction(dbService, (tx) async {
48+
final pkg = await tx.lookupOrNull<Package>(p.key);
49+
if (pkg == null) {
50+
throw NotFoundException.resource(package);
51+
}
52+
pkg.isDiscontinued = valueToSet;
53+
pkg.replacedBy = valueToSet ? replacedBy : null;
54+
pkg.updated = clock.now().toUtc();
55+
tx.insert(pkg);
56+
return pkg;
57+
});
58+
59+
return {
60+
'package': {
61+
'name': info.name,
62+
'isDiscontinued': info.isDiscontinued,
63+
'replacedBy': info.replacedBy,
64+
},
65+
};
66+
},
67+
);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:pub_dev/package/backend.dart';
6+
7+
import 'actions.dart';
8+
9+
final packageLatestUpdate = AdminAction(
10+
name: 'package-latest-update',
11+
summary: 'Updates the latest version of a package or all packages.',
12+
description: '''
13+
Ensures Package.latestVersion / latestPreviewVersion / latestPrereleaseVersion is up-to-date.
14+
15+
When no package is specified, all packages will be updated.
16+
''',
17+
options: {
18+
'package': 'The package to be updated (optional).',
19+
'concurrency':
20+
'The concurrently running update operations (defaults to 10).',
21+
},
22+
invoke: (options) async {
23+
final package = options['package'];
24+
final concurrency = int.parse(options['concurrency'] ?? '10');
25+
26+
if (package != null) {
27+
final updated = await packageBackend.updatePackageVersions(package);
28+
return {
29+
'updated': updated,
30+
};
31+
} else {
32+
final stat = await packageBackend.updateAllPackageVersions(
33+
concurrency: concurrency);
34+
return {
35+
'updatedCount': stat,
36+
};
37+
}
38+
},
39+
);

app/lib/admin/backend.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,11 @@ import 'tools/delete_all_staging.dart';
4444
import 'tools/list_package_blocked.dart';
4545
import 'tools/list_tools.dart';
4646
import 'tools/notify_service.dart';
47-
import 'tools/package_discontinued.dart';
4847
import 'tools/package_publisher.dart';
4948
import 'tools/publisher_member.dart';
5049
import 'tools/recent_uploaders.dart';
5150
import 'tools/set_package_blocked.dart';
5251
import 'tools/set_user_blocked.dart';
53-
import 'tools/update_package_versions.dart';
5452
import 'tools/user_merger.dart';
5553

5654
final _logger = Logger('pub.admin.backend');
@@ -69,9 +67,7 @@ final Map<String, Tool> availableTools = {
6967
'delete-all-staging': executeDeleteAllStaging,
7068
'list-package-blocked': executeListPackageBlocked,
7169
'notify-service': executeNotifyService,
72-
'package-discontinued': executeSetPackageDiscontinued,
7370
'package-publisher': executeSetPackagePublisher,
74-
'update-package-versions': executeUpdatePackageVersions,
7571
'recent-uploaders': executeRecentUploaders,
7672
'publisher-member': executePublisherMember,
7773
'publisher-invite-member': executePublisherInviteMember,

app/lib/admin/tools/delete_all_staging.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Future<void> _batchedQuery<T extends Model>(
9292
budget = _defaultBudget;
9393
}
9494

95-
await for (Model m in query.run()) {
95+
await for (final m in query.run()) {
9696
final size = _estimateSize(m);
9797
if (size * 4 >= _defaultBudget) {
9898
flush();

0 commit comments

Comments
 (0)