@@ -6,7 +6,9 @@ import 'dart:async';
6
6
import 'dart:convert' ;
7
7
8
8
import 'package:clock/clock.dart' ;
9
+ import 'package:collection/collection.dart' ;
9
10
import 'package:crypto/crypto.dart' ;
11
+ import 'package:pub_dev/shared/changelog.dart' ;
10
12
import 'package:shelf/shelf.dart' as shelf;
11
13
12
14
import '../../admin/actions/actions.dart' ;
@@ -53,7 +55,9 @@ Future<shelf.Response> packageAtomFeedhandler(
53
55
Future <String > buildAllPackagesAtomFeedContent () async {
54
56
final versions = await packageBackend.latestPackageVersions (limit: 100 );
55
57
versions.removeWhere ((pv) => pv.isNotVisible || pv.isRetracted);
56
- final feed = _allPackagesFeed (versions);
58
+ final contents = await Future .wait (
59
+ versions.map ((v) => _getChangelogReleaseContent (v.package, v.version! )));
60
+ final feed = _allPackagesFeed (versions, contents);
57
61
return feed.toXmlDocument ();
58
62
}
59
63
@@ -70,10 +74,34 @@ Future<String> buildPackageAtomFeedContent(String package) async {
70
74
)
71
75
.toList ();
72
76
versions.removeWhere ((pv) => pv.isNotVisible || pv.isRetracted);
73
- final feed = _packageFeed (package, versions);
77
+ final contents = await Future .wait (
78
+ versions.map ((v) => _getChangelogReleaseContent (package, v.version! )));
79
+ final feed = _packageFeed (package, versions, contents);
74
80
return feed.toXmlDocument ();
75
81
}
76
82
83
+ Future <String > _getChangelogReleaseContent (
84
+ String package, String version) async {
85
+ final content = await cache
86
+ .changelogReleaseContentAsMarkdown (package, version)
87
+ .get (() async {
88
+ final asset = await packageBackend.lookupPackageVersionAsset (
89
+ package, version, AssetKind .changelog);
90
+ final content = asset? .textContent;
91
+ if (content == null ) {
92
+ return '' ;
93
+ }
94
+ final parsed = ChangelogParser ().parseMarkdownText (content);
95
+ final release =
96
+ parsed.releases.firstWhereOrNull ((r) => r.version == version);
97
+ if (release == null ) {
98
+ return '' ;
99
+ }
100
+ return release.content.asMarkdownText;
101
+ });
102
+ return content ?? '' ;
103
+ }
104
+
77
105
class FeedEntry {
78
106
final String id;
79
107
final String title;
@@ -181,7 +209,10 @@ class Feed {
181
209
}
182
210
}
183
211
184
- Feed _allPackagesFeed (List <PackageVersion > versions) {
212
+ Feed _allPackagesFeed (
213
+ List <PackageVersion > versions,
214
+ List <String > releaseContents,
215
+ ) {
185
216
final entries = < FeedEntry > [];
186
217
for (var i = 0 ; i < versions.length; i++ ) {
187
218
final version = versions[i];
@@ -195,7 +226,14 @@ Feed _allPackagesFeed(List<PackageVersion> versions) {
195
226
sha512.convert (utf8.encode ('${version .package }/${version .version }' ));
196
227
final id = createUuid (hash.bytes.sublist (0 , 16 ));
197
228
final title = 'v${version .version } of ${version .package }' ;
198
- final content = version.ellipsizedDescription ?? '[no description]' ;
229
+ final fullReleaseContent = releaseContents[i];
230
+ final releaseContent = fullReleaseContent.length > 512
231
+ ? '${fullReleaseContent .substring (0 , 500 )}[...]'
232
+ : fullReleaseContent;
233
+ final content = [
234
+ version.ellipsizedDescription ?? '[no description]' ,
235
+ if (releaseContent.isNotEmpty) 'Changelog excerpt:\n $releaseContent ' ,
236
+ ].join ('\n\n ' );
199
237
entries.add (FeedEntry (
200
238
id: id,
201
239
title: title,
@@ -216,7 +254,11 @@ Feed _allPackagesFeed(List<PackageVersion> versions) {
216
254
);
217
255
}
218
256
219
- Feed _packageFeed (String package, List <PackageVersion > versions) {
257
+ Feed _packageFeed (
258
+ String package,
259
+ List <PackageVersion > versions,
260
+ List <String > releaseContents,
261
+ ) {
220
262
return Feed (
221
263
title: 'Recently published versions of package $package on pub.dev' ,
222
264
alternateUrl: activeConfiguration.primarySiteUri
@@ -227,7 +269,7 @@ Feed _packageFeed(String package, List<PackageVersion> versions) {
227
269
.resolve (urls.pkgFeedUrl (package))
228
270
.toString (),
229
271
author: versions.firstOrNull? .publisherId,
230
- entries: versions.map (( v) {
272
+ entries: versions.mapIndexed ((i, v) {
231
273
final hash =
232
274
sha512.convert (utf8.encode ('package-feed/$package /${v .version }' ));
233
275
final id = createUuid (hash.bytes.sublist (0 , 16 ));
@@ -238,13 +280,19 @@ Feed _packageFeed(String package, List<PackageVersion> versions) {
238
280
version: v.version,
239
281
))
240
282
.toString ();
283
+ final fullReleaseContent = releaseContents[i];
284
+ final releaseContent = fullReleaseContent.length > 1024
285
+ ? '${fullReleaseContent .substring (0 , 1000 )}[...]'
286
+ : fullReleaseContent;
241
287
return FeedEntry (
242
288
id: id,
243
289
title: 'v${v .version } of $package ' ,
244
290
alternateUrl: alternateUrl,
245
291
alternateTitle: v.version,
246
- content:
247
- '${v .version } was published on ${shortDateFormat .format (v .created !)}.' ,
292
+ content: [
293
+ '${v .version } was published on ${shortDateFormat .format (v .created !)}.' ,
294
+ if (releaseContent.isNotEmpty) 'Changelog excerpt:\n $releaseContent ' ,
295
+ ].join ('\n\n ' ),
248
296
updated: v.created! ,
249
297
);
250
298
}).toList (),
0 commit comments