Skip to content

Commit b208df1

Browse files
feat: add rpm support for multiple distributions (go-gitea#25304)
1 parent ef90fdb commit b208df1

File tree

4 files changed

+38
-27
lines changed

4 files changed

+38
-27
lines changed

routers/api/packages/api.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -513,14 +513,14 @@ func CommonRoutes() *web.Route {
513513
r.Get("/simple/{id}", pypi.PackageMetadata)
514514
}, reqPackageAccess(perm.AccessModeRead))
515515
r.Group("/rpm", func() {
516-
r.Get(".repo", rpm.GetRepositoryConfig)
516+
r.Get("/{distribution}.repo", rpm.GetRepositoryConfig)
517517
r.Get("/repository.key", rpm.GetRepositoryKey)
518-
r.Put("/upload", reqPackageAccess(perm.AccessModeWrite), rpm.UploadPackageFile)
519-
r.Group("/package/{name}/{version}/{architecture}", func() {
518+
r.Put("/{distribution}/upload", reqPackageAccess(perm.AccessModeWrite), rpm.UploadPackageFile)
519+
r.Group("/{distribution}/package/{name}/{version}/{architecture}", func() {
520520
r.Get("", rpm.DownloadPackageFile)
521521
r.Delete("", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile)
522522
})
523-
r.Get("/repodata/{filename}", rpm.GetRepositoryFile)
523+
r.Get("/{distribution}/repodata/{filename}", rpm.GetRepositoryFile)
524524
}, reqPackageAccess(perm.AccessModeRead))
525525
r.Group("/rubygems", func() {
526526
r.Get("/specs.4.8.gz", rubygems.EnumeratePackages)

routers/api/packages/rpm/rpm.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ func apiError(ctx *context.Context, status int, obj any) {
3333

3434
// https://dnf.readthedocs.io/en/latest/conf_ref.html
3535
func GetRepositoryConfig(ctx *context.Context) {
36+
distribution := ctx.Params("distribution")
3637
url := fmt.Sprintf("%sapi/packages/%s/rpm", setting.AppURL, ctx.Package.Owner.Name)
3738

3839
ctx.PlainText(http.StatusOK, `[gitea-`+ctx.Package.Owner.LowerName+`]
3940
name=`+ctx.Package.Owner.Name+` - `+setting.AppName+`
40-
baseurl=`+url+`
41+
baseurl=`+url+`/`+distribution+`
4142
enabled=1
4243
gpgcheck=1
4344
gpgkey=`+url+`/repository.key`)
@@ -59,6 +60,7 @@ func GetRepositoryKey(ctx *context.Context) {
5960

6061
// Gets a pre-generated repository metadata file
6162
func GetRepositoryFile(ctx *context.Context) {
63+
distribution := ctx.Params("distribution")
6264
pv, err := rpm_service.GetOrCreateRepositoryVersion(ctx.Package.Owner.ID)
6365
if err != nil {
6466
apiError(ctx, http.StatusInternalServerError, err)
@@ -69,7 +71,8 @@ func GetRepositoryFile(ctx *context.Context) {
6971
ctx,
7072
pv,
7173
&packages_service.PackageFileInfo{
72-
Filename: ctx.Params("filename"),
74+
Filename: ctx.Params("filename"),
75+
CompositeKey: distribution,
7376
},
7477
)
7578
if err != nil {
@@ -85,6 +88,7 @@ func GetRepositoryFile(ctx *context.Context) {
8588
}
8689

8790
func UploadPackageFile(ctx *context.Context) {
91+
distribution := ctx.Params("distribution")
8892
upload, close, err := ctx.UploadStream()
8993
if err != nil {
9094
apiError(ctx, http.StatusInternalServerError, err)
@@ -135,7 +139,8 @@ func UploadPackageFile(ctx *context.Context) {
135139
},
136140
&packages_service.PackageFileCreationInfo{
137141
PackageFileInfo: packages_service.PackageFileInfo{
138-
Filename: fmt.Sprintf("%s-%s.%s.rpm", pck.Name, pck.Version, pck.FileMetadata.Architecture),
142+
Filename: fmt.Sprintf("%s-%s.%s.rpm", pck.Name, pck.Version, pck.FileMetadata.Architecture),
143+
CompositeKey: distribution,
139144
},
140145
Creator: ctx.Doer,
141146
Data: buf,
@@ -157,7 +162,7 @@ func UploadPackageFile(ctx *context.Context) {
157162
return
158163
}
159164

160-
if err := rpm_service.BuildRepositoryFiles(ctx, ctx.Package.Owner.ID); err != nil {
165+
if err := rpm_service.BuildRepositoryFiles(ctx, ctx.Package.Owner.ID, distribution); err != nil {
161166
apiError(ctx, http.StatusInternalServerError, err)
162167
return
163168
}
@@ -197,6 +202,7 @@ func DeletePackageFile(webctx *context.Context) {
197202
name := webctx.Params("name")
198203
version := webctx.Params("version")
199204
architecture := webctx.Params("architecture")
205+
distribution := webctx.Params("distribution")
200206

201207
var pd *packages_model.PackageDescriptor
202208

@@ -250,7 +256,7 @@ func DeletePackageFile(webctx *context.Context) {
250256
notification.NotifyPackageDelete(webctx, webctx.Doer, pd)
251257
}
252258

253-
if err := rpm_service.BuildRepositoryFiles(webctx, webctx.Package.Owner.ID); err != nil {
259+
if err := rpm_service.BuildRepositoryFiles(webctx, webctx.Package.Owner.ID, distribution); err != nil {
254260
apiError(webctx, http.StatusInternalServerError, err)
255261
return
256262
}

services/packages/rpm/repository.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,17 @@ type packageData struct {
127127
type packageCache = map[*packages_model.PackageFile]*packageData
128128

129129
// BuildSpecificRepositoryFiles builds metadata files for the repository
130-
func BuildRepositoryFiles(ctx context.Context, ownerID int64) error {
130+
func BuildRepositoryFiles(ctx context.Context, ownerID int64, distribution string) error {
131131
pv, err := GetOrCreateRepositoryVersion(ownerID)
132132
if err != nil {
133133
return err
134134
}
135135

136136
pfs, _, err := packages_model.SearchFiles(ctx, &packages_model.PackageFileSearchOptions{
137-
OwnerID: ownerID,
138-
PackageType: packages_model.TypeRpm,
139-
Query: "%.rpm",
137+
OwnerID: ownerID,
138+
PackageType: packages_model.TypeRpm,
139+
Query: "%.rpm",
140+
CompositeKey: distribution,
140141
})
141142
if err != nil {
142143
return err
@@ -198,15 +199,15 @@ func BuildRepositoryFiles(ctx context.Context, ownerID int64) error {
198199
cache[pf] = pd
199200
}
200201

201-
primary, err := buildPrimary(pv, pfs, cache)
202+
primary, err := buildPrimary(pv, pfs, cache, distribution)
202203
if err != nil {
203204
return err
204205
}
205-
filelists, err := buildFilelists(pv, pfs, cache)
206+
filelists, err := buildFilelists(pv, pfs, cache, distribution)
206207
if err != nil {
207208
return err
208209
}
209-
other, err := buildOther(pv, pfs, cache)
210+
other, err := buildOther(pv, pfs, cache, distribution)
210211
if err != nil {
211212
return err
212213
}
@@ -219,11 +220,12 @@ func BuildRepositoryFiles(ctx context.Context, ownerID int64) error {
219220
filelists,
220221
other,
221222
},
223+
distribution,
222224
)
223225
}
224226

225227
// https://docs.pulpproject.org/en/2.19/plugins/pulp_rpm/tech-reference/rpm.html#repomd-xml
226-
func buildRepomd(pv *packages_model.PackageVersion, ownerID int64, data []*repoData) error {
228+
func buildRepomd(pv *packages_model.PackageVersion, ownerID int64, data []*repoData, distribution string) error {
227229
type Repomd struct {
228230
XMLName xml.Name `xml:"repomd"`
229231
Xmlns string `xml:"xmlns,attr"`
@@ -274,7 +276,8 @@ func buildRepomd(pv *packages_model.PackageVersion, ownerID int64, data []*repoD
274276
pv,
275277
&packages_service.PackageFileCreationInfo{
276278
PackageFileInfo: packages_service.PackageFileInfo{
277-
Filename: file.Name,
279+
Filename: file.Name,
280+
CompositeKey: distribution,
278281
},
279282
Creator: user_model.NewGhostUser(),
280283
Data: file.Data,
@@ -291,7 +294,7 @@ func buildRepomd(pv *packages_model.PackageVersion, ownerID int64, data []*repoD
291294
}
292295

293296
// https://docs.pulpproject.org/en/2.19/plugins/pulp_rpm/tech-reference/rpm.html#primary-xml
294-
func buildPrimary(pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache) (*repoData, error) {
297+
func buildPrimary(pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, distribution string) (*repoData, error) {
295298
type Version struct {
296299
Epoch string `xml:"epoch,attr"`
297300
Version string `xml:"ver,attr"`
@@ -430,11 +433,11 @@ func buildPrimary(pv *packages_model.PackageVersion, pfs []*packages_model.Packa
430433
XmlnsRpm: "http://linux.duke.edu/metadata/rpm",
431434
PackageCount: len(pfs),
432435
Packages: packages,
433-
})
436+
}, distribution)
434437
}
435438

436439
// https://docs.pulpproject.org/en/2.19/plugins/pulp_rpm/tech-reference/rpm.html#filelists-xml
437-
func buildFilelists(pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache) (*repoData, error) { //nolint:dupl
440+
func buildFilelists(pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, distribution string) (*repoData, error) { //nolint:dupl
438441
type Version struct {
439442
Epoch string `xml:"epoch,attr"`
440443
Version string `xml:"ver,attr"`
@@ -477,11 +480,12 @@ func buildFilelists(pv *packages_model.PackageVersion, pfs []*packages_model.Pac
477480
Xmlns: "http://linux.duke.edu/metadata/other",
478481
PackageCount: len(pfs),
479482
Packages: packages,
480-
})
483+
},
484+
distribution)
481485
}
482486

483487
// https://docs.pulpproject.org/en/2.19/plugins/pulp_rpm/tech-reference/rpm.html#other-xml
484-
func buildOther(pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache) (*repoData, error) { //nolint:dupl
488+
func buildOther(pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, distribution string) (*repoData, error) { //nolint:dupl
485489
type Version struct {
486490
Epoch string `xml:"epoch,attr"`
487491
Version string `xml:"ver,attr"`
@@ -524,7 +528,7 @@ func buildOther(pv *packages_model.PackageVersion, pfs []*packages_model.Package
524528
Xmlns: "http://linux.duke.edu/metadata/other",
525529
PackageCount: len(pfs),
526530
Packages: packages,
527-
})
531+
}, distribution)
528532
}
529533

530534
// writtenCounter counts all written bytes
@@ -544,7 +548,7 @@ func (wc *writtenCounter) Written() int64 {
544548
return wc.written
545549
}
546550

547-
func addDataAsFileToRepo(pv *packages_model.PackageVersion, filetype string, obj any) (*repoData, error) {
551+
func addDataAsFileToRepo(pv *packages_model.PackageVersion, filetype string, obj any, distribution string) (*repoData, error) {
548552
content, _ := packages_module.NewHashedBuffer()
549553
gzw := gzip.NewWriter(content)
550554
wc := &writtenCounter{}
@@ -567,7 +571,8 @@ func addDataAsFileToRepo(pv *packages_model.PackageVersion, filetype string, obj
567571
pv,
568572
&packages_service.PackageFileCreationInfo{
569573
PackageFileInfo: packages_service.PackageFileInfo{
570-
Filename: filename,
574+
Filename: filename,
575+
CompositeKey: distribution,
571576
},
572577
Creator: user_model.NewGhostUser(),
573578
Data: content,

templates/package/content/rpm.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<div class="ui form">
55
<div class="field">
66
<label>{{svg "octicon-terminal"}} {{.locale.Tr "packages.rpm.registry"}}</label>
7-
<div class="markup"><pre class="code-block"><code>dnf config-manager --add-repo <gitea-origin-url data-url="{{AppSubUrl}}/api/packages/{{$.PackageDescriptor.Owner.Name}}/rpm.repo"></gitea-origin-url></code></pre></div>
7+
<div class="markup"><pre class="code-block"><code>dnf config-manager --add-repo <gitea-origin-url data-url="{{AppSubUrl}}/api/packages/{{$.PackageDescriptor.Owner.Name}}/rpm/distribution.repo"></gitea-origin-url></code></pre></div>
88
</div>
99
<div class="field">
1010
<label>{{svg "octicon-terminal"}} {{.locale.Tr "packages.rpm.install"}}</label>

0 commit comments

Comments
 (0)