@@ -71,34 +71,50 @@ type Dependency struct {
7171 Version string `json:"version"`
7272}
7373
74+ type nuspecPackageType struct {
75+ Name string `xml:"name,attr"`
76+ }
77+
78+ type nuspecPackageTypes struct {
79+ PackageType []nuspecPackageType `xml:"packageType"`
80+ }
81+
82+ type nuspecRepository struct {
83+ URL string `xml:"url,attr,omitempty"`
84+ Type string `xml:"type,attr,omitempty"`
85+ }
86+ type nuspecDependency struct {
87+ ID string `xml:"id,attr"`
88+ Version string `xml:"version,attr"`
89+ Exclude string `xml:"exclude,attr,omitempty"`
90+ }
91+
92+ type nuspecGroup struct {
93+ TargetFramework string `xml:"targetFramework,attr"`
94+ Dependency []nuspecDependency `xml:"dependency"`
95+ }
96+
97+ type nuspecDependencies struct {
98+ Group []nuspecGroup `xml:"group"`
99+ }
100+
101+ type nuspeceMetadata struct {
102+ ID string `xml:"id"`
103+ Version string `xml:"version"`
104+ Authors string `xml:"authors"`
105+ RequireLicenseAcceptance bool `xml:"requireLicenseAcceptance,omitempty"`
106+ ProjectURL string `xml:"projectUrl,omitempty"`
107+ Description string `xml:"description"`
108+ ReleaseNotes string `xml:"releaseNotes,omitempty"`
109+ PackageTypes * nuspecPackageTypes `xml:"packageTypes,omitempty"`
110+ Repository * nuspecRepository `xml:"repository,omitempty"`
111+ Dependencies * nuspecDependencies `xml:"dependencies,omitempty"`
112+ }
113+
74114type nuspecPackage struct {
75- Metadata struct {
76- ID string `xml:"id"`
77- Version string `xml:"version"`
78- Authors string `xml:"authors"`
79- RequireLicenseAcceptance bool `xml:"requireLicenseAcceptance"`
80- ProjectURL string `xml:"projectUrl"`
81- Description string `xml:"description"`
82- ReleaseNotes string `xml:"releaseNotes"`
83- PackageTypes struct {
84- PackageType []struct {
85- Name string `xml:"name,attr"`
86- } `xml:"packageType"`
87- } `xml:"packageTypes"`
88- Repository struct {
89- URL string `xml:"url,attr"`
90- } `xml:"repository"`
91- Dependencies struct {
92- Group []struct {
93- TargetFramework string `xml:"targetFramework,attr"`
94- Dependency []struct {
95- ID string `xml:"id,attr"`
96- Version string `xml:"version,attr"`
97- Exclude string `xml:"exclude,attr"`
98- } `xml:"dependency"`
99- } `xml:"group"`
100- } `xml:"dependencies"`
101- } `xml:"metadata"`
115+ XMLName xml.Name `xml:"package"`
116+ Xmlns string `xml:"xmlns,attr"`
117+ Metadata nuspeceMetadata `xml:"metadata"`
102118}
103119
104120// ParsePackageMetaData parses the metadata of a Nuget package file
@@ -149,10 +165,12 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
149165 }
150166
151167 packageType := DependencyPackage
152- for _ , pt := range p .Metadata .PackageTypes .PackageType {
153- if pt .Name == "SymbolsPackage" {
154- packageType = SymbolsPackage
155- break
168+ if p .Metadata .PackageTypes != nil {
169+ for _ , pt := range p .Metadata .PackageTypes .PackageType {
170+ if pt .Name == "SymbolsPackage" {
171+ packageType = SymbolsPackage
172+ break
173+ }
156174 }
157175 }
158176
@@ -161,24 +179,27 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
161179 ReleaseNotes : p .Metadata .ReleaseNotes ,
162180 Authors : p .Metadata .Authors ,
163181 ProjectURL : p .Metadata .ProjectURL ,
164- RepositoryURL : p .Metadata .Repository .URL ,
165182 RequireLicenseAcceptance : p .Metadata .RequireLicenseAcceptance ,
166183 Dependencies : make (map [string ][]Dependency ),
167184 }
168-
169- for _ , group := range p .Metadata .Dependencies .Group {
170- deps := make ([]Dependency , 0 , len (group .Dependency ))
171- for _ , dep := range group .Dependency {
172- if dep .ID == "" || dep .Version == "" {
173- continue
185+ if p .Metadata .Repository != nil {
186+ m .RepositoryURL = p .Metadata .Repository .URL
187+ }
188+ if p .Metadata .Dependencies != nil {
189+ for _ , group := range p .Metadata .Dependencies .Group {
190+ deps := make ([]Dependency , 0 , len (group .Dependency ))
191+ for _ , dep := range group .Dependency {
192+ if dep .ID == "" || dep .Version == "" {
193+ continue
194+ }
195+ deps = append (deps , Dependency {
196+ ID : dep .ID ,
197+ Version : dep .Version ,
198+ })
199+ }
200+ if len (deps ) > 0 {
201+ m .Dependencies [group .TargetFramework ] = deps
174202 }
175- deps = append (deps , Dependency {
176- ID : dep .ID ,
177- Version : dep .Version ,
178- })
179- }
180- if len (deps ) > 0 {
181- m .Dependencies [group .TargetFramework ] = deps
182203 }
183204 }
184205 return & Package {
@@ -204,3 +225,51 @@ func toNormalizedVersion(v *version.Version) string {
204225 }
205226 return buf .String ()
206227}
228+
229+ // returning any here because we use a private type and we don't need the type for xml marshalling
230+ func GenerateNuspec (pd * Package ) any {
231+ m := nuspeceMetadata {
232+ ID : pd .ID ,
233+ Version : pd .Version ,
234+ Authors : pd .Metadata .Authors ,
235+ Description : pd .Metadata .Description ,
236+ ProjectURL : pd .Metadata .ProjectURL ,
237+ RequireLicenseAcceptance : pd .Metadata .RequireLicenseAcceptance ,
238+ }
239+
240+ if pd .Metadata .RepositoryURL != "" {
241+ m .Repository = & nuspecRepository {
242+ URL : pd .Metadata .RepositoryURL ,
243+ }
244+ }
245+
246+ groups := len (pd .Metadata .Dependencies )
247+ if groups > 0 {
248+ m .Dependencies = & nuspecDependencies {
249+ Group : make ([]nuspecGroup , 0 , groups ),
250+ }
251+
252+ for tgf , deps := range pd .Metadata .Dependencies {
253+ if len (deps ) == 0 {
254+ continue
255+ }
256+ gDeps := make ([]nuspecDependency , 0 , len (deps ))
257+ for _ , dep := range deps {
258+ gDeps = append (gDeps , nuspecDependency {
259+ ID : dep .ID ,
260+ Version : dep .Version ,
261+ })
262+ }
263+
264+ m .Dependencies .Group = append (m .Dependencies .Group , nuspecGroup {
265+ TargetFramework : tgf ,
266+ Dependency : gDeps ,
267+ })
268+ }
269+ }
270+
271+ return & nuspecPackage {
272+ Xmlns : "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" ,
273+ Metadata : m ,
274+ }
275+ }
0 commit comments