mirror of
https://github.com/go-gitea/gitea.git
synced 2026-08-19 19:18:34 +00:00
enhance: user-friendly packages setup manual (#38946)
* replace #35564 * fix #36992
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package debian
|
||||
|
||||
import (
|
||||
"context"
|
||||
"html/template"
|
||||
"strings"
|
||||
|
||||
packages_model "gitea.dev/models/packages"
|
||||
"gitea.dev/modules/container"
|
||||
"gitea.dev/modules/htmlutil"
|
||||
"gitea.dev/modules/httplib"
|
||||
debian_module "gitea.dev/modules/packages/debian"
|
||||
"gitea.dev/modules/util"
|
||||
packages_service "gitea.dev/services/packages"
|
||||
)
|
||||
|
||||
type Specialization struct {
|
||||
packages_service.SpecOnBeforeRemovePackageAll
|
||||
packages_service.SpecOnBeforeRemovePackageVersion
|
||||
}
|
||||
|
||||
var _ packages_service.Specialization = (*Specialization)(nil)
|
||||
|
||||
type debianViewData struct {
|
||||
Distributions []string
|
||||
Components []string
|
||||
Architectures []string
|
||||
}
|
||||
|
||||
func (s Specialization) GetViewPackageVersionData(ctx context.Context, pd *packages_model.PackageDescriptor) (any, error) {
|
||||
distributions := make(container.Set[string])
|
||||
components := make(container.Set[string])
|
||||
architectures := make(container.Set[string])
|
||||
for _, f := range pd.Files {
|
||||
for _, pp := range f.Properties {
|
||||
switch pp.Name {
|
||||
case debian_module.PropertyDistribution:
|
||||
distributions.Add(pp.Value)
|
||||
case debian_module.PropertyComponent:
|
||||
components.Add(pp.Value)
|
||||
case debian_module.PropertyArchitecture:
|
||||
architectures.Add(pp.Value)
|
||||
}
|
||||
}
|
||||
}
|
||||
viewData := debianViewData{
|
||||
Distributions: util.Sorted(distributions.Values()),
|
||||
Components: util.Sorted(components.Values()),
|
||||
Architectures: util.Sorted(architectures.Values()),
|
||||
}
|
||||
return viewData, nil
|
||||
}
|
||||
|
||||
func writeVarSelect(w *htmlutil.HTMLBuilder, varName string, varItems []string) {
|
||||
w.WriteFormatf(`<div>%s=<select data-code-var="%s">`, varName, varName)
|
||||
for _, v := range varItems {
|
||||
w.WriteFormatf(`<option value="%s">%s</option>`, v, v)
|
||||
}
|
||||
w.WriteHTML("</select></div>")
|
||||
}
|
||||
|
||||
func (s Specialization) RenderSetupManual(ctx context.Context, pkg *packages_model.PackageDescriptor, viewDataAny any) template.HTML {
|
||||
viewData := viewDataAny.(debianViewData) //nolint:forcetypeassert // must be valid
|
||||
const nl = "\n"
|
||||
appFullLink := strings.TrimSuffix(httplib.GuessCurrentAppURL(ctx), "/")
|
||||
|
||||
w := &htmlutil.HTMLBuilder{}
|
||||
w.WriteHTML(`<div data-global-init="initPackagesManualVars">`)
|
||||
{
|
||||
w.WriteHTML(`<div class="package-manual-vars">`)
|
||||
writeVarSelect(w, "distribution", viewData.Distributions)
|
||||
writeVarSelect(w, "component", viewData.Components)
|
||||
w.WriteHTML(`</div>`)
|
||||
}
|
||||
{
|
||||
w.WriteHTML(`<div class="markup"><pre class="code-block"><code>`)
|
||||
w.WriteFormatf(`sudo curl %s/api/packages/%s/debian/repository.key -o /etc/apt/keyrings/gitea-%s.asc`+nl+nl, appFullLink, pkg.Owner.Name, pkg.Owner.Name)
|
||||
w.WriteFormatf(`echo "deb [signed-by=/etc/apt/keyrings/gitea-%s.asc] %s/api/packages/%s/debian <span>$distribution</span> <span>$component</span>" | sudo tee -a /etc/apt/sources.list.d/gitea.list`+nl+nl, pkg.Owner.Name, appFullLink, pkg.Owner.Name)
|
||||
w.WriteHTML(`sudo apt update` + nl)
|
||||
w.WriteHTML(`</code></pre></div>`)
|
||||
}
|
||||
w.WriteHTML(`</div>`)
|
||||
return w.HTMLString()
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -37,6 +38,7 @@ type Specialization interface {
|
||||
OnBeforeRemovePackageAll(ctx context.Context, doer *user_model.User, pkg *packages_model.Package, pds []*packages_model.PackageDescriptor) error
|
||||
OnBeforeRemovePackageVersion(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) error
|
||||
GetViewPackageVersionData(ctx context.Context, pd *packages_model.PackageDescriptor) (any, error)
|
||||
RenderSetupManual(ctx context.Context, pkg *packages_model.PackageDescriptor, viewData any) template.HTML
|
||||
}
|
||||
|
||||
// PackageInfo describes a package
|
||||
|
||||
@@ -6,11 +6,13 @@ package pkgspec
|
||||
import (
|
||||
packages_model "gitea.dev/models/packages"
|
||||
packages_service "gitea.dev/services/packages"
|
||||
"gitea.dev/services/packages/debian"
|
||||
"gitea.dev/services/packages/terraform"
|
||||
)
|
||||
|
||||
func InitManager() error {
|
||||
mgr := packages_service.GetSpecManager()
|
||||
mgr.Add(packages_model.TypeDebian, &debian.Specialization{})
|
||||
mgr.Add(packages_model.TypeTerraformState, &terraform.Specialization{})
|
||||
// TODO: add more in the future, refactor the existing code to use this approach
|
||||
return nil
|
||||
|
||||
@@ -5,27 +5,49 @@ package packages
|
||||
|
||||
import (
|
||||
"context"
|
||||
"html/template"
|
||||
"sync"
|
||||
|
||||
packages_model "gitea.dev/models/packages"
|
||||
user_model "gitea.dev/models/user"
|
||||
)
|
||||
|
||||
type nop struct{}
|
||||
type SpecGetViewPackageVersionData struct{}
|
||||
|
||||
func (n *nop) GetViewPackageVersionData(ctx context.Context, pd *packages_model.PackageDescriptor) (any, error) {
|
||||
func (*SpecGetViewPackageVersionData) GetViewPackageVersionData(ctx context.Context, pd *packages_model.PackageDescriptor) (any, error) {
|
||||
return nil, nil //nolint:nilnil // no data, no error
|
||||
}
|
||||
|
||||
func (n *nop) OnBeforeRemovePackageAll(ctx context.Context, doer *user_model.User, pkg *packages_model.Package, pds []*packages_model.PackageDescriptor) error {
|
||||
type SpecOnBeforeRemovePackageAll struct{}
|
||||
|
||||
func (*SpecOnBeforeRemovePackageAll) OnBeforeRemovePackageAll(ctx context.Context, doer *user_model.User, pkg *packages_model.Package, pds []*packages_model.PackageDescriptor) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *nop) OnBeforeRemovePackageVersion(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) error {
|
||||
type SpecOnBeforeRemovePackageVersion struct{}
|
||||
|
||||
func (*SpecOnBeforeRemovePackageVersion) OnBeforeRemovePackageVersion(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ Specialization = (*nop)(nil)
|
||||
type SpecRenderUsageManual struct{}
|
||||
|
||||
func (*SpecRenderUsageManual) RenderSetupManual(ctx context.Context, pkg *packages_model.PackageDescriptor, viewData any) template.HTML {
|
||||
return ""
|
||||
}
|
||||
|
||||
type specDefault struct {
|
||||
SpecGetViewPackageVersionData
|
||||
SpecOnBeforeRemovePackageAll
|
||||
SpecOnBeforeRemovePackageVersion
|
||||
SpecRenderUsageManual
|
||||
}
|
||||
|
||||
func (n *specDefault) OnBeforeRemovePackageVersion(ctx context.Context, doer *user_model.User, pd *packages_model.PackageDescriptor) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ Specialization = (*specDefault)(nil)
|
||||
|
||||
type SpecManagerType struct {
|
||||
specMap map[packages_model.Type]Specialization
|
||||
@@ -41,7 +63,7 @@ func (m *SpecManagerType) Get(t packages_model.Type) Specialization {
|
||||
}
|
||||
spec := m.specMap[t]
|
||||
if spec == nil {
|
||||
return &nop{}
|
||||
return &specDefault{}
|
||||
}
|
||||
return spec
|
||||
}
|
||||
|
||||
@@ -14,7 +14,9 @@ import (
|
||||
packages_service "gitea.dev/services/packages"
|
||||
)
|
||||
|
||||
type Specialization struct{}
|
||||
type Specialization struct {
|
||||
packages_service.SpecRenderUsageManual
|
||||
}
|
||||
|
||||
var _ packages_service.Specialization = (*Specialization)(nil)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user