diff --git a/CHANGELOG.md b/CHANGELOG.md index a17eabcb45..67be0f2886 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Important changes to data models, configuration, and migrations between each AppEngine version, listed here to ease deployment and troubleshooting. ## Next Release (replace with git tag when deployed) + * Note: new `Package.publishingConfig` field in Datastore, new `PUT /api/packages//publishing` endpoint. * Note: Reverted public `cache-control` headers except for `/documentation/` pages. ## `20251023t081900-all` diff --git a/app/lib/frontend/handlers/pubapi.client.dart b/app/lib/frontend/handlers/pubapi.client.dart index e0be64d64e..fde241e21d 100644 --- a/app/lib/frontend/handlers/pubapi.client.dart +++ b/app/lib/frontend/handlers/pubapi.client.dart @@ -394,11 +394,11 @@ class PubApiClient { ); } - Future<_i3.AutomatedPublishingConfig> setAutomatedPublishing( + Future<_i3.PkgPublishingConfig> setAutomatedPublishing( String package, - _i3.AutomatedPublishingConfig payload, + _i3.PkgPublishingConfig payload, ) async { - return _i3.AutomatedPublishingConfig.fromJson( + return _i3.PkgPublishingConfig.fromJson( await _client.requestJson( verb: 'put', path: '/api/packages/$package/automated-publishing', @@ -408,6 +408,20 @@ class PubApiClient { ); } + Future<_i3.PkgPublishingConfig> setPackagePublishing( + String package, + _i3.PkgPublishingConfig payload, + ) async { + return _i3.PkgPublishingConfig.fromJson( + await _client.requestJson( + verb: 'put', + path: '/api/packages/$package/publishing', + + body: payload.toJson(), + ), + ); + } + Future<_i3.VersionOptions> getVersionOptions( String package, String version, diff --git a/app/lib/frontend/handlers/pubapi.dart b/app/lib/frontend/handlers/pubapi.dart index c9ecd00402..fa832faeac 100644 --- a/app/lib/frontend/handlers/pubapi.dart +++ b/app/lib/frontend/handlers/pubapi.dart @@ -402,10 +402,17 @@ class PubApi { ) => putPackageOptionsHandler(request, package, body); @EndPoint.put('/api/packages//automated-publishing') - Future setAutomatedPublishing( + Future setAutomatedPublishing( Request request, String package, - AutomatedPublishingConfig body, + PkgPublishingConfig body, + ) => packageBackend.setAutomatedPublishing(package, body); + + @EndPoint.put('/api/packages//publishing') + Future setPackagePublishing( + Request request, + String package, + PkgPublishingConfig body, ) => packageBackend.setAutomatedPublishing(package, body); @EndPoint.get('/api/packages//versions//options') diff --git a/app/lib/frontend/handlers/pubapi.g.dart b/app/lib/frontend/handlers/pubapi.g.dart index 122bda0cb5..b0b0e7bc87 100644 --- a/app/lib/frontend/handlers/pubapi.g.dart +++ b/app/lib/frontend/handlers/pubapi.g.dart @@ -595,9 +595,29 @@ Router _$PubApiRouter(PubApi service) { final _$result = await service.setAutomatedPublishing( request, package, - await $utilities.decodeJson( + await $utilities.decodeJson( request, - (o) => AutomatedPublishingConfig.fromJson(o), + (o) => PkgPublishingConfig.fromJson(o), + ), + ); + return $utilities.jsonResponse(_$result.toJson()); + } on ApiResponseException catch (e) { + return e.asApiResponse(); + } catch (e, st) { + return $utilities.unhandledError(e, st); + } + }); + router.add('PUT', r'/api/packages//publishing', ( + Request request, + String package, + ) async { + try { + final _$result = await service.setPackagePublishing( + request, + package, + await $utilities.decodeJson( + request, + (o) => PkgPublishingConfig.fromJson(o), ), ); return $utilities.jsonResponse(_$result.toJson()); diff --git a/app/lib/frontend/templates/views/pkg/admin_page.dart b/app/lib/frontend/templates/views/pkg/admin_page.dart index 5eb1324272..7765c8fb94 100644 --- a/app/lib/frontend/templates/views/pkg/admin_page.dart +++ b/app/lib/frontend/templates/views/pkg/admin_page.dart @@ -314,8 +314,8 @@ d.Node packageAdminPageNode({ } d.Node _automatedPublishing(Package package) { - final github = package.automatedPublishing?.githubConfig; - final gcp = package.automatedPublishing?.gcpConfig; + final github = package.publishingConfig?.githubConfig; + final gcp = package.publishingConfig?.gcpConfig; final isGitHubEnabled = github?.isEnabled ?? false; return d.fragment([ d.a(name: 'automated-publishing'), @@ -469,7 +469,7 @@ d.Node _automatedPublishing(Package package) { } d.Node _manualPublishing(Package package) { - final manual = package.automatedPublishing?.manualConfig; + final manual = package.publishingConfig?.manualConfig; return d.fragment([ d.a(name: 'manual-publishing'), d.h3(text: 'Manual publishing'), diff --git a/app/lib/package/backend.dart b/app/lib/package/backend.dart index 6943c0f897..421115320f 100644 --- a/app/lib/package/backend.dart +++ b/app/lib/package/backend.dart @@ -624,9 +624,9 @@ class PackageBackend { /// Verifies an update to the credential-less publishing settings and /// updates the Datastore entity if everything is valid. - Future setAutomatedPublishing( + Future setAutomatedPublishing( String package, - api.AutomatedPublishingConfig body, + api.PkgPublishingConfig body, ) async { final authenticatedUser = await requireAuthenticatedWebUser(); final user = authenticatedUser.user; @@ -714,30 +714,30 @@ class PackageBackend { } // update lock - final current = p.automatedPublishing; + final current = p.publishingConfig; final githubChanged = (githubConfig?.isEnabled != current?.githubConfig?.isEnabled) || (githubConfig?.repository != current?.githubConfig?.repository); if (githubChanged) { - p.automatedPublishing?.githubLock = null; + p.publishingConfig?.githubLock = null; } final gcpChanged = (gcpConfig?.isEnabled != current?.gcpConfig?.isEnabled) || (gcpConfig?.serviceAccountEmail != current?.gcpConfig?.serviceAccountEmail); if (gcpChanged) { - p.automatedPublishing?.gcpLock = null; + p.publishingConfig?.gcpLock = null; } // finalize changes - final automatedPublishing = p.automatedPublishing ??= - AutomatedPublishing(); - automatedPublishing.githubConfig = - githubConfig ?? automatedPublishing.githubConfig; - automatedPublishing.gcpConfig = - gcpConfig ?? automatedPublishing.gcpConfig; - automatedPublishing.manualConfig = - manualConfig ?? automatedPublishing.manualConfig; + final publishingConfig = p.publishingConfig ?? PublishingConfig(); + p.automatedPublishing = publishingConfig; + p.newPublishingConfig = publishingConfig; + publishingConfig.githubConfig = + githubConfig ?? publishingConfig.githubConfig; + publishingConfig.gcpConfig = gcpConfig ?? publishingConfig.gcpConfig; + publishingConfig.manualConfig = + manualConfig ?? publishingConfig.manualConfig; p.updated = clock.now().toUtc(); tx.insert(p); @@ -748,10 +748,10 @@ class PackageBackend { user: user, ), ); - return api.AutomatedPublishingConfig( - github: p.automatedPublishing!.githubConfig, - gcp: p.automatedPublishing!.gcpConfig, - manual: p.automatedPublishing!.manualConfig, + return api.PkgPublishingConfig( + github: p.publishingConfig!.githubConfig, + gcp: p.publishingConfig!.gcpConfig, + manual: p.publishingConfig!.manualConfig, ); }); } @@ -1617,7 +1617,7 @@ class PackageBackend { if (agent is AuthenticatedUser && await packageBackend.isPackageAdmin(package, agent.user.userId)) { final isEnabled = - package.automatedPublishing?.manualConfig?.isEnabled ?? true; + package.publishingConfig?.manualConfig?.isEnabled ?? true; if (!isEnabled) { throw AuthorizationException.manualPublishingDisabled(package.name!); } @@ -1647,8 +1647,8 @@ class PackageBackend { Package package, String newVersion, ) async { - final githubConfig = package.automatedPublishing?.githubConfig; - final githubLock = package.automatedPublishing?.githubLock; + final githubConfig = package.publishingConfig?.githubConfig; + final githubLock = package.publishingConfig?.githubLock; if (githubConfig?.isEnabled != true) { throw AuthorizationException.githubActionIssue( @@ -1722,7 +1722,7 @@ class PackageBackend { ); await withRetryTransaction(db, (tx) async { final p = await tx.lookupValue(package.key); - p.automatedPublishing!.githubConfig!.isEnabled = false; + p.publishingConfig!.githubConfig!.isEnabled = false; tx.insert(p); }); throw AuthorizationException.githubActionIssue( @@ -1737,8 +1737,8 @@ class PackageBackend { Package package, String newVersion, ) async { - final gcpConfig = package.automatedPublishing?.gcpConfig; - final gcpLock = package.automatedPublishing?.gcpLock; + final gcpConfig = package.publishingConfig?.gcpConfig; + final gcpLock = package.publishingConfig?.gcpLock; if (gcpConfig?.isEnabled != true) { throw AuthorizationException.serviceAccountPublishingIssue( 'publishing with service account is not enabled', @@ -1766,7 +1766,7 @@ class PackageBackend { ); await withRetryTransaction(db, (tx) async { final p = await tx.lookupValue(package.key); - p.automatedPublishing!.gcpConfig!.isEnabled = false; + p.publishingConfig!.gcpConfig!.isEnabled = false; tx.insert(p); }); throw AuthorizationException.githubActionIssue( @@ -2008,7 +2008,7 @@ class PackageBackend { Package package, AuthenticatedAgent agent, ) { - final current = package.automatedPublishing; + final current = package.publishingConfig; if (current == null) { if (agent is AuthenticatedGitHubAction || agent is AuthenticatedGcpServiceAccount) { diff --git a/app/lib/package/models.dart b/app/lib/package/models.dart index d835998904..31f8426903 100644 --- a/app/lib/package/models.dart +++ b/app/lib/package/models.dart @@ -149,9 +149,15 @@ class Package extends db.ExpandoModel { @db.StringListProperty() List? deletedVersions; - /// Scheduling state for all versions of this package. - @AutomatedPublishingProperty() - AutomatedPublishing? automatedPublishing; + /// The configuration for automated and manual publishing. + @PublishingConfigProperty() + PublishingConfig? automatedPublishing; + + @PublishingConfigProperty(propertyName: 'publishingConfig') + PublishingConfig? newPublishingConfig; + + PublishingConfig? get publishingConfig => + newPublishingConfig ?? automatedPublishing; /// The latest point in time at which a security advisory that affects this /// package has been synchronized into pub. @@ -455,14 +461,14 @@ class Release { } @JsonSerializable(explicitToJson: true, includeIfNull: false) -class AutomatedPublishing { +class PublishingConfig { GitHubPublishingConfig? githubConfig; GitHubPublishingLock? githubLock; GcpPublishingConfig? gcpConfig; GcpPublishingLock? gcpLock; ManualPublishingConfig? manualConfig; - AutomatedPublishing({ + PublishingConfig({ this.githubConfig, this.githubLock, this.gcpConfig, @@ -470,18 +476,16 @@ class AutomatedPublishing { this.manualConfig, }); - factory AutomatedPublishing.fromJson(Map json) => - _$AutomatedPublishingFromJson(json); + factory PublishingConfig.fromJson(Map json) => + _$PublishingConfigFromJson(json); - Map toJson() => _$AutomatedPublishingToJson(this); + Map toJson() => _$PublishingConfigToJson(this); } -/// A [db.Property] encoding [AutomatedPublishing] as JSON. -class AutomatedPublishingProperty extends db.Property { - const AutomatedPublishingProperty({ - super.propertyName, - super.required = false, - }) : super(indexed: false); +/// A [db.Property] encoding [PublishingConfig] as JSON. +class PublishingConfigProperty extends db.Property { + const PublishingConfigProperty({super.propertyName, super.required = false}) + : super(indexed: false); @override Object? encodeValue( @@ -490,13 +494,13 @@ class AutomatedPublishingProperty extends db.Property { bool forComparison = false, }) { if (value == null) return null; - return json.encode(value as AutomatedPublishing); + return json.encode(value as PublishingConfig); } @override Object? decodePrimitiveValue(db.ModelDB mdb, Object? value) { if (value == null) return null; - return AutomatedPublishing.fromJson( + return PublishingConfig.fromJson( json.decode(value as String) as Map, ); } @@ -504,7 +508,7 @@ class AutomatedPublishingProperty extends db.Property { @override bool validate(db.ModelDB mdb, Object? value) => super.validate(mdb, value) && - (value == null || value is AutomatedPublishing); + (value == null || value is PublishingConfig); } @JsonSerializable(explicitToJson: true, includeIfNull: false) diff --git a/app/lib/package/models.g.dart b/app/lib/package/models.g.dart index 15c3103151..754124e2d4 100644 --- a/app/lib/package/models.g.dart +++ b/app/lib/package/models.g.dart @@ -34,8 +34,8 @@ Map _$ReleaseToJson(Release instance) => { 'published': instance.published.toIso8601String(), }; -AutomatedPublishing _$AutomatedPublishingFromJson(Map json) => - AutomatedPublishing( +PublishingConfig _$PublishingConfigFromJson(Map json) => + PublishingConfig( githubConfig: json['githubConfig'] == null ? null : GitHubPublishingConfig.fromJson( @@ -61,15 +61,14 @@ AutomatedPublishing _$AutomatedPublishingFromJson(Map json) => ), ); -Map _$AutomatedPublishingToJson( - AutomatedPublishing instance, -) => { - 'githubConfig': ?instance.githubConfig?.toJson(), - 'githubLock': ?instance.githubLock?.toJson(), - 'gcpConfig': ?instance.gcpConfig?.toJson(), - 'gcpLock': ?instance.gcpLock?.toJson(), - 'manualConfig': ?instance.manualConfig?.toJson(), -}; +Map _$PublishingConfigToJson(PublishingConfig instance) => + { + 'githubConfig': ?instance.githubConfig?.toJson(), + 'githubLock': ?instance.githubLock?.toJson(), + 'gcpConfig': ?instance.gcpConfig?.toJson(), + 'gcpLock': ?instance.gcpLock?.toJson(), + 'manualConfig': ?instance.manualConfig?.toJson(), + }; GitHubPublishingLock _$GitHubPublishingLockFromJson( Map json, diff --git a/app/lib/tool/backfill/backfill_new_fields.dart b/app/lib/tool/backfill/backfill_new_fields.dart index f23d87b3ea..a9d6753973 100644 --- a/app/lib/tool/backfill/backfill_new_fields.dart +++ b/app/lib/tool/backfill/backfill_new_fields.dart @@ -3,6 +3,8 @@ // BSD-style license that can be found in the LICENSE file. import 'package:logging/logging.dart'; +import 'package:pub_dev/package/models.dart'; +import 'package:pub_dev/shared/datastore.dart'; final _logger = Logger('backfill_new_fields'); @@ -12,5 +14,14 @@ final _logger = Logger('backfill_new_fields'); /// CHANGELOG.md must be updated with the new fields, and the next /// release could remove the backfill from here. Future backfillNewFields() async { - _logger.info('Nothing to backfill.'); + _logger.info('Backfill new Package.publishingConfig.'); + await for (final p in dbService.query().run()) { + if (p.automatedPublishing != null && p.newPublishingConfig == null) { + await withRetryTransaction(dbService, (tx) async { + final pkg = await tx.lookupValue(p.key); + pkg.newPublishingConfig = pkg.automatedPublishing; + tx.insert(pkg); + }); + } + } } diff --git a/app/test/package/automated_publishing_test.dart b/app/test/package/automated_publishing_test.dart index 69aa9b973d..955aa2afab 100644 --- a/app/test/package/automated_publishing_test.dart +++ b/app/test/package/automated_publishing_test.dart @@ -17,7 +17,7 @@ void main() { group('Update value through API', () { setupTestsWithCallerAuthorizationIssues( (client) => - client.setAutomatedPublishing('oxygen', AutomatedPublishingConfig()), + client.setAutomatedPublishing('oxygen', PkgPublishingConfig()), ); testWithProfile( @@ -29,7 +29,7 @@ void main() { await expectApiException( client.setAutomatedPublishing( 'no_such_package', - AutomatedPublishingConfig(), + PkgPublishingConfig(), ), status: 404, code: 'NotFound', @@ -44,7 +44,7 @@ void main() { email: userAtPubDevEmail, ); await expectApiException( - client.setAutomatedPublishing('oxygen', AutomatedPublishingConfig()), + client.setAutomatedPublishing('oxygen', PkgPublishingConfig()), status: 403, code: 'InsufficientPermissions', message: @@ -61,7 +61,7 @@ void main() { ); final rs = await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'dart-lang/pub-dev', @@ -81,10 +81,10 @@ void main() { }); final p = await packageBackend.lookupPackage('oxygen'); expect( - p!.automatedPublishing!.githubConfig!.toJson(), + p!.publishingConfig!.githubConfig!.toJson(), rs.github!.toJson(), ); - expect(p.automatedPublishing!.gcpConfig, isNull); + expect(p.publishingConfig!.gcpConfig, isNull); final audits = await auditBackend.listRecordsForPackage('oxygen'); // check audit log record exists final record = audits.records.firstWhere( @@ -107,7 +107,7 @@ void main() { ); final rs = await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( gcp: GcpPublishingConfig( isEnabled: true, serviceAccountEmail: 'project-id@cloudbuild.gserviceaccount.com', @@ -121,8 +121,8 @@ void main() { }, }); final p = await packageBackend.lookupPackage('oxygen'); - expect(p!.automatedPublishing!.gcpConfig!.toJson(), rs.gcp!.toJson()); - expect(p.automatedPublishing!.githubConfig, isNull); + expect(p!.publishingConfig!.gcpConfig!.toJson(), rs.gcp!.toJson()); + expect(p.publishingConfig!.githubConfig, isNull); final audits = await auditBackend.listRecordsForPackage('oxygen'); // check audit log record exists final record = audits.records.firstWhere( @@ -147,7 +147,7 @@ void main() { for (final repository in badPaths) { final rs = client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: repository.isEmpty, repository: repository, @@ -180,7 +180,7 @@ void main() { for (final pattern in badPatterns) { final rs = client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'abcd/efgh', @@ -208,7 +208,7 @@ void main() { for (final pattern in badPatterns) { final rs = client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: false, repository: 'abcd/efgh', @@ -236,7 +236,7 @@ void main() { ); final rs = client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: false, repository: 'abcd/efgh', @@ -268,7 +268,7 @@ void main() { for (final value in badValues) { final rs = client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( gcp: GcpPublishingConfig( isEnabled: value.isEmpty, serviceAccountEmail: value, @@ -294,7 +294,7 @@ void main() { ); final rs = client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( gcp: GcpPublishingConfig( isEnabled: true, serviceAccountEmail: 'user@pub.dev', @@ -325,7 +325,7 @@ void main() { }) async { final rs = await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig(github: github, gcp: gcp, manual: manual), + PkgPublishingConfig(github: github, gcp: gcp, manual: manual), ); expect(rs.toJson(), expected); } diff --git a/app/test/package/upload_test.dart b/app/test/package/upload_test.dart index dbf1ec923f..a6eaed348b 100644 --- a/app/test/package/upload_test.dart +++ b/app/test/package/upload_test.dart @@ -290,7 +290,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( manual: ManualPublishingConfig(isEnabled: false), ), ); @@ -365,7 +365,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( gcp: GcpPublishingConfig( isEnabled: true, serviceAccountEmail: 'admin@x.gserviceaccount.com', @@ -401,7 +401,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( gcp: GcpPublishingConfig( isEnabled: true, serviceAccountEmail: 'admin@x.gserviceaccount.com', @@ -410,7 +410,7 @@ void main() { ); }); final pkg = await packageBackend.lookupPackage('oxygen'); - pkg!.automatedPublishing!.gcpLock = GcpPublishingLock( + pkg!.publishingConfig!.gcpLock = GcpPublishingLock( oauthUserId: 'other-user-id', ); await dbService.commit(inserts: [pkg]); @@ -433,7 +433,7 @@ void main() { ); final pkgAfter = await packageBackend.lookupPackage('oxygen'); - expect(pkgAfter!.automatedPublishing!.gcpConfig!.toJson(), { + expect(pkgAfter!.publishingConfig!.gcpConfig!.toJson(), { 'isEnabled': false, 'serviceAccountEmail': 'admin@x.gserviceaccount.com', }); @@ -448,7 +448,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( gcp: GcpPublishingConfig( isEnabled: true, serviceAccountEmail: 'admin@x.gserviceaccount.com', @@ -469,7 +469,7 @@ void main() { expect(rs.success.message, contains('Successfully uploaded')); final pkg = await packageBackend.lookupPackage('oxygen'); - expect(pkg!.automatedPublishing!.gcpLock!.toJson(), { + expect(pkg!.publishingConfig!.gcpLock!.toJson(), { 'oauthUserId': 'admin-x-gserviceaccount-com', }); }, @@ -532,7 +532,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -570,7 +570,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -608,7 +608,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -647,7 +647,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -686,7 +686,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -725,7 +725,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -735,7 +735,7 @@ void main() { ); }); final pkg = await packageBackend.lookupPackage('oxygen'); - pkg!.automatedPublishing!.githubLock = GitHubPublishingLock( + pkg!.publishingConfig!.githubLock = GitHubPublishingLock( repositoryOwnerId: 'x', repositoryId: 'y', ); @@ -774,7 +774,7 @@ void main() { 'GitHub repository identifiers changed, disabling automated publishing', ); final pkg = await packageBackend.lookupPackage('oxygen'); - expect(pkg!.automatedPublishing!.githubConfig!.toJson(), { + expect(pkg!.publishingConfig!.githubConfig!.toJson(), { 'isEnabled': false, 'repository': 'a/b', 'tagPattern': '{{version}}', @@ -794,7 +794,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -826,7 +826,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -868,7 +868,7 @@ void main() { ) async { await client.setAutomatedPublishing( '_dummy_pkg', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -893,7 +893,7 @@ void main() { expect(rs.success.message, contains('Successfully uploaded')); final pkg = await packageBackend.lookupPackage('_dummy_pkg'); - expect(pkg!.automatedPublishing!.githubLock!.toJson(), { + expect(pkg!.publishingConfig!.githubLock!.toJson(), { 'repositoryId': 'repo-id-1', 'repositoryOwnerId': 'owner-id-234', }); @@ -953,7 +953,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -994,7 +994,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', @@ -1036,7 +1036,7 @@ void main() { ) async { await client.setAutomatedPublishing( 'oxygen', - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: true, repository: 'a/b', diff --git a/pkg/_pub_shared/lib/data/package_api.dart b/pkg/_pub_shared/lib/data/package_api.dart index 1936cdab5f..1d40bcb372 100644 --- a/pkg/_pub_shared/lib/data/package_api.dart +++ b/pkg/_pub_shared/lib/data/package_api.dart @@ -41,19 +41,19 @@ class PkgOptions { Map toJson() => _$PkgOptionsToJson(this); } -/// The configuration for a package's credential-less publishing. +/// The configuration for a package's publishing. @JsonSerializable(includeIfNull: false, explicitToJson: true) -class AutomatedPublishingConfig { +class PkgPublishingConfig { final GitHubPublishingConfig? github; final GcpPublishingConfig? gcp; final ManualPublishingConfig? manual; - AutomatedPublishingConfig({this.github, this.gcp, this.manual}); + PkgPublishingConfig({this.github, this.gcp, this.manual}); - factory AutomatedPublishingConfig.fromJson(Map json) => - _$AutomatedPublishingConfigFromJson(json); + factory PkgPublishingConfig.fromJson(Map json) => + _$PkgPublishingConfigFromJson(json); - Map toJson() => _$AutomatedPublishingConfigToJson(this); + Map toJson() => _$PkgPublishingConfigToJson(this); } @JsonSerializable(includeIfNull: false, explicitToJson: true) diff --git a/pkg/_pub_shared/lib/data/package_api.g.dart b/pkg/_pub_shared/lib/data/package_api.g.dart index 9dac845b04..8d18301bbe 100644 --- a/pkg/_pub_shared/lib/data/package_api.g.dart +++ b/pkg/_pub_shared/lib/data/package_api.g.dart @@ -29,9 +29,9 @@ Map _$PkgOptionsToJson(PkgOptions instance) => 'isUnlisted': instance.isUnlisted, }; -AutomatedPublishingConfig _$AutomatedPublishingConfigFromJson( +PkgPublishingConfig _$PkgPublishingConfigFromJson( Map json, -) => AutomatedPublishingConfig( +) => PkgPublishingConfig( github: json['github'] == null ? null : GitHubPublishingConfig.fromJson(json['github'] as Map), @@ -43,8 +43,8 @@ AutomatedPublishingConfig _$AutomatedPublishingConfigFromJson( : ManualPublishingConfig.fromJson(json['manual'] as Map), ); -Map _$AutomatedPublishingConfigToJson( - AutomatedPublishingConfig instance, +Map _$PkgPublishingConfigToJson( + PkgPublishingConfig instance, ) => { 'github': ?instance.github?.toJson(), 'gcp': ?instance.gcp?.toJson(), diff --git a/pkg/_pub_shared/lib/src/pubapi.client.dart b/pkg/_pub_shared/lib/src/pubapi.client.dart index e0be64d64e..fde241e21d 100644 --- a/pkg/_pub_shared/lib/src/pubapi.client.dart +++ b/pkg/_pub_shared/lib/src/pubapi.client.dart @@ -394,11 +394,11 @@ class PubApiClient { ); } - Future<_i3.AutomatedPublishingConfig> setAutomatedPublishing( + Future<_i3.PkgPublishingConfig> setAutomatedPublishing( String package, - _i3.AutomatedPublishingConfig payload, + _i3.PkgPublishingConfig payload, ) async { - return _i3.AutomatedPublishingConfig.fromJson( + return _i3.PkgPublishingConfig.fromJson( await _client.requestJson( verb: 'put', path: '/api/packages/$package/automated-publishing', @@ -408,6 +408,20 @@ class PubApiClient { ); } + Future<_i3.PkgPublishingConfig> setPackagePublishing( + String package, + _i3.PkgPublishingConfig payload, + ) async { + return _i3.PkgPublishingConfig.fromJson( + await _client.requestJson( + verb: 'put', + path: '/api/packages/$package/publishing', + + body: payload.toJson(), + ), + ); + } + Future<_i3.VersionOptions> getVersionOptions( String package, String version, diff --git a/pkg/web_app/lib/src/admin_pages.dart b/pkg/web_app/lib/src/admin_pages.dart index 68eab94aa2..825870f48c 100644 --- a/pkg/web_app/lib/src/admin_pages.dart +++ b/pkg/web_app/lib/src/admin_pages.dart @@ -195,7 +195,7 @@ class _PkgAdminWidget { fn: () async { await api_client.client.setAutomatedPublishing( pageData.pkgData!.package, - AutomatedPublishingConfig( + PkgPublishingConfig( github: GitHubPublishingConfig( isEnabled: githubEnabledCheckbox!.checked ?? false, repository: githubRepositoryInput.value,