@@ -48,10 +48,11 @@ const maxNuspecFileSize = 3 * 1024 * 1024
48
48
49
49
// Package represents a Nuget package
50
50
type Package struct {
51
- PackageType PackageType
52
- ID string
53
- Version string
54
- Metadata * Metadata
51
+ PackageType PackageType
52
+ ID string
53
+ Version string
54
+ Metadata * Metadata
55
+ NuspecContent * bytes.Buffer
55
56
}
56
57
57
58
// Metadata represents the metadata of a Nuget package
@@ -71,50 +72,34 @@ type Dependency struct {
71
72
Version string `json:"version"`
72
73
}
73
74
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
-
114
75
type nuspecPackage struct {
115
- XMLName xml.Name `xml:"package"`
116
- Xmlns string `xml:"xmlns,attr"`
117
- Metadata nuspeceMetadata `xml:"metadata"`
76
+ Metadata struct {
77
+ ID string `xml:"id"`
78
+ Version string `xml:"version"`
79
+ Authors string `xml:"authors"`
80
+ RequireLicenseAcceptance bool `xml:"requireLicenseAcceptance"`
81
+ ProjectURL string `xml:"projectUrl"`
82
+ Description string `xml:"description"`
83
+ ReleaseNotes string `xml:"releaseNotes"`
84
+ PackageTypes struct {
85
+ PackageType []struct {
86
+ Name string `xml:"name,attr"`
87
+ } `xml:"packageType"`
88
+ } `xml:"packageTypes"`
89
+ Repository struct {
90
+ URL string `xml:"url,attr"`
91
+ } `xml:"repository"`
92
+ Dependencies struct {
93
+ Group []struct {
94
+ TargetFramework string `xml:"targetFramework,attr"`
95
+ Dependency []struct {
96
+ ID string `xml:"id,attr"`
97
+ Version string `xml:"version,attr"`
98
+ Exclude string `xml:"exclude,attr"`
99
+ } `xml:"dependency"`
100
+ } `xml:"group"`
101
+ } `xml:"dependencies"`
102
+ } `xml:"metadata"`
118
103
}
119
104
120
105
// ParsePackageMetaData parses the metadata of a Nuget package file
@@ -146,8 +131,9 @@ func ParsePackageMetaData(r io.ReaderAt, size int64) (*Package, error) {
146
131
147
132
// ParseNuspecMetaData parses a Nuspec file to retrieve the metadata of a Nuget package
148
133
func ParseNuspecMetaData (r io.Reader ) (* Package , error ) {
134
+ var nuspecBuf bytes.Buffer
149
135
var p nuspecPackage
150
- if err := xml .NewDecoder (r ).Decode (& p ); err != nil {
136
+ if err := xml .NewDecoder (io . TeeReader ( r , & nuspecBuf ) ).Decode (& p ); err != nil {
151
137
return nil , err
152
138
}
153
139
@@ -165,12 +151,10 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
165
151
}
166
152
167
153
packageType := DependencyPackage
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
- }
154
+ for _ , pt := range p .Metadata .PackageTypes .PackageType {
155
+ if pt .Name == "SymbolsPackage" {
156
+ packageType = SymbolsPackage
157
+ break
174
158
}
175
159
}
176
160
@@ -179,34 +163,32 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
179
163
ReleaseNotes : p .Metadata .ReleaseNotes ,
180
164
Authors : p .Metadata .Authors ,
181
165
ProjectURL : p .Metadata .ProjectURL ,
166
+ RepositoryURL : p .Metadata .Repository .URL ,
182
167
RequireLicenseAcceptance : p .Metadata .RequireLicenseAcceptance ,
183
168
Dependencies : make (map [string ][]Dependency ),
184
169
}
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
170
+
171
+ for _ , group := range p .Metadata .Dependencies .Group {
172
+ deps := make ([]Dependency , 0 , len (group .Dependency ))
173
+ for _ , dep := range group .Dependency {
174
+ if dep .ID == "" || dep .Version == "" {
175
+ continue
202
176
}
177
+ deps = append (deps , Dependency {
178
+ ID : dep .ID ,
179
+ Version : dep .Version ,
180
+ })
181
+ }
182
+ if len (deps ) > 0 {
183
+ m .Dependencies [group .TargetFramework ] = deps
203
184
}
204
185
}
205
186
return & Package {
206
- PackageType : packageType ,
207
- ID : p .Metadata .ID ,
208
- Version : toNormalizedVersion (v ),
209
- Metadata : m ,
187
+ PackageType : packageType ,
188
+ ID : p .Metadata .ID ,
189
+ Version : toNormalizedVersion (v ),
190
+ Metadata : m ,
191
+ NuspecContent : & nuspecBuf ,
210
192
}, nil
211
193
}
212
194
@@ -225,51 +207,3 @@ func toNormalizedVersion(v *version.Version) string {
225
207
}
226
208
return buf .String ()
227
209
}
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