Skip to content

Commit 29007c0

Browse files
Alexandre OliveiraEarl Warren
authored andcommitted
Fix Alpine Registry packages with noarch not being found (go-gitea#2285)
Fixes go-gitea#2173 ~~Still requires a bit of work to do, I'm not 100% happy with this solution.~~ The idea is to copy the noarch package to the architectures available in the package repository. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2285 Reviewed-by: Earl Warren <[email protected]> Co-authored-by: Alexandre Oliveira <[email protected]> Co-committed-by: Alexandre Oliveira <[email protected]>
1 parent 7b4dba3 commit 29007c0

File tree

2 files changed

+337
-40
lines changed

2 files changed

+337
-40
lines changed

routers/api/packages/alpine/alpine.go

Lines changed: 75 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"strings"
1515

1616
packages_model "code.gitea.io/gitea/models/packages"
17+
alpine_model "code.gitea.io/gitea/models/packages/alpine"
1718
"code.gitea.io/gitea/modules/context"
1819
"code.gitea.io/gitea/modules/json"
1920
packages_module "code.gitea.io/gitea/modules/packages"
@@ -30,6 +31,53 @@ func apiError(ctx *context.Context, status int, obj any) {
3031
})
3132
}
3233

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+
3381
func GetRepositoryKey(ctx *context.Context) {
3482
_, pub, err := alpine_service.GetOrCreateKeyPair(ctx, ctx.Package.Owner.ID)
3583
if err != nil {
@@ -133,49 +181,36 @@ func UploadPackageFile(ctx *context.Context) {
133181
return
134182
}
135183

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 {
171191
apiError(ctx, http.StatusInternalServerError, err)
192+
return
172193
}
173-
return
174-
}
175194

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)
179214
}
180215

181216
ctx.Status(http.StatusCreated)

0 commit comments

Comments
 (0)