mirror of
https://github.com/go-gitea/gitea.git
synced 2024-09-01 14:56:30 +00:00
function to get package file property by composite key, refactoring function creating pacman database
This commit is contained in:
parent
a9a5b7a2cf
commit
54fd84d83f
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user