From 0d08eaa55600992639ab1b938489a113fa4ebe95 Mon Sep 17 00:00:00 2001 From: Danila Fominykh Date: Tue, 8 Aug 2023 19:40:54 +0300 Subject: [PATCH] reduced amount of logic, removed unnecessary fields --- models/packages/package_file.go | 2 + models/packages/package_property.go | 13 +++ modules/packages/arch/metadata.go | 1 - routers/api/packages/arch/arch.go | 70 +++++++------- services/packages/arch/service.go | 137 ++-------------------------- templates/package/content/arch.tmpl | 7 -- 6 files changed, 53 insertions(+), 177 deletions(-) diff --git a/models/packages/package_file.go b/models/packages/package_file.go index 1c2c9ac072..0200a354cb 100644 --- a/models/packages/package_file.go +++ b/models/packages/package_file.go @@ -25,6 +25,8 @@ var ( ErrDuplicatePackageFile = util.NewAlreadyExistErrorf("package file already exists") // ErrPackageFileNotExist indicates a package file not exist error ErrPackageFileNotExist = util.NewNotExistErrorf("package file does not exist") + // ErrPackagePropertyNotExist indicates a package property not exist error + ErrPackagePropertyNotExist = util.NewNotExistErrorf("package property does not exist") ) // EmptyFileKey is a named constant for an empty file key diff --git a/models/packages/package_property.go b/models/packages/package_property.go index e0170016cf..728b3135da 100644 --- a/models/packages/package_property.go +++ b/models/packages/package_property.go @@ -60,6 +60,19 @@ func GetPropertiesByName(ctx context.Context, refType PropertyType, refID int64, return pps, db.GetEngine(ctx).Where("ref_type = ? AND ref_id = ? AND name = ?", refType, refID, name).Find(&pps) } +// GetPropertieWithUniqueName gets propertie with unique name +func GetPropertieWithUniqueName(ctx context.Context, name string) (*PackageProperty, error) { + p := &PackageProperty{Name: name} + has, err := db.GetEngine(ctx).Get(p) + if err != nil { + return nil, err + } + if !has { + return nil, ErrPackagePropertyNotExist + } + return p, nil +} + // UpdateProperty updates a property func UpdateProperty(ctx context.Context, pp *PackageProperty) error { _, err := db.GetEngine(ctx).ID(pp.ID).Update(pp) diff --git a/modules/packages/arch/metadata.go b/modules/packages/arch/metadata.go index 510c03e271..946233d2d7 100644 --- a/modules/packages/arch/metadata.go +++ b/modules/packages/arch/metadata.go @@ -32,7 +32,6 @@ type Metadata struct { MakeDepends []string `json:"make-depends,omitempty"` CheckDepends []string `json:"check-depends,omitempty"` Backup []string `json:"backup,omitempty"` - DistroArch []string `json:"distro-arch,omitempty"` } // Package description file that will be saved as .desc file in object storage. diff --git a/routers/api/packages/arch/arch.go b/routers/api/packages/arch/arch.go index 0b6ba83c92..7ad7b40d6f 100644 --- a/routers/api/packages/arch/arch.go +++ b/routers/api/packages/arch/arch.go @@ -5,6 +5,7 @@ package arch import ( "bytes" + "encoding/hex" "io" "net/http" "strings" @@ -59,17 +60,15 @@ func Push(ctx *context.Context) { return } - md := &arch_module.Metadata{ - URL: desc.URL, - Description: desc.Description, - Provides: desc.Provides, - License: desc.License, - Depends: desc.Depends, - OptDepends: desc.OptDepends, - MakeDepends: desc.MakeDepends, - CheckDepends: desc.CheckDepends, - Backup: desc.Backup, - DistroArch: []string{distro + "-" + desc.Arch[0]}, + props := map[string]string{ + distro + "-" + filename + ".desc": desc.String(), + } + if sign != "" { + _, err := hex.DecodeString(sign) + if err != nil { + apiError(ctx, http.StatusBadRequest, err) + } + props[distro+"-"+filename+".sig"] = sign } ver, _, err := pkg_service.CreatePackageOrAddFileToExisting( @@ -80,8 +79,18 @@ func Push(ctx *context.Context) { Name: desc.Name, Version: desc.Version, }, - Creator: ctx.ContextUser, - Metadata: md, + Creator: ctx.ContextUser, + Metadata: &arch_module.Metadata{ + URL: desc.URL, + Description: desc.Description, + Provides: desc.Provides, + License: desc.License, + Depends: desc.Depends, + OptDepends: desc.OptDepends, + MakeDepends: desc.MakeDepends, + CheckDepends: desc.CheckDepends, + Backup: desc.Backup, + }, }, &pkg_service.PackageFileCreationInfo{ PackageFileInfo: pkg_service.PackageFileInfo{ @@ -92,6 +101,7 @@ func Push(ctx *context.Context) { IsLead: true, Creator: ctx.ContextUser, Data: buf, + Properties: props, }, ) if err != nil { @@ -99,28 +109,6 @@ func Push(ctx *context.Context) { return } - _, err = pkg_model.InsertProperty(ctx, 0, ver.ID, distro+"-"+filename+".desc", desc.String()) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - - _, err = pkg_model.InsertProperty(ctx, 0, ver.ID, distro+"-"+filename+".sig", sign) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - - err = arch_service.UpdateMetadata(ctx, &arch_service.UpdateMetadataParams{ - User: ctx.Package.Owner, - Metadata: md, - DbDesc: desc, - }) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - err = arch_service.RepoConnect(ctx, owner, desc.Name, ver.ID) if err != nil { apiError(ctx, http.StatusInternalServerError, err) @@ -153,15 +141,21 @@ func Get(ctx *context.Context) { return } - // Signatures are loaded from package properties in SQL db. + // Signatures are loaded from package file properties in SQL db. if strings.HasSuffix(file, ".pkg.tar.zst.sig") { - sign, err := arch_service.GetProperty(ctx, owner, distro+"-"+file) + p, err := pkg_model.GetPropertieWithUniqueName(ctx, distro+"-"+file) if err != nil { apiError(ctx, http.StatusNotFound, err) return } - ctx.ServeContent(bytes.NewReader(sign), &context.ServeHeaderOptions{ + b, err := hex.DecodeString(p.Value) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) + return + } + + ctx.ServeContent(bytes.NewReader(b), &context.ServeHeaderOptions{ Filename: file, }) return diff --git a/services/packages/arch/service.go b/services/packages/arch/service.go index 893d006654..bbe8e87626 100644 --- a/services/packages/arch/service.go +++ b/services/packages/arch/service.go @@ -4,8 +4,6 @@ package arch import ( - "encoding/hex" - "errors" "fmt" "sort" "strings" @@ -14,57 +12,12 @@ import ( pkg_model "code.gitea.io/gitea/models/packages" repository "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/context" - "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/packages" "code.gitea.io/gitea/modules/packages/arch" "code.gitea.io/gitea/modules/storage" ) -type UpdateMetadataParams struct { - User *user.User - Metadata *arch.Metadata - DbDesc *arch.DbDesc -} - -// Update package metadata stored in SQL database with new combination of -// distribution and architecture. -func UpdateMetadata(ctx *context.Context, p *UpdateMetadataParams) error { - ver, err := pkg_model.GetVersionByNameAndVersion( - ctx, p.User.ID, pkg_model.TypeArch, - p.DbDesc.Name, p.DbDesc.Version, - ) - if err != nil { - return err - } - - var currmd arch.Metadata - err = json.Unmarshal([]byte(ver.MetadataJSON), &currmd) - if err != nil { - return err - } - - currmd.DistroArch = uniqueSlice(currmd.DistroArch, p.Metadata.DistroArch) - - b, err := json.Marshal(&currmd) - if err != nil { - return err - } - - ver.MetadataJSON = string(b) - - return pkg_model.UpdateVersion(ctx, ver) -} - -// Creates a list containing unique values formed of 2 passed slices. -func uniqueSlice(first, second []string) []string { - set := make(container.Set[string], len(first)+len(second)) - set.AddMultiple(first...) - set.AddMultiple(second...) - return set.Values() -} - // Get data related to provided filename and distribution, for package files // update download counter. func GetFileObject(ctx *context.Context, distro, file string) (storage.Object, error) { @@ -94,40 +47,6 @@ func GetFileObject(ctx *context.Context, distro, file string) (storage.Object, e return cs.Get(packages.BlobHash256Key(blob.HashSHA256)) } -// Get package property and transform it to string. -func GetProperty(ctx *context.Context, owner, key string) ([]byte, error) { - u, err := user.GetUserByName(ctx, owner) - if err != nil { - return nil, err - } - - k := strings.Split(key, "-") - - ver, err := pkg_model.GetVersionByNameAndVersion( - ctx, u.ID, pkg_model.TypeArch, strings.Join(k[1:len(k)-3], "-"), - strings.Join(k[len(k)-3:len(k)-1], "-"), - ) - if err != nil { - return nil, err - } - - pp, err := pkg_model.GetPropertiesByName(ctx, 0, ver.ID, key) - if err != nil { - return nil, err - } - - for _, property := range pp { - switch { - case strings.HasSuffix(key, ".desc"): - return []byte(property.Value), nil - case strings.HasSuffix(key, ".sig"): - return hex.DecodeString(property.Value) - } - } - - return nil, errors.New("unable to find package signature") -} - // Automatically connect repository with source code to published package, if // repository with the same name exists in user/organization scope. func RepoConnect(ctx *context.Context, owner, repo string, pkgid int64) error { @@ -178,62 +97,18 @@ func CreatePacmanDb(ctx *context.Context, p *DbParams) ([]byte, error) { }) for _, version := range versions { - desc, err := LoadDbDescFile(ctx, &DescParams{ - Version: version, - Arch: p.Architecture, - Distro: p.Distribution, - PkgName: pkg.Name, - Owner: p.Owner, - }) + p, err := pkg_model.GetPropertieWithUniqueName(ctx, fmt.Sprintf( + "%s-%s-%s-%s.pkg.tar.zst.desc", + p.Distribution, pkg.Name, version.Version, p.Architecture, + )) if err != nil { return nil, err } - if desc == nil { - continue - } - entries[pkg.Name+"-"+version.Version+"/desc"] = desc + + entries[pkg.Name+"-"+version.Version+"/desc"] = []byte(p.Value) break } } return arch.CreatePacmanDb(entries) } - -type DescParams struct { - Version *pkg_model.PackageVersion - Arch string - Distro string - PkgName string - Owner string -} - -// Get pacman desc file from object storage if combination of distribution and -// architecture is supported (checked in metadata). -func LoadDbDescFile(ctx *context.Context, p *DescParams) ([]byte, error) { - var md arch.Metadata - err := json.Unmarshal([]byte(p.Version.MetadataJSON), &md) - if err != nil { - return nil, err - } - - for _, distroarch := range md.DistroArch { - var arch string - - if distroarch == p.Distro+"-"+p.Arch { - arch = p.Arch - } - if distroarch == p.Distro+"-any" { - arch = "any" - } - - if arch == "" { - continue - } - - return GetProperty(ctx, p.Owner, fmt.Sprintf( - "%s-%s-%s-%s.pkg.tar.zst.desc", - p.Distro, p.PkgName, p.Version.Version, arch, - )) - } - return nil, nil -} diff --git a/templates/package/content/arch.tmpl b/templates/package/content/arch.tmpl index 74e32c4829..17df1fb736 100644 --- a/templates/package/content/arch.tmpl +++ b/templates/package/content/arch.tmpl @@ -71,13 +71,6 @@ Server = {{end}} - - {{if .PackageDescriptor.Metadata.DistroArch}} - -
Available for
- {{StringUtils.Join $.PackageDescriptor.Metadata.DistroArch ", "}} - - {{end}}