@@ -14,6 +14,7 @@ import (
14
14
"strings"
15
15
16
16
packages_model "code.gitea.io/gitea/models/packages"
17
+ alpine_model "code.gitea.io/gitea/models/packages/alpine"
17
18
"code.gitea.io/gitea/modules/context"
18
19
"code.gitea.io/gitea/modules/json"
19
20
packages_module "code.gitea.io/gitea/modules/packages"
@@ -30,6 +31,53 @@ func apiError(ctx *context.Context, status int, obj any) {
30
31
})
31
32
}
32
33
34
+ func createOrAddToExisting (ctx * context.Context , pck * alpine_module.Package , branch , repository , architecture string , buf packages_module.HashedSizeReader , fileMetadataRaw []byte ) {
35
+ _ , _ , err := packages_service .CreatePackageOrAddFileToExisting (
36
+ ctx ,
37
+ & packages_service.PackageCreationInfo {
38
+ PackageInfo : packages_service.PackageInfo {
39
+ Owner : ctx .Package .Owner ,
40
+ PackageType : packages_model .TypeAlpine ,
41
+ Name : pck .Name ,
42
+ Version : pck .Version ,
43
+ },
44
+ Creator : ctx .Doer ,
45
+ Metadata : pck .VersionMetadata ,
46
+ },
47
+ & packages_service.PackageFileCreationInfo {
48
+ PackageFileInfo : packages_service.PackageFileInfo {
49
+ Filename : fmt .Sprintf ("%s-%s.apk" , pck .Name , pck .Version ),
50
+ CompositeKey : fmt .Sprintf ("%s|%s|%s" , branch , repository , architecture ),
51
+ },
52
+ Creator : ctx .Doer ,
53
+ Data : buf ,
54
+ IsLead : true ,
55
+ Properties : map [string ]string {
56
+ alpine_module .PropertyBranch : branch ,
57
+ alpine_module .PropertyRepository : repository ,
58
+ alpine_module .PropertyArchitecture : architecture ,
59
+ alpine_module .PropertyMetadata : string (fileMetadataRaw ),
60
+ },
61
+ },
62
+ )
63
+ if err != nil {
64
+ switch err {
65
+ case packages_model .ErrDuplicatePackageVersion , packages_model .ErrDuplicatePackageFile :
66
+ apiError (ctx , http .StatusConflict , err )
67
+ case packages_service .ErrQuotaTotalCount , packages_service .ErrQuotaTypeSize , packages_service .ErrQuotaTotalSize :
68
+ apiError (ctx , http .StatusForbidden , err )
69
+ default :
70
+ apiError (ctx , http .StatusInternalServerError , err )
71
+ }
72
+ return
73
+ }
74
+
75
+ if err := alpine_service .BuildSpecificRepositoryFiles (ctx , ctx .Package .Owner .ID , branch , repository , pck .FileMetadata .Architecture ); err != nil {
76
+ apiError (ctx , http .StatusInternalServerError , err )
77
+ return
78
+ }
79
+ }
80
+
33
81
func GetRepositoryKey (ctx * context.Context ) {
34
82
_ , pub , err := alpine_service .GetOrCreateKeyPair (ctx , ctx .Package .Owner .ID )
35
83
if err != nil {
@@ -133,49 +181,36 @@ func UploadPackageFile(ctx *context.Context) {
133
181
return
134
182
}
135
183
136
- _ , _ , err = packages_service .CreatePackageOrAddFileToExisting (
137
- ctx ,
138
- & packages_service.PackageCreationInfo {
139
- PackageInfo : packages_service.PackageInfo {
140
- Owner : ctx .Package .Owner ,
141
- PackageType : packages_model .TypeAlpine ,
142
- Name : pck .Name ,
143
- Version : pck .Version ,
144
- },
145
- Creator : ctx .Doer ,
146
- Metadata : pck .VersionMetadata ,
147
- },
148
- & packages_service.PackageFileCreationInfo {
149
- PackageFileInfo : packages_service.PackageFileInfo {
150
- Filename : fmt .Sprintf ("%s-%s.apk" , pck .Name , pck .Version ),
151
- CompositeKey : fmt .Sprintf ("%s|%s|%s" , branch , repository , pck .FileMetadata .Architecture ),
152
- },
153
- Creator : ctx .Doer ,
154
- Data : buf ,
155
- IsLead : true ,
156
- Properties : map [string ]string {
157
- alpine_module .PropertyBranch : branch ,
158
- alpine_module .PropertyRepository : repository ,
159
- alpine_module .PropertyArchitecture : pck .FileMetadata .Architecture ,
160
- alpine_module .PropertyMetadata : string (fileMetadataRaw ),
161
- },
162
- },
163
- )
164
- if err != nil {
165
- switch err {
166
- case packages_model .ErrDuplicatePackageVersion , packages_model .ErrDuplicatePackageFile :
167
- apiError (ctx , http .StatusConflict , err )
168
- case packages_service .ErrQuotaTotalCount , packages_service .ErrQuotaTypeSize , packages_service .ErrQuotaTotalSize :
169
- apiError (ctx , http .StatusForbidden , err )
170
- default :
184
+ // Check whether the package being uploaded has no architecture defined.
185
+ // If true, loop through the available architectures in the repo and create
186
+ // the package file for the each architecture. If there are no architectures
187
+ // available on the repository, fallback to x86_64
188
+ if pck .FileMetadata .Architecture == "noarch" {
189
+ architectures , err := alpine_model .GetArchitectures (ctx , ctx .Package .Owner .ID , repository )
190
+ if err != nil {
171
191
apiError (ctx , http .StatusInternalServerError , err )
192
+ return
172
193
}
173
- return
174
- }
175
194
176
- if err := alpine_service .BuildSpecificRepositoryFiles (ctx , ctx .Package .Owner .ID , branch , repository , pck .FileMetadata .Architecture ); err != nil {
177
- apiError (ctx , http .StatusInternalServerError , err )
178
- return
195
+ if len (architectures ) == 0 {
196
+ architectures = []string {
197
+ "x86_64" ,
198
+ }
199
+ }
200
+
201
+ for _ , arch := range architectures {
202
+ pck .FileMetadata .Architecture = arch
203
+
204
+ fileMetadataRaw , err := json .Marshal (pck .FileMetadata )
205
+ if err != nil {
206
+ apiError (ctx , http .StatusInternalServerError , err )
207
+ return
208
+ }
209
+
210
+ createOrAddToExisting (ctx , pck , branch , repository , pck .FileMetadata .Architecture , buf , fileMetadataRaw )
211
+ }
212
+ } else {
213
+ createOrAddToExisting (ctx , pck , branch , repository , pck .FileMetadata .Architecture , buf , fileMetadataRaw )
179
214
}
180
215
181
216
ctx .Status (http .StatusCreated )
0 commit comments