Backport of #22186 Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>tags/v1.17.4
@@ -6,8 +6,10 @@ package nuget | |||
import ( | |||
"archive/zip" | |||
"bytes" | |||
"encoding/xml" | |||
"errors" | |||
"fmt" | |||
"io" | |||
"path/filepath" | |||
"regexp" | |||
@@ -181,7 +183,23 @@ func ParseNuspecMetaData(r io.Reader) (*Package, error) { | |||
return &Package{ | |||
PackageType: packageType, | |||
ID: p.Metadata.ID, | |||
Version: v.String(), | |||
Version: toNormalizedVersion(v), | |||
Metadata: m, | |||
}, nil | |||
} | |||
// https://learn.microsoft.com/en-us/nuget/concepts/package-versioning#normalized-version-numbers | |||
// https://github.com/NuGet/NuGet.Client/blob/dccbd304b11103e08b97abf4cf4bcc1499d9235a/src/NuGet.Core/NuGet.Versioning/VersionFormatter.cs#L121 | |||
func toNormalizedVersion(v *version.Version) string { | |||
var buf bytes.Buffer | |||
segments := v.Segments64() | |||
fmt.Fprintf(&buf, "%d.%d.%d", segments[0], segments[1], segments[2]) | |||
if len(segments) > 3 && segments[3] > 0 { | |||
fmt.Fprintf(&buf, ".%d", segments[3]) | |||
} | |||
pre := v.Prerelease() | |||
if pre != "" { | |||
fmt.Fprint(&buf, "-", pre) | |||
} | |||
return buf.String() | |||
} |
@@ -147,6 +147,19 @@ func TestParseNuspecMetaData(t *testing.T) { | |||
assert.Len(t, deps, 1) | |||
assert.Equal(t, dependencyID, deps[0].ID) | |||
assert.Equal(t, dependencyVersion, deps[0].Version) | |||
t.Run("NormalizedVersion", func(t *testing.T) { | |||
np, err := ParseNuspecMetaData(strings.NewReader(`<?xml version="1.0" encoding="utf-8"?> | |||
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> | |||
<metadata> | |||
<id>test</id> | |||
<version>1.04.5.2.5-rc.1+metadata</version> | |||
</metadata> | |||
</package>`)) | |||
assert.NoError(t, err) | |||
assert.NotNil(t, np) | |||
assert.Equal(t, "1.4.5.2-rc.1", np.Version) | |||
}) | |||
}) | |||
t.Run("Symbols Package", func(t *testing.T) { |
@@ -5,15 +5,11 @@ | |||
package nuget | |||
import ( | |||
"bytes" | |||
"fmt" | |||
"sort" | |||
"time" | |||
packages_model "code.gitea.io/gitea/models/packages" | |||
nuget_module "code.gitea.io/gitea/modules/packages/nuget" | |||
"github.com/hashicorp/go-version" | |||
) | |||
// ServiceIndexResponse https://docs.microsoft.com/en-us/nuget/api/service-index#resources | |||
@@ -113,8 +109,8 @@ func createRegistrationIndexResponse(l *linkBuilder, pds []*packages_model.Packa | |||
{ | |||
RegistrationPageURL: l.GetRegistrationIndexURL(pds[0].Package.Name), | |||
Count: len(pds), | |||
Lower: normalizeVersion(pds[0].SemVer), | |||
Upper: normalizeVersion(pds[len(pds)-1].SemVer), | |||
Lower: pds[0].Version.Version, | |||
Upper: pds[len(pds)-1].Version.Version, | |||
Items: items, | |||
}, | |||
}, | |||
@@ -191,7 +187,7 @@ type PackageVersionsResponse struct { | |||
func createPackageVersionsResponse(pds []*packages_model.PackageDescriptor) *PackageVersionsResponse { | |||
versions := make([]string, 0, len(pds)) | |||
for _, pd := range pds { | |||
versions = append(versions, normalizeVersion(pd.SemVer)) | |||
versions = append(versions, pd.Version.Version) | |||
} | |||
return &PackageVersionsResponse{ | |||
@@ -266,15 +262,3 @@ func createSearchResult(l *linkBuilder, pds []*packages_model.PackageDescriptor) | |||
RegistrationIndexURL: l.GetRegistrationIndexURL(latest.Package.Name), | |||
} | |||
} | |||
// normalizeVersion removes the metadata | |||
func normalizeVersion(v *version.Version) string { | |||
var buf bytes.Buffer | |||
segments := v.Segments64() | |||
fmt.Fprintf(&buf, "%d.%d.%d", segments[0], segments[1], segments[2]) | |||
pre := v.Prerelease() | |||
if pre != "" { | |||
fmt.Fprintf(&buf, "-%s", pre) | |||
} | |||
return buf.String() | |||
} |