2023-06-21 20:30:07 +00:00
|
|
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
|
|
package arch
|
|
|
|
|
|
|
|
import (
|
2023-06-22 07:33:23 +00:00
|
|
|
"bytes"
|
2023-06-21 20:30:07 +00:00
|
|
|
|
|
|
|
org "code.gitea.io/gitea/models/organization"
|
|
|
|
pkg "code.gitea.io/gitea/models/packages"
|
|
|
|
"code.gitea.io/gitea/models/repo"
|
|
|
|
"code.gitea.io/gitea/models/user"
|
|
|
|
"code.gitea.io/gitea/modules/context"
|
2023-06-22 07:33:23 +00:00
|
|
|
"code.gitea.io/gitea/modules/packages"
|
2023-06-21 20:30:07 +00:00
|
|
|
"code.gitea.io/gitea/modules/packages/arch"
|
2023-06-22 07:33:23 +00:00
|
|
|
svc "code.gitea.io/gitea/services/packages"
|
2023-06-21 20:30:07 +00:00
|
|
|
)
|
|
|
|
|
2023-06-22 07:33:23 +00:00
|
|
|
// Parameters required to save new arch package.
|
|
|
|
type SaveFileParams struct {
|
|
|
|
*org.Organization
|
|
|
|
*user.User
|
|
|
|
*arch.Metadata
|
|
|
|
Data []byte
|
|
|
|
Filename string
|
|
|
|
Distro string
|
2023-06-21 20:30:07 +00:00
|
|
|
}
|
|
|
|
|
2023-06-22 07:33:23 +00:00
|
|
|
// This function create new package, version and package file properties in
|
|
|
|
// database, and write blob to file storage. If package/version/blob exists it
|
|
|
|
// will overwrite existing data. Package id and error will be returned.
|
|
|
|
func SaveFile(ctx *context.Context, p *SaveFileParams) (int64, error) {
|
|
|
|
buf, err := packages.CreateHashedBufferFromReader(bytes.NewReader(p.Data))
|
2023-06-21 20:30:07 +00:00
|
|
|
if err != nil {
|
2023-06-22 07:33:23 +00:00
|
|
|
return 0, err
|
2023-06-21 20:30:07 +00:00
|
|
|
}
|
2023-06-22 07:33:23 +00:00
|
|
|
defer buf.Close()
|
2023-06-21 20:30:07 +00:00
|
|
|
|
2023-06-22 07:33:23 +00:00
|
|
|
pv, _, err := svc.CreatePackageOrAddFileToExisting(
|
|
|
|
&svc.PackageCreationInfo{
|
|
|
|
PackageInfo: svc.PackageInfo{
|
|
|
|
Owner: p.Organization.AsUser(),
|
|
|
|
PackageType: pkg.TypeArch,
|
|
|
|
Name: p.Metadata.Name,
|
|
|
|
Version: p.Metadata.Version,
|
|
|
|
},
|
|
|
|
Creator: p.User,
|
|
|
|
Metadata: p.Metadata,
|
|
|
|
},
|
|
|
|
&svc.PackageFileCreationInfo{
|
|
|
|
PackageFileInfo: svc.PackageFileInfo{
|
|
|
|
Filename: p.Filename,
|
|
|
|
CompositeKey: p.Distro + "-" + p.Filename,
|
|
|
|
},
|
|
|
|
Creator: p.User,
|
|
|
|
Data: buf,
|
|
|
|
OverwriteExisting: true,
|
|
|
|
},
|
|
|
|
)
|
2023-06-21 20:30:07 +00:00
|
|
|
if err != nil {
|
2023-06-22 07:33:23 +00:00
|
|
|
return 0, err
|
2023-06-21 20:30:07 +00:00
|
|
|
}
|
2023-06-22 07:33:23 +00:00
|
|
|
return pv.PackageID, nil
|
2023-06-21 20:30:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Automatically connect repository to pushed package, if package with provided
|
|
|
|
// with provided name exists in namespace scope.
|
2023-06-22 07:33:23 +00:00
|
|
|
func RepositoryAutoconnect(ctx *context.Context, owner, repository string, pkgid int64) error {
|
2023-06-21 20:30:07 +00:00
|
|
|
repo, err := repo.GetRepositoryByOwnerAndName(ctx, owner, repository)
|
|
|
|
if err == nil {
|
2023-06-22 07:33:23 +00:00
|
|
|
err = pkg.SetRepositoryLink(ctx, pkgid, repo.ID)
|
2023-06-21 20:30:07 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|