@@ -107,49 +107,37 @@ func (p Person) String() string {
107
107
return sb .String ()
108
108
}
109
109
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 {
124
114
manifestMatch := manifestPattern .FindStringSubmatch (path .Base (file .Name ))
125
115
if len (manifestMatch ) == 0 {
126
116
continue
127
117
}
128
118
129
119
if file .UncompressedSize64 > maxManifestFileSize {
130
- return nil , ErrManifestFileTooLarge
120
+ return false , ErrManifestFileTooLarge
131
121
}
132
122
133
- f , err := zr .Open (file . Name )
123
+ f , err := file .Open ()
134
124
if err != nil {
135
- return nil , err
125
+ return false , err
136
126
}
137
127
138
128
content , err := io .ReadAll (f )
139
-
140
129
if err := f .Close (); err != nil {
141
- return nil , err
130
+ return false , err
142
131
}
143
-
144
132
if err != nil {
145
- return nil , err
133
+ return false , err
146
134
}
147
135
148
136
swiftVersion := ""
149
137
if len (manifestMatch ) == 2 && manifestMatch [1 ] != "" {
150
138
v , err := version .NewSemver (manifestMatch [1 ])
151
139
if err != nil {
152
- return nil , ErrInvalidManifestVersion
140
+ return false , ErrInvalidManifestVersion
153
141
}
154
142
swiftVersion = TrimmedVersionString (v )
155
143
}
@@ -162,16 +150,57 @@ func ParsePackage(sr io.ReaderAt, size int64, mr io.Reader) (*Package, error) {
162
150
if len (toolsMatch ) == 2 {
163
151
v , err := version .NewSemver (toolsMatch [1 ])
164
152
if err != nil {
165
- return nil , ErrInvalidManifestVersion
153
+ return false , ErrInvalidManifestVersion
166
154
}
167
155
168
156
manifest .ToolsVersion = TrimmedVersionString (v )
169
157
}
170
158
171
159
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
+ }
172
201
}
173
202
174
- if _ , found := p . Metadata . Manifests [ "" ]; ! found {
203
+ if ! found {
175
204
return nil , ErrMissingManifestFile
176
205
}
177
206
0 commit comments