fix(packages): preserve SemVer prerelease identifiers in Swift Registry (#39156) (#39158)

Co-authored-by: terriblegoodday <terriblegoodday@gmail.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Co-authored-by: silverwind <me@silverwind.io>
This commit is contained in:
Eduard Dzhumagaliev
2026-08-28 11:48:20 +05:00
committed by GitHub
parent 1dab66b83c
commit e435d761cc
2 changed files with 32 additions and 17 deletions
+6 -6
View File
@@ -8,6 +8,7 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"regexp"
"sort"
"strings"
@@ -145,7 +146,7 @@ func EnumeratePackageVersions(ctx *context.Context) {
return pds[i].SemVer.LessThan(pds[j].SemVer)
})
baseURL := fmt.Sprintf("%sapi/packages/%s/swift/%s/%s/", setting.AppURL, ctx.Package.Owner.LowerName, packageScope, packageName)
baseURL := fmt.Sprintf("%sapi/packages/%s/swift/%s/%s/", setting.AppURL, url.PathEscape(ctx.Package.Owner.LowerName), url.PathEscape(packageScope), url.PathEscape(packageName))
releases := make(map[string]Release)
for _, pd := range pds {
@@ -156,7 +157,7 @@ func EnumeratePackageVersions(ctx *context.Context) {
}
setResponseHeaders(ctx.Resp, &headers{
Link: fmt.Sprintf(`<%s%s>; rel="latest-version"`, baseURL, pds[len(pds)-1].Version.Version),
Link: fmt.Sprintf(`<%s%s>; rel="latest-version"`, baseURL, url.PathEscape(pds[len(pds)-1].Version.Version)),
})
ctx.JSON(http.StatusOK, EnumeratePackageVersionsResponse{
@@ -322,16 +323,15 @@ func formFileOptionalReadCloser(ctx *context.Context, formKey string) (io.ReadCl
func UploadPackageFile(ctx *context.Context) {
packageScope := ctx.PathParam("scope")
packageName := ctx.PathParam("name")
packageVersion := ctx.PathParam("version")
v, err := version.NewVersion(ctx.PathParam("version"))
_, err := version.NewSemver(packageVersion)
if !scopePattern.MatchString(packageScope) || !namePattern.MatchString(packageName) || err != nil {
if err != nil || !scopePattern.MatchString(packageScope) || !namePattern.MatchString(packageName) {
apiError(ctx, http.StatusBadRequest, err)
return
}
packageVersion := v.Core().String()
file, err := formFileOptionalReadCloser(ctx, "source-archive")
if file == nil || err != nil {
apiError(ctx, http.StatusBadRequest, "unable to read source-archive file")