11using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
24using BaGet . Core . Entities ;
5+ using BaGet . Core . Legacy ;
36using Newtonsoft . Json ;
7+ using NuGet . Frameworks ;
48using NuGet . Protocol . Core . Types ;
59
610namespace BaGet . Web . Models
711{
812 public class CatalogEntry
913 {
10- public CatalogEntry ( Package package , string catalogUri , string packageContent )
14+ public CatalogEntry ( Package package , string catalogUri , string packageContent , Func < string , Uri > getRegistrationUrl )
1115 {
1216 if ( package == null ) throw new ArgumentNullException ( nameof ( package ) ) ;
1317
1418 CatalogUri = catalogUri ?? throw new ArgumentNullException ( nameof ( catalogUri ) ) ;
1519
1620 PackageId = package . Id ;
1721 Version = package . VersionString ;
18- Authors = string . Join ( ", " , package . Authors ) ;
22+ Authors = package . Authors == null ? null : string . Join ( ", " , package . Authors ) ;
1923 Description = package . Description ;
2024 Downloads = package . Downloads ;
2125 HasReadme = package . HasReadme ;
@@ -33,9 +37,66 @@ public CatalogEntry(Package package, string catalogUri, string packageContent)
3337 Summary = package . Summary ;
3438 Tags = package . Tags ;
3539 Title = package . Title ;
40+ DependencyGroups = ToDependencyGroups ( package . Dependencies , catalogUri , getRegistrationUrl ) ;
3641 }
3742
38- public CatalogEntry ( IPackageSearchMetadata package , string catalogUri , string packageContent )
43+ public static DependencyGroup [ ] ToDependencyGroups ( List < Core . Entities . PackageDependency > dependencies ,
44+ string catalogUri , Func < string , Uri > getRegistrationUrl )
45+ {
46+ if ( dependencies == null || ! dependencies . Any ( ) )
47+ return null ;
48+
49+ var groups = new List < DependencyGroup > ( ) ;
50+ var frameworkDeps = dependencies . Where ( d => d . IsFrameworkDependency ( ) ) . Select ( d => d . TargetFramework ) . Distinct ( ) ;
51+ foreach ( var frameworkDep in frameworkDeps ) {
52+ var g = new DependencyGroup ( ) {
53+ CatalogUrl = catalogUri + $ "#dependencygroup/.{ frameworkDep } ",
54+ TargetFramework = frameworkDep
55+ } ;
56+ groups . Add ( g ) ;
57+ }
58+ // empty string key implies no target framework
59+ Dictionary < string , List < PackageDependency > > dependenciesByFramework = new Dictionary < string , List < PackageDependency > > ( ) ;
60+ foreach ( var packageDependency in dependencies . Where ( d => ! d . IsFrameworkDependency ( ) ) )
61+ {
62+ var dep = new PackageDependency ( ) {
63+ Id = packageDependency . Id ,
64+ Range = packageDependency . VersionRange
65+ } ;
66+ string framework = packageDependency . TargetFramework == null ? "" : packageDependency . TargetFramework ;
67+ List < PackageDependency > deps = new List < PackageDependency > ( ) ;
68+ if ( ! dependenciesByFramework . TryGetValue ( framework , out deps ) ) {
69+ deps = new List < PackageDependency > ( ) ;
70+ dependenciesByFramework . Add ( framework , deps ) ;
71+ }
72+ deps . Add ( dep ) ;
73+ }
74+ var perFrameworkDeps =
75+ dependenciesByFramework . GroupBy ( d => d . Key )
76+ . Select ( grouppedDeps =>
77+ {
78+ var framework = string . IsNullOrEmpty ( grouppedDeps . Key ) ? null : grouppedDeps . Key ;
79+ string catalogForGroup = catalogUri + "#dependencygroup" ;
80+ if ( framework != null )
81+ catalogForGroup = catalogUri + $ "#dependencygroup/.{ framework } ";
82+ var g = new DependencyGroup ( ) {
83+ CatalogUrl = catalogForGroup ,
84+ TargetFramework = framework ,
85+ Dependencies = grouppedDeps . SelectMany ( d => d . Value )
86+ . Select ( d => new PackageDependency ( ) {
87+ CatalogUrl = catalogUri + $ "#dependencygroup/.{ grouppedDeps . Key } /{ d . Id } ",
88+ Id = d . Id ,
89+ Range = d . Range ,
90+ Registration = getRegistrationUrl ( d . Id ) . AbsoluteUri
91+ } ) . ToArray ( )
92+ } ;
93+ return g ;
94+ } ) ;
95+
96+ return groups . Concat ( perFrameworkDeps ) . ToArray ( ) ;
97+ }
98+
99+ public CatalogEntry ( IPackageSearchMetadata package , string catalogUri , string packageContent , Func < string , Uri > getRegistrationUrl )
39100 {
40101 if ( package == null ) throw new ArgumentNullException ( nameof ( package ) ) ;
41102
@@ -61,6 +122,36 @@ public CatalogEntry(IPackageSearchMetadata package, string catalogUri, string pa
61122 Summary = package . Summary ;
62123 Tags = package . Tags == null ? null : package . Tags . Split ( ',' ) ;
63124 Title = package . Title ;
125+ DependencyGroups = ToDependencyGroups ( package . DependencySets , catalogUri , getRegistrationUrl ) ;
126+ }
127+
128+ public static DependencyGroup [ ] ToDependencyGroups ( IEnumerable < NuGet . Packaging . PackageDependencyGroup > dependencies , string catalogUri ,
129+ Func < string , Uri > getRegistrationUrl )
130+ {
131+ return dependencies . Select ( grouppedDeps => {
132+ string targetFramework ;
133+ if ( grouppedDeps . TargetFramework == null || grouppedDeps . TargetFramework . Equals ( NuGetFramework . AnyFramework ) )
134+ targetFramework = null ;
135+ else
136+ targetFramework = grouppedDeps . TargetFramework . GetShortFolderName ( ) ;
137+ string catalogForGroup = catalogUri + "#dependencygroup" ;
138+ if ( targetFramework != null )
139+ catalogForGroup = catalogUri + $ "#dependencygroup/.{ targetFramework } ";
140+ var g = new DependencyGroup ( ) {
141+ CatalogUrl = catalogForGroup ,
142+ TargetFramework = targetFramework ,
143+ Dependencies = grouppedDeps . Packages
144+ . Select ( d => new PackageDependency ( ) {
145+ CatalogUrl = catalogUri + $ "#dependencygroup/.{ targetFramework } /{ d . Id } ",
146+ Id = d . Id ,
147+ Range = d . VersionRange . ToNormalizedString ( ) ,
148+ Registration = getRegistrationUrl ( d . Id ) . AbsoluteUri
149+ } ) . ToArray ( )
150+ } ;
151+ if ( g . Dependencies . Length == 0 )
152+ g . Dependencies = null ;
153+ return g ;
154+ } ) . ToArray ( ) ;
64155 }
65156
66157 private string NullSafeToString ( object prop )
@@ -95,5 +186,7 @@ private string NullSafeToString(object prop)
95186 public string Summary { get ; }
96187 public string [ ] Tags { get ; }
97188 public string Title { get ; }
189+
190+ public DependencyGroup [ ] DependencyGroups { get ; }
98191 }
99192}
0 commit comments