Skip to content

Commit f7258aa

Browse files
KN4CK3Rlunny
andauthored
Normalize NuGet package version on upload (#22186) (#22200)
Backport of #22186 Co-authored-by: Lunny Xiao <[email protected]>
1 parent 9a0a408 commit f7258aa

File tree

4 files changed

+36
-21
lines changed

4 files changed

+36
-21
lines changed

modules/packages/nuget/metadata.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ package nuget
66

77
import (
88
"archive/zip"
9+
"bytes"
910
"encoding/xml"
1011
"errors"
12+
"fmt"
1113
"io"
1214
"path/filepath"
1315
"regexp"
@@ -183,7 +185,23 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) {
183185
return &Package{
184186
PackageType: packageType,
185187
ID: p.Metadata.ID,
186-
Version: v.String(),
188+
Version: toNormalizedVersion(v),
187189
Metadata: m,
188190
}, nil
189191
}
192+
193+
// https://learn.microsoft.com/en-us/nuget/concepts/package-versioning#normalized-version-numbers
194+
// https://github.com/NuGet/NuGet.Client/blob/dccbd304b11103e08b97abf4cf4bcc1499d9235a/src/NuGet.Core/NuGet.Versioning/VersionFormatter.cs#L121
195+
func toNormalizedVersion(v *version.Version) string {
196+
var buf bytes.Buffer
197+
segments := v.Segments64()
198+
fmt.Fprintf(&buf, "%d.%d.%d", segments[0], segments[1], segments[2])
199+
if len(segments) > 3 && segments[3] > 0 {
200+
fmt.Fprintf(&buf, ".%d", segments[3])
201+
}
202+
pre := v.Prerelease()
203+
if pre != "" {
204+
fmt.Fprint(&buf, "-", pre)
205+
}
206+
return buf.String()
207+
}

modules/packages/nuget/metadata_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,19 @@ func TestParseNuspecMetaData(t *testing.T) {
147147
assert.Len(t, deps, 1)
148148
assert.Equal(t, dependencyID, deps[0].ID)
149149
assert.Equal(t, dependencyVersion, deps[0].Version)
150+
151+
t.Run("NormalizedVersion", func(t *testing.T) {
152+
np, err := ParseNuspecMetaData(strings.NewReader(`<?xml version="1.0" encoding="utf-8"?>
153+
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
154+
<metadata>
155+
<id>test</id>
156+
<version>1.04.5.2.5-rc.1+metadata</version>
157+
</metadata>
158+
</package>`))
159+
assert.NoError(t, err)
160+
assert.NotNil(t, np)
161+
assert.Equal(t, "1.4.5.2-rc.1", np.Version)
162+
})
150163
})
151164

152165
t.Run("Symbols Package", func(t *testing.T) {

routers/api/packages/nuget/api_v2.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames
345345
Content: content,
346346
Properties: &FeedEntryProperties{
347347
Version: pd.Version.Version,
348-
NormalizedVersion: normalizeVersion(pd.SemVer),
348+
NormalizedVersion: pd.Version.Version,
349349
Authors: metadata.Authors,
350350
Dependencies: buildDependencyString(metadata),
351351
Description: metadata.Description,

routers/api/packages/nuget/api_v3.go

+3-19
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@
55
package nuget
66

77
import (
8-
"bytes"
9-
"fmt"
108
"sort"
119
"time"
1210

1311
packages_model "code.gitea.io/gitea/models/packages"
1412
nuget_module "code.gitea.io/gitea/modules/packages/nuget"
15-
16-
"github.com/hashicorp/go-version"
1713
)
1814

1915
// https://docs.microsoft.com/en-us/nuget/api/service-index#resources
@@ -96,8 +92,8 @@ func createRegistrationIndexResponse(l *linkBuilder, pds []*packages_model.Packa
9692
{
9793
RegistrationPageURL: l.GetRegistrationIndexURL(pds[0].Package.Name),
9894
Count: len(pds),
99-
Lower: normalizeVersion(pds[0].SemVer),
100-
Upper: normalizeVersion(pds[len(pds)-1].SemVer),
95+
Lower: pds[0].Version.Version,
96+
Upper: pds[len(pds)-1].Version.Version,
10197
Items: items,
10298
},
10399
},
@@ -174,7 +170,7 @@ type PackageVersionsResponse struct {
174170
func createPackageVersionsResponse(pds []*packages_model.PackageDescriptor) *PackageVersionsResponse {
175171
versions := make([]string, 0, len(pds))
176172
for _, pd := range pds {
177-
versions = append(versions, normalizeVersion(pd.SemVer))
173+
versions = append(versions, pd.Version.Version)
178174
}
179175

180176
return &PackageVersionsResponse{
@@ -249,15 +245,3 @@ func createSearchResult(l *linkBuilder, pds []*packages_model.PackageDescriptor)
249245
RegistrationIndexURL: l.GetRegistrationIndexURL(latest.Package.Name),
250246
}
251247
}
252-
253-
// normalizeVersion removes the metadata
254-
func normalizeVersion(v *version.Version) string {
255-
var buf bytes.Buffer
256-
segments := v.Segments64()
257-
fmt.Fprintf(&buf, "%d.%d.%d", segments[0], segments[1], segments[2])
258-
pre := v.Prerelease()
259-
if pre != "" {
260-
fmt.Fprintf(&buf, "-%s", pre)
261-
}
262-
return buf.String()
263-
}

0 commit comments

Comments
 (0)