mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Normalize NuGet package version on upload (#22186)
Fixes #22178 After this change upload versions with different semver metadata are treated as the same version and trigger a duplicated version error. Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		| @@ -5,8 +5,10 @@ package nuget | ||||
|  | ||||
| import ( | ||||
| 	"archive/zip" | ||||
| 	"bytes" | ||||
| 	"encoding/xml" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"path/filepath" | ||||
| 	"regexp" | ||||
| @@ -182,7 +184,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() | ||||
| } | ||||
|   | ||||
| @@ -146,6 +146,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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user