moved upload function to arch service

This commit is contained in:
Danila Fominykh 2023-10-12 11:43:33 -03:00
parent 54a9c8bdff
commit 6052aea5f2
No known key found for this signature in database
GPG Key ID: FC04D07F75B663FC
4 changed files with 93 additions and 69 deletions

View File

@ -58,7 +58,7 @@ type DbDesc struct {
} }
// Function that receives arch package archive data and returns it's metadata. // Function that receives arch package archive data and returns it's metadata.
func EjectMetadata(file, distro string, b *pkg_module.HashedBuffer) (*DbDesc, error) { func ParseMetadata(file, distro string, b *pkg_module.HashedBuffer) (*DbDesc, error) {
pkginfo, err := getPkginfo(b) pkginfo, err := getPkginfo(b)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -138,7 +138,7 @@ func TestMetadata(t *testing.T) {
archive.Close() archive.Close()
assert.NoError(t, err) assert.NoError(t, err)
md, err := EjectMetadata("zstd-1.5.5-1-x86_64.pkg.tar.zst", "archlinux", buf) md, err := ParseMetadata("zstd-1.5.5-1-x86_64.pkg.tar.zst", "archlinux", buf)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, md.Name, "zstd") assert.Equal(t, md.Name, "zstd")

View File

@ -4,15 +4,11 @@
package arch package arch
import ( import (
"encoding/hex"
"io"
"net/http" "net/http"
"strings" "strings"
pkg_model "code.gitea.io/gitea/models/packages" pkg_model "code.gitea.io/gitea/models/packages"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
pkg_module "code.gitea.io/gitea/modules/packages"
arch_module "code.gitea.io/gitea/modules/packages/arch"
"code.gitea.io/gitea/routers/api/packages/helper" "code.gitea.io/gitea/routers/api/packages/helper"
pkg_service "code.gitea.io/gitea/services/packages" pkg_service "code.gitea.io/gitea/services/packages"
arch_service "code.gitea.io/gitea/services/packages/arch" arch_service "code.gitea.io/gitea/services/packages/arch"
@ -41,69 +37,7 @@ func Push(ctx *context.Context) {
defer upload.Close() defer upload.Close()
} }
buf, err := pkg_module.CreateHashedBufferFromReader(upload) _, _, err = arch_service.UploadArchPackage(ctx, upload, filename, distro, sign)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)
return
}
defer buf.Close()
desc, err := arch_module.EjectMetadata(filename, distro, buf)
if err != nil {
apiError(ctx, http.StatusBadRequest, err)
return
}
_, err = buf.Seek(0, io.SeekStart)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)
return
}
properties := map[string]string{
"desc": desc.String(),
}
if sign != "" {
_, err := hex.DecodeString(sign)
if err != nil {
apiError(ctx, http.StatusBadRequest, err)
return
}
properties["sign"] = sign
}
_, _, err = pkg_service.CreatePackageOrAddFileToExisting(
ctx, &pkg_service.PackageCreationInfo{
PackageInfo: pkg_service.PackageInfo{
Owner: ctx.Package.Owner,
PackageType: pkg_model.TypeArch,
Name: desc.Name,
Version: desc.Version,
},
Creator: ctx.Doer,
Metadata: &arch_module.Metadata{
URL: desc.ProjectURL,
Description: desc.Description,
Provides: desc.Provides,
License: desc.License,
Depends: desc.Depends,
OptDepends: desc.OptDepends,
MakeDepends: desc.MakeDepends,
CheckDepends: desc.CheckDepends,
},
},
&pkg_service.PackageFileCreationInfo{
PackageFileInfo: pkg_service.PackageFileInfo{
Filename: filename,
CompositeKey: distro,
},
OverwriteExisting: true,
IsLead: true,
Creator: ctx.ContextUser,
Data: buf,
Properties: properties,
},
)
if err != nil { if err != nil {
switch err { switch err {
case pkg_model.ErrDuplicatePackageVersion, pkg_model.ErrDuplicatePackageFile: case pkg_model.ErrDuplicatePackageVersion, pkg_model.ErrDuplicatePackageFile:

View File

@ -0,0 +1,90 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package arch
import (
"encoding/hex"
"errors"
"io"
packages_model "code.gitea.io/gitea/models/packages"
"code.gitea.io/gitea/modules/context"
packages_module "code.gitea.io/gitea/modules/packages"
arch_module "code.gitea.io/gitea/modules/packages/arch"
packages_service "code.gitea.io/gitea/services/packages"
)
// UploadArchPackage adds an Arch Package to the registry.
// The first return value indictaes if the error is a user error.
func UploadArchPackage(ctx *context.Context, upload io.Reader, filename, distro, sign string) (bool, *packages_model.PackageVersion, error) {
buf, err := packages_module.CreateHashedBufferFromReader(upload)
if err != nil {
return false, nil, err
}
defer buf.Close()
desc, err := arch_module.ParseMetadata(filename, distro, buf)
if err != nil {
return false, nil, err
}
_, err = buf.Seek(0, io.SeekStart)
if err != nil {
return false, nil, err
}
properties := map[string]string{
"desc": desc.String(),
}
if sign != "" {
_, err := hex.DecodeString(sign)
if err != nil {
return true, nil, errors.New("unable to decode package signature")
}
properties["sign"] = sign
}
ver, _, err := packages_service.CreatePackageOrAddFileToExisting(
ctx, &packages_service.PackageCreationInfo{
PackageInfo: packages_service.PackageInfo{
Owner: ctx.Package.Owner,
PackageType: packages_model.TypeArch,
Name: desc.Name,
Version: desc.Version,
},
Creator: ctx.Doer,
Metadata: &arch_module.Metadata{
URL: desc.ProjectURL,
Description: desc.Description,
Provides: desc.Provides,
License: desc.License,
Depends: desc.Depends,
OptDepends: desc.OptDepends,
MakeDepends: desc.MakeDepends,
CheckDepends: desc.CheckDepends,
},
},
&packages_service.PackageFileCreationInfo{
PackageFileInfo: packages_service.PackageFileInfo{
Filename: filename,
CompositeKey: distro,
},
OverwriteExisting: true,
IsLead: true,
Creator: ctx.ContextUser,
Data: buf,
Properties: properties,
},
)
if err != nil {
switch err {
case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile, packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
return true, nil, err
default:
return false, nil, err
}
}
return false, ver, nil
}