function to get package file property by composite key, refactoring function creating pacman database

This commit is contained in:
Danila Fominykh 2023-09-24 13:32:53 -03:00
parent a9a5b7a2cf
commit 54fd84d83f
No known key found for this signature in database
GPG Key ID: 1134F8EBF98AA06F
4 changed files with 33 additions and 48 deletions

View File

@ -65,6 +65,20 @@ func TryInsertFile(ctx context.Context, pf *PackageFile) (*PackageFile, error) {
return pf, nil return pf, nil
} }
// GetFileByCompositeKey gets unique file by composite key if exists
func GetFileByCompositeKey(ctx context.Context, key string) (*PackageFile, error) {
pf := &PackageFile{CompositeKey: key}
has, err := db.GetEngine(ctx).Get(pf)
if err != nil {
return nil, err
}
if !has {
return nil, ErrPackageFileNotExist
}
return pf, nil
}
// GetFilesByVersionID gets all files of a version // GetFilesByVersionID gets all files of a version
func GetFilesByVersionID(ctx context.Context, versionID int64) ([]*PackageFile, error) { func GetFilesByVersionID(ctx context.Context, versionID int64) ([]*PackageFile, error) {
pfs := make([]*PackageFile, 0, 10) pfs := make([]*PackageFile, 0, 10)

View File

@ -219,9 +219,7 @@ func CreatePacmanDb(entries map[string][]byte) ([]byte, error) {
var out bytes.Buffer var out bytes.Buffer
gw := gzip.NewWriter(&out) gw := gzip.NewWriter(&out)
defer gw.Close()
tw := tar.NewWriter(gw) tw := tar.NewWriter(gw)
defer tw.Close()
for name, content := range entries { for name, content := range entries {
hdr := &tar.Header{ hdr := &tar.Header{
@ -232,11 +230,15 @@ func CreatePacmanDb(entries map[string][]byte) ([]byte, error) {
err := tw.WriteHeader(hdr) err := tw.WriteHeader(hdr)
if err != nil { if err != nil {
tw.Close()
gw.Close()
return nil, err return nil, err
} }
_, err = io.Copy(tw, bytes.NewReader(content)) _, err = io.Copy(tw, bytes.NewReader(content))
if err != nil { if err != nil {
tw.Close()
gw.Close()
return nil, err return nil, err
} }
} }

View File

@ -154,11 +154,7 @@ func Get(ctx *context.Context) {
} }
if strings.HasSuffix(file, ".db.tar.gz") || strings.HasSuffix(file, ".db") { if strings.HasSuffix(file, ".db.tar.gz") || strings.HasSuffix(file, ".db") {
db, err := arch_service.CreatePacmanDb(ctx, &arch_service.DbParams{ db, err := arch_service.CreatePacmanDb(ctx, owner, arch, distro)
Owner: owner,
Architecture: arch,
Distribution: distro,
})
if err != nil { if err != nil {
apiError(ctx, http.StatusInternalServerError, err) apiError(ctx, http.StatusInternalServerError, err)
return return

View File

@ -12,63 +12,42 @@ import (
"sort" "sort"
"strings" "strings"
"code.gitea.io/gitea/models/db"
pkg_model "code.gitea.io/gitea/models/packages" pkg_model "code.gitea.io/gitea/models/packages"
repository "code.gitea.io/gitea/models/repo" repository "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/packages/arch" arch_module "code.gitea.io/gitea/modules/packages/arch"
pkg_service "code.gitea.io/gitea/services/packages" pkg_service "code.gitea.io/gitea/services/packages"
) )
// Get data related to provided filename and distribution, for package files // Get data related to provided filename and distribution, for package files
// update download counter. // update download counter.
func GetPackageFile(ctx *context.Context, distro, file string) (io.ReadSeekCloser, error) { func GetPackageFile(ctx *context.Context, distro, file string) (io.ReadSeekCloser, error) {
pkgfile := &pkg_model.PackageFile{CompositeKey: distro + "-" + file} pf, err := pkg_model.GetFileByCompositeKey(ctx, distro+"-"+file)
if err != nil {
ok, err := db.GetEngine(ctx).Get(pkgfile) return nil, err
if err != nil || !ok {
return nil, fmt.Errorf("%+v %t", err, ok)
} }
filestream, _, _, err := pkg_service.GetPackageFileStream(ctx, pkgfile) filestream, _, _, err := pkg_service.GetPackageFileStream(ctx, pf)
return filestream, err return filestream, err
} }
// This function will search for package signature and if present, will load it // This function will search for package signature and if present, will load it
// from package file properties, and return its byte reader. // from package file properties, and return its byte reader.
func GetPackageSignature(ctx *context.Context, distro, file string) (*bytes.Reader, error) { func GetPackageSignature(ctx *context.Context, distro, file string) (*bytes.Reader, error) {
var ( pkgfile := strings.TrimSuffix(distro+"-"+file, ".sig")
splt = strings.Split(file, "-")
packagename = strings.Join(splt[0:len(splt)-3], "-")
versionname = splt[len(splt)-3] + "-" + splt[len(splt)-2]
pkgfilename = strings.TrimSuffix(file, ".sig")
filekey = distro + "-" + pkgfilename
signkey = distro + "-" + file
)
version, err := pkg_model.GetVersionByNameAndVersion( pf, err := pkg_model.GetFileByCompositeKey(ctx, pkgfile)
ctx, ctx.Package.Owner.ID, pkg_model.TypeArch, packagename, versionname,
)
if err != nil { if err != nil {
return nil, err return nil, err
} }
pkgfile, err := pkg_model.GetFileForVersionByName( proprs, err := pkg_model.GetProperties(ctx, pkg_model.PropertyTypeFile, pf.ID)
ctx, version.ID, pkgfilename, filekey,
)
if err != nil {
return nil, err
}
proprs, err := pkg_model.GetProperties(
ctx, pkg_model.PropertyTypeFile, pkgfile.ID,
)
if err != nil { if err != nil {
return nil, err return nil, err
} }
for _, pp := range proprs { for _, pp := range proprs {
if pp.Name == signkey { if pp.Name == distro+"-"+file {
b, err := hex.DecodeString(pp.Value) b, err := hex.DecodeString(pp.Value)
if err != nil { if err != nil {
return nil, err return nil, err
@ -93,18 +72,12 @@ func RepoConnect(ctx *context.Context, owner, repo string, pkgid int64) error {
return nil return nil
} }
type DbParams struct {
Owner string
Architecture string
Distribution string
}
// Finds all arch packages in user/organization scope, each package version // Finds all arch packages in user/organization scope, each package version
// starting from latest in descending order is checked to be compatible with // starting from latest in descending order is checked to be compatible with
// requested combination of architecture and distribution. When/If the first // requested combination of architecture and distribution. When/If the first
// compatible version is found, related desc file will be loaded from database // compatible version is found, related desc file will be loaded from database
// and added to resulting .db.tar.gz archive. // and added to resulting .db.tar.gz archive.
func CreatePacmanDb(ctx *context.Context, p *DbParams) ([]byte, error) { func CreatePacmanDb(ctx *context.Context, owner, arch, distro string) ([]byte, error) {
pkgs, err := pkg_model.GetPackagesByType(ctx, ctx.Package.Owner.ID, pkg_model.TypeArch) pkgs, err := pkg_model.GetPackagesByType(ctx, ctx.Package.Owner.ID, pkg_model.TypeArch)
if err != nil { if err != nil {
return nil, err return nil, err
@ -127,11 +100,11 @@ func CreatePacmanDb(ctx *context.Context, p *DbParams) ([]byte, error) {
for _, version := range versions { for _, version := range versions {
filename := fmt.Sprintf( filename := fmt.Sprintf(
"%s-%s-%s.pkg.tar.zst", "%s-%s-%s.pkg.tar.zst",
pkg.Name, version.Version, p.Architecture, pkg.Name, version.Version, arch,
) )
file, err := pkg_model.GetFileForVersionByName( file, err := pkg_model.GetFileForVersionByName(
ctx, version.ID, filename, p.Distribution+"-"+filename, ctx, version.ID, filename, distro+"-"+filename,
) )
if err != nil { if err != nil {
filename := fmt.Sprintf( filename := fmt.Sprintf(
@ -139,7 +112,7 @@ func CreatePacmanDb(ctx *context.Context, p *DbParams) ([]byte, error) {
pkg.Name, version.Version, pkg.Name, version.Version,
) )
file, err = pkg_model.GetFileForVersionByName( file, err = pkg_model.GetFileForVersionByName(
ctx, version.ID, filename, p.Distribution+"-"+filename, ctx, version.ID, filename, distro+"-"+filename,
) )
if err != nil { if err != nil {
return nil, err return nil, err
@ -167,5 +140,5 @@ func CreatePacmanDb(ctx *context.Context, p *DbParams) ([]byte, error) {
} }
} }
return arch.CreatePacmanDb(entries) return arch_module.CreatePacmanDb(entries)
} }