Skip to content

Commit 6ded601

Browse files
committed
Fixes: Swift Package Manager Publishing using commandline throws error go-gitea#33990
1 parent 2a59dfb commit 6ded601

File tree

2 files changed

+116
-11
lines changed

2 files changed

+116
-11
lines changed

routers/api/packages/swift/swift.go

+23-7
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,18 @@ func UploadPackageFile(ctx *context.Context) {
304304

305305
packageVersion := v.Core().String()
306306

307-
file, _, err := ctx.Req.FormFile("source-archive")
307+
var file io.ReadCloser
308+
multipartFile, _, err := ctx.Req.FormFile("source-archive")
308309
if err != nil {
309-
apiError(ctx, http.StatusBadRequest, err)
310-
return
310+
content := ctx.Req.FormValue("source-archive")
311+
if content != "" {
312+
file = io.NopCloser(strings.NewReader(content))
313+
} else {
314+
apiError(ctx, http.StatusBadRequest, err)
315+
return
316+
}
317+
} else {
318+
file = multipartFile
311319
}
312320
defer file.Close()
313321

@@ -318,10 +326,18 @@ func UploadPackageFile(ctx *context.Context) {
318326
}
319327
defer buf.Close()
320328

321-
var mr io.Reader
322-
metadata := ctx.Req.FormValue("metadata")
323-
if metadata != "" {
324-
mr = strings.NewReader(metadata)
329+
var mr io.ReadCloser
330+
metadataFile, _, err := ctx.Req.FormFile("metadata")
331+
if err != nil {
332+
metadata := ctx.Req.FormValue("metadata")
333+
if metadata != "" {
334+
mr = io.NopCloser(strings.NewReader(metadata))
335+
}
336+
} else {
337+
mr = metadataFile
338+
}
339+
if mr != nil {
340+
defer mr.Close()
325341
}
326342

327343
pck, err := swift_module.ParsePackage(buf, buf.Size(), mr)

tests/integration/api_packages_swift_test.go

+93-4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func TestPackageSwift(t *testing.T) {
3434
packageName := "test_package"
3535
packageID := packageScope + "." + packageName
3636
packageVersion := "1.0.3"
37+
packageVersion2 := "1.0.4"
3738
packageAuthor := "KN4CK3R"
3839
packageDescription := "Gitea Test Package"
3940
packageRepositoryURL := "https://gitea.io/gitea/gitea"
@@ -183,6 +184,94 @@ func TestPackageSwift(t *testing.T) {
183184
)
184185
})
185186

187+
t.Run("UploadMultipart", func(t *testing.T) {
188+
defer tests.PrintCurrentTest(t)()
189+
190+
uploadPackage := func(t *testing.T, url string, expectedStatus int, sr io.Reader, metadata string) {
191+
var body bytes.Buffer
192+
mpw := multipart.NewWriter(&body)
193+
194+
// Read the source archive content
195+
sourceContent, err := io.ReadAll(sr)
196+
assert.NoError(t, err)
197+
mpw.WriteField("source-archive", string(sourceContent))
198+
199+
if metadata != "" {
200+
mpw.WriteField("metadata", metadata)
201+
}
202+
203+
mpw.Close()
204+
205+
req := NewRequestWithBody(t, "PUT", url, &body).
206+
SetHeader("Content-Type", mpw.FormDataContentType()).
207+
SetHeader("Accept", swift_router.AcceptJSON).
208+
AddBasicAuth(user.Name)
209+
MakeRequest(t, req, expectedStatus)
210+
}
211+
212+
createArchive := func(files map[string]string) *bytes.Buffer {
213+
var buf bytes.Buffer
214+
zw := zip.NewWriter(&buf)
215+
for filename, content := range files {
216+
w, _ := zw.Create(filename)
217+
w.Write([]byte(content))
218+
}
219+
zw.Close()
220+
return &buf
221+
}
222+
223+
uploadURL := fmt.Sprintf("%s/%s/%s/%s", url, packageScope, packageName, packageVersion2)
224+
225+
req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader([]byte{}))
226+
MakeRequest(t, req, http.StatusUnauthorized)
227+
228+
// Test with metadata as form field
229+
uploadPackage(
230+
t,
231+
uploadURL,
232+
http.StatusCreated,
233+
createArchive(map[string]string{
234+
"Package.swift": contentManifest1,
235+
"[email protected]": contentManifest2,
236+
}),
237+
`{"name":"`+packageName+`","version":"`+packageVersion2+`","description":"`+packageDescription+`","codeRepository":"`+packageRepositoryURL+`","author":{"givenName":"`+packageAuthor+`"},"repositoryURLs":["`+packageRepositoryURL+`"]}`,
238+
)
239+
240+
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeSwift)
241+
assert.NoError(t, err)
242+
assert.Len(t, pvs, 2)
243+
244+
pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[1])
245+
assert.NoError(t, err)
246+
assert.NotNil(t, pd.SemVer)
247+
assert.Equal(t, packageID, pd.Package.Name)
248+
assert.Equal(t, packageVersion2, pd.Version.Version)
249+
assert.IsType(t, &swift_module.Metadata{}, pd.Metadata)
250+
metadata := pd.Metadata.(*swift_module.Metadata)
251+
assert.Equal(t, packageDescription, metadata.Description)
252+
assert.Len(t, metadata.Manifests, 2)
253+
assert.Equal(t, contentManifest1, metadata.Manifests[""].Content)
254+
assert.Equal(t, contentManifest2, metadata.Manifests["5.6"].Content)
255+
assert.Len(t, pd.VersionProperties, 1)
256+
assert.Equal(t, packageRepositoryURL, pd.VersionProperties.GetByName(swift_module.PropertyRepositoryURL))
257+
258+
pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[1].ID)
259+
assert.NoError(t, err)
260+
assert.Len(t, pfs, 1)
261+
assert.Equal(t, fmt.Sprintf("%s-%s.zip", packageName, packageVersion2), pfs[0].Name)
262+
assert.True(t, pfs[0].IsLead)
263+
264+
uploadPackage(
265+
t,
266+
uploadURL,
267+
http.StatusConflict,
268+
createArchive(map[string]string{
269+
"Package.swift": contentManifest1,
270+
}),
271+
"",
272+
)
273+
})
274+
186275
t.Run("Download", func(t *testing.T) {
187276
defer tests.PrintCurrentTest(t)()
188277

@@ -211,7 +300,7 @@ func TestPackageSwift(t *testing.T) {
211300
SetHeader("Accept", swift_router.AcceptJSON)
212301
resp := MakeRequest(t, req, http.StatusOK)
213302

214-
versionURL := setting.AppURL + url[1:] + fmt.Sprintf("/%s/%s/%s", packageScope, packageName, packageVersion)
303+
versionURL := setting.AppURL + url[1:] + fmt.Sprintf("/%s/%s/%s", packageScope, packageName, packageVersion2)
215304

216305
assert.Equal(t, "1", resp.Header().Get("Content-Version"))
217306
assert.Equal(t, fmt.Sprintf(`<%s>; rel="latest-version"`, versionURL), resp.Header().Get("Link"))
@@ -221,9 +310,9 @@ func TestPackageSwift(t *testing.T) {
221310
var result *swift_router.EnumeratePackageVersionsResponse
222311
DecodeJSON(t, resp, &result)
223312

224-
assert.Len(t, result.Releases, 1)
225-
assert.Contains(t, result.Releases, packageVersion)
226-
assert.Equal(t, versionURL, result.Releases[packageVersion].URL)
313+
assert.Len(t, result.Releases, 2)
314+
assert.Contains(t, result.Releases, packageVersion2)
315+
assert.Equal(t, versionURL, result.Releases[packageVersion2].URL)
227316

228317
req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s.json", url, packageScope, packageName)).
229318
AddBasicAuth(user.Name)

0 commit comments

Comments
 (0)