@@ -71,34 +71,50 @@ type Dependency struct {
71
71
Version string `json:"version"`
72
72
}
73
73
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
+
74
114
type 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"`
102
118
}
103
119
104
120
// ParsePackageMetaData parses the metadata of a Nuget package file
@@ -149,10 +165,12 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
149
165
}
150
166
151
167
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
+ }
156
174
}
157
175
}
158
176
@@ -161,24 +179,27 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
161
179
ReleaseNotes : p .Metadata .ReleaseNotes ,
162
180
Authors : p .Metadata .Authors ,
163
181
ProjectURL : p .Metadata .ProjectURL ,
164
- RepositoryURL : p .Metadata .Repository .URL ,
165
182
RequireLicenseAcceptance : p .Metadata .RequireLicenseAcceptance ,
166
183
Dependencies : make (map [string ][]Dependency ),
167
184
}
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
174
202
}
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
182
203
}
183
204
}
184
205
return & Package {
@@ -204,3 +225,51 @@ func toNormalizedVersion(v *version.Version) string {
204
225
}
205
226
return buf .String ()
206
227
}
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