Skip to content

Commit 9f4f64e

Browse files
committed
Swift Package Manager Publishing using commandline throws error (go-gitea#33990)
1 parent 2a59dfb commit 9f4f64e

File tree

2 files changed

+70
-24
lines changed

2 files changed

+70
-24
lines changed

modules/packages/swift/metadata.go

+53-24
Original file line numberDiff line numberDiff line change
@@ -107,49 +107,37 @@ func (p Person) String() string {
107107
return sb.String()
108108
}
109109

110-
// ParsePackage parses the Swift package upload
111-
func ParsePackage(sr io.ReaderAt, size int64, mr io.Reader) (*Package, error) {
112-
zr, err := zip.NewReader(sr, size)
113-
if err != nil {
114-
return nil, err
115-
}
116-
117-
p := &Package{
118-
Metadata: &Metadata{
119-
Manifests: make(map[string]*Manifest),
120-
},
121-
}
122-
123-
for _, file := range zr.File {
110+
// findManifestInFiles searches for Package.swift files in the given files and adds them to the package metadata
111+
func findManifestInFiles(files []*zip.File, p *Package) (bool, error) {
112+
found := false
113+
for _, file := range files {
124114
manifestMatch := manifestPattern.FindStringSubmatch(path.Base(file.Name))
125115
if len(manifestMatch) == 0 {
126116
continue
127117
}
128118

129119
if file.UncompressedSize64 > maxManifestFileSize {
130-
return nil, ErrManifestFileTooLarge
120+
return false, ErrManifestFileTooLarge
131121
}
132122

133-
f, err := zr.Open(file.Name)
123+
f, err := file.Open()
134124
if err != nil {
135-
return nil, err
125+
return false, err
136126
}
137127

138128
content, err := io.ReadAll(f)
139-
140129
if err := f.Close(); err != nil {
141-
return nil, err
130+
return false, err
142131
}
143-
144132
if err != nil {
145-
return nil, err
133+
return false, err
146134
}
147135

148136
swiftVersion := ""
149137
if len(manifestMatch) == 2 && manifestMatch[1] != "" {
150138
v, err := version.NewSemver(manifestMatch[1])
151139
if err != nil {
152-
return nil, ErrInvalidManifestVersion
140+
return false, ErrInvalidManifestVersion
153141
}
154142
swiftVersion = TrimmedVersionString(v)
155143
}
@@ -162,16 +150,57 @@ func ParsePackage(sr io.ReaderAt, size int64, mr io.Reader) (*Package, error) {
162150
if len(toolsMatch) == 2 {
163151
v, err := version.NewSemver(toolsMatch[1])
164152
if err != nil {
165-
return nil, ErrInvalidManifestVersion
153+
return false, ErrInvalidManifestVersion
166154
}
167155

168156
manifest.ToolsVersion = TrimmedVersionString(v)
169157
}
170158

171159
p.Metadata.Manifests[swiftVersion] = manifest
160+
found = true
161+
}
162+
return found, nil
163+
}
164+
165+
// ParsePackage parses the Swift package upload
166+
func ParsePackage(sr io.ReaderAt, size int64, mr io.Reader) (*Package, error) {
167+
zr, err := zip.NewReader(sr, size)
168+
if err != nil {
169+
return nil, err
170+
}
171+
172+
p := &Package{
173+
Metadata: &Metadata{
174+
Manifests: make(map[string]*Manifest),
175+
},
176+
}
177+
178+
// First try to find Package.swift in the root
179+
rootFiles := make([]*zip.File, 0)
180+
subdirFiles := make([]*zip.File, 0)
181+
182+
for _, file := range zr.File {
183+
if strings.Contains(file.Name, "/") {
184+
subdirFiles = append(subdirFiles, file)
185+
} else {
186+
rootFiles = append(rootFiles, file)
187+
}
188+
}
189+
190+
found, err := findManifestInFiles(rootFiles, p)
191+
if err != nil {
192+
return nil, err
193+
}
194+
195+
// If no manifest found in root, look in subdirectories
196+
if !found {
197+
found, err = findManifestInFiles(subdirFiles, p)
198+
if err != nil {
199+
return nil, err
200+
}
172201
}
173202

174-
if _, found := p.Metadata.Manifests[""]; !found {
203+
if !found {
175204
return nil, ErrMissingManifestFile
176205
}
177206

modules/packages/swift/metadata_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,23 @@ func TestParsePackage(t *testing.T) {
101101
assert.Equal(t, packageRepositoryURL, p.Metadata.RepositoryURL)
102102
assert.ElementsMatch(t, []string{packageRepositoryURL}, p.RepositoryURLs)
103103
})
104+
105+
t.Run("NestedManifest", func(t *testing.T) {
106+
content := "// swift-tools-version:5.7\n//\n// Package.swift"
107+
data := createArchive(map[string][]byte{
108+
"test.TestLib/Package.swift": []byte(content),
109+
})
110+
111+
p, err := ParsePackage(data, data.Size(), nil)
112+
assert.NotNil(t, p)
113+
assert.NoError(t, err)
114+
115+
assert.NotNil(t, p.Metadata)
116+
assert.Len(t, p.Metadata.Manifests, 1)
117+
m := p.Metadata.Manifests[""]
118+
assert.Equal(t, "5.7", m.ToolsVersion)
119+
assert.Equal(t, content, m.Content)
120+
})
104121
}
105122

106123
func TestTrimmedVersionString(t *testing.T) {

0 commit comments

Comments
 (0)