Swift registry metadata: preserve more JSON fields and accept empty metadata (#37254)

This commit is contained in:
Copilot
2026-04-18 04:16:26 +08:00
committed by GitHub
parent a9108ab6aa
commit e43422b042
5 changed files with 143 additions and 65 deletions

View File

@@ -35,9 +35,26 @@ func TestPackageSwift(t *testing.T) {
packageID := packageScope + "." + packageName
packageVersion := "1.0.3"
packageVersion2 := "1.0.4"
packageVersion3 := "1.0.5"
packageAuthor := "KN4CK3R"
packageDescription := "Gitea Test Package"
packageRepositoryURL := "https://gitea.io/gitea/gitea"
packageCodeRepositoryURL := "https://gitea.io/gitea/gitea" // this one is not used as a property, it is meta
packageLicenseURL := "https://opensource.org/license/mit"
packageRepositoryURL1 := "https://gitea.io/gitea/repo"
packageRepositoryURLs := []string{packageRepositoryURL1, "https://gitea.io/gitea/repo.git", "ssh://git@gitea.io/gitea/repo.git"}
makePackageMetadataJSON := func(ver string) string {
tmpl := `{
"name":"` + packageName + `",
"version":"%s",
"description":"` + packageDescription + `",
"codeRepository":"` + packageCodeRepositoryURL + `",
"licenseURL":"` + packageLicenseURL + `",
"author":{"givenName":"` + packageAuthor + `"},
"repositoryURLs":["` + strings.Join(packageRepositoryURLs, `","`) + `"]
}`
return fmt.Sprintf(tmpl, ver)
}
contentManifest1 := "// swift-tools-version:5.7\n//\n// Package.swift"
contentManifest2 := "// swift-tools-version:5.6\n//\n// Package@swift-5.6.swift"
@@ -135,7 +152,7 @@ func TestPackageSwift(t *testing.T) {
"Package.swift": contentManifest1,
"Package@swift-5.6.swift": contentManifest2,
}),
`{"name":"`+packageName+`","version":"`+packageVersion+`","description":"`+packageDescription+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`,
makePackageMetadataJSON(packageVersion),
)
pvs, err := packages.GetVersionsByPackageType(t.Context(), user.ID, packages.TypeSwift)
@@ -153,8 +170,8 @@ func TestPackageSwift(t *testing.T) {
assert.Len(t, metadata.Manifests, 2)
assert.Equal(t, contentManifest1, metadata.Manifests[""].Content)
assert.Equal(t, contentManifest2, metadata.Manifests["5.6"].Content)
assert.Len(t, pd.VersionProperties, 1)
assert.Equal(t, packageRepositoryURL, pd.VersionProperties.GetByName(swift_module.PropertyRepositoryURL))
assert.Len(t, pd.VersionProperties, 3)
assert.Equal(t, packageRepositoryURL1, pd.VersionProperties.GetByName(swift_module.PropertyRepositoryURL))
pfs, err := packages.GetFilesByVersionID(t.Context(), pvs[0].ID)
assert.NoError(t, err)
@@ -212,7 +229,7 @@ func TestPackageSwift(t *testing.T) {
"Package.swift": contentManifest1,
"Package@swift-5.6.swift": contentManifest2,
}),
`{"name":"`+packageName+`","version":"`+packageVersion2+`","description":"`+packageDescription+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`,
makePackageMetadataJSON(packageVersion2),
)
pvs, err := packages.GetVersionsByPackageType(t.Context(), user.ID, packages.TypeSwift)
@@ -230,8 +247,8 @@ func TestPackageSwift(t *testing.T) {
assert.Len(t, metadata.Manifests, 2)
assert.Equal(t, contentManifest1, metadata.Manifests[""].Content)
assert.Equal(t, contentManifest2, metadata.Manifests["5.6"].Content)
assert.Len(t, pd.VersionProperties, 1)
assert.Equal(t, packageRepositoryURL, pd.VersionProperties.GetByName(swift_module.PropertyRepositoryURL))
assert.Len(t, pd.VersionProperties, 3)
assert.Equal(t, packageRepositoryURL1, pd.VersionProperties.GetByName(swift_module.PropertyRepositoryURL))
pfs, err := packages.GetFilesByVersionID(t.Context(), thisPackageVersion.ID)
assert.NoError(t, err)
@@ -330,8 +347,11 @@ func TestPackageSwift(t *testing.T) {
assert.Equal(t, packageVersion, result.Metadata.Version)
assert.Equal(t, packageDescription, result.Metadata.Description)
assert.Equal(t, "Swift", result.Metadata.ProgrammingLanguage.Name)
assert.Equal(t, packageLicenseURL, result.Metadata.LicenseURL)
require.NotNil(t, result.Metadata.Author)
assert.Equal(t, packageAuthor, result.Metadata.Author.Name)
assert.Equal(t, packageAuthor, result.Metadata.Author.GivenName)
assert.ElementsMatch(t, packageRepositoryURLs, result.Metadata.RepositoryURLs)
req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s/%s.json", url, packageScope, packageName, packageVersion)).
AddBasicAuth(user.Name)
@@ -340,6 +360,41 @@ func TestPackageSwift(t *testing.T) {
assert.Equal(t, body, resp.Body.String())
})
t.Run("UploadEmptyJSONMetadata", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
uploadURL := fmt.Sprintf("%s/%s/%s/%s", url, packageScope, packageName, packageVersion3)
var body bytes.Buffer
mpw := multipart.NewWriter(&body)
part, err := mpw.CreateFormFile("source-archive", "source-archive.zip")
require.NoError(t, err)
_, err = io.Copy(part, test.WriteZipArchive(map[string]string{
"Package.swift": contentManifest1,
"Package@swift-5.6.swift": contentManifest2,
}))
require.NoError(t, err)
require.NoError(t, mpw.WriteField("metadata", "{}"))
require.NoError(t, mpw.Close())
req := NewRequestWithBody(t, "PUT", uploadURL, &body).
SetHeader("Content-Type", mpw.FormDataContentType()).
SetHeader("Accept", swift_router.AcceptJSON).
AddBasicAuth(user.Name)
MakeRequest(t, req, http.StatusCreated)
req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s/%s", url, packageScope, packageName, packageVersion3)).
AddBasicAuth(user.Name).
SetHeader("Accept", swift_router.AcceptJSON)
resp := MakeRequest(t, req, http.StatusOK)
result := DecodeJSON(t, resp, &swift_router.PackageVersionMetadataResponse{})
assert.Nil(t, result.Metadata.Author)
assert.Empty(t, result.Metadata.RepositoryURLs)
assert.Empty(t, result.Metadata.CodeRepository)
assert.Empty(t, result.Metadata.LicenseURL)
})
t.Run("DownloadManifest", func(t *testing.T) {
manifestURL := fmt.Sprintf("%s/%s/%s/%s/Package.swift", url, packageScope, packageName, packageVersion)
@@ -397,7 +452,7 @@ func TestPackageSwift(t *testing.T) {
req = NewRequest(t, "GET", url+"/identifiers?url=https://unknown.host/")
MakeRequest(t, req, http.StatusNotFound)
req = NewRequest(t, "GET", url+"/identifiers?url="+packageRepositoryURL).
req = NewRequest(t, "GET", url+"/identifiers?url="+packageRepositoryURL1).
SetHeader("Accept", swift_router.AcceptJSON)
resp = MakeRequest(t, req, http.StatusOK)