@@ -6,7 +6,9 @@ import 'dart:async';
66import  'dart:convert' ;
77
88import  'package:clock/clock.dart' ;
9+ import  'package:collection/collection.dart' ;
910import  'package:crypto/crypto.dart' ;
11+ import  'package:pub_dev/shared/changelog.dart' ;
1012import  'package:shelf/shelf.dart'  as  shelf;
1113
1214import  '../../admin/actions/actions.dart' ;
@@ -53,7 +55,9 @@ Future<shelf.Response> packageAtomFeedhandler(
5355Future <String > buildAllPackagesAtomFeedContent () async  {
5456  final  versions =  await  packageBackend.latestPackageVersions (limit:  100 );
5557  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);
5761  return  feed.toXmlDocument ();
5862}
5963
@@ -70,10 +74,34 @@ Future<String> buildPackageAtomFeedContent(String package) async {
7074      )
7175      .toList ();
7276  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);
7480  return  feed.toXmlDocument ();
7581}
7682
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+ 
77105class  FeedEntry  {
78106  final  String  id;
79107  final  String  title;
@@ -181,7 +209,10 @@ class Feed {
181209  }
182210}
183211
184- Feed  _allPackagesFeed (List <PackageVersion > versions) {
212+ Feed  _allPackagesFeed (
213+   List <PackageVersion > versions,
214+   List <String > releaseContents,
215+ ) {
185216  final  entries =  < FeedEntry > [];
186217  for  (var  i =  0 ; i <  versions.length; i++ ) {
187218    final  version =  versions[i];
@@ -195,7 +226,14 @@ Feed _allPackagesFeed(List<PackageVersion> versions) {
195226        sha512.convert (utf8.encode ('${version .package }/${version .version }' ));
196227    final  id =  createUuid (hash.bytes.sublist (0 , 16 ));
197228    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 ' );
199237    entries.add (FeedEntry (
200238      id:  id,
201239      title:  title,
@@ -216,7 +254,11 @@ Feed _allPackagesFeed(List<PackageVersion> versions) {
216254  );
217255}
218256
219- Feed  _packageFeed (String  package, List <PackageVersion > versions) {
257+ Feed  _packageFeed (
258+   String  package,
259+   List <PackageVersion > versions,
260+   List <String > releaseContents,
261+ ) {
220262  return  Feed (
221263    title:  'Recently published versions of package $package  on pub.dev' ,
222264    alternateUrl:  activeConfiguration.primarySiteUri
@@ -227,7 +269,7 @@ Feed _packageFeed(String package, List<PackageVersion> versions) {
227269        .resolve (urls.pkgFeedUrl (package))
228270        .toString (),
229271    author:  versions.firstOrNull? .publisherId,
230-     entries:  versions.map (( v) {
272+     entries:  versions.mapIndexed ((i,  v) {
231273      final  hash = 
232274          sha512.convert (utf8.encode ('package-feed/$package /${v .version }' ));
233275      final  id =  createUuid (hash.bytes.sublist (0 , 16 ));
@@ -238,13 +280,19 @@ Feed _packageFeed(String package, List<PackageVersion> versions) {
238280            version:  v.version,
239281          ))
240282          .toString ();
283+       final  fullReleaseContent =  releaseContents[i];
284+       final  releaseContent =  fullReleaseContent.length >  1024 
285+           ?  '${fullReleaseContent .substring (0 , 1000 )}[...]' 
286+           :  fullReleaseContent;
241287      return  FeedEntry (
242288        id:  id,
243289        title:  'v${v .version } of $package ' ,
244290        alternateUrl:  alternateUrl,
245291        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 ' ),
248296        updated:  v.created! ,
249297      );
250298    }).toList (),
0 commit comments