1
0
Fork 0
golang-forgejo-f3-gof3/forges/forgejo/asset.go
Daniel Baumann 03bfe4079e
Adding upstream version 3.10.8.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-18 09:37:23 +02:00

178 lines
4.4 KiB
Go

// Copyright Earl Warren <contact@earl-warren.org>
// Copyright Loïc Dachary <loic@dachary.org>
// SPDX-License-Identifier: MIT
package forgejo
import (
"context"
"fmt"
"io"
"net/http"
"os"
"code.forgejo.org/f3/gof3/v3/f3"
"code.forgejo.org/f3/gof3/v3/id"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
"code.forgejo.org/f3/gof3/v3/util"
forgejo_sdk "code.forgejo.org/f3/gof3/v3/forges/forgejo/sdk"
)
type asset struct {
common
forgejoAsset *forgejo_sdk.Attachment
sha string
contentType string
downloadFunc f3.DownloadFuncType
}
var _ f3_tree.ForgeDriverInterface = &pullRequest{}
func newAsset() generic.NodeDriverInterface {
return &asset{}
}
func (o *asset) SetNative(asset any) {
o.forgejoAsset = asset.(*forgejo_sdk.Attachment)
}
func (o *asset) GetNativeID() string {
return fmt.Sprintf("%d", o.forgejoAsset.ID)
}
func (o *asset) NewFormat() f3.Interface {
node := o.GetNode()
return node.GetTree().(f3_tree.TreeInterface).NewFormat(node.GetKind())
}
func (o *asset) ToFormat() f3.Interface {
if o.forgejoAsset == nil {
return o.NewFormat()
}
if o.sha == "" {
// the API does not provide the SHA256, save the asset in a temporary file
// to get it
objectsHelper := o.getF3Tree().GetObjectsHelper()
o.Trace("download from %s", o.forgejoAsset.DownloadURL)
req, err := http.NewRequest("GET", o.forgejoAsset.DownloadURL, nil)
if err != nil {
panic(err)
}
httpClient := o.getNewMigrationHTTPClient()()
resp, err := httpClient.Do(req)
if err != nil {
panic(fmt.Errorf("while downloading %s %w", o.forgejoAsset.DownloadURL, err))
}
sha, path := objectsHelper.Save(resp.Body)
o.sha = sha
o.downloadFunc = func() io.ReadCloser {
o.Trace("download %s from copy stored in temporary file %s", o.forgejoAsset.DownloadURL, path)
f, err := os.Open(path)
if err != nil {
panic(err)
}
return f
}
}
return &f3.ReleaseAsset{
Common: f3.NewCommon(o.GetNativeID()),
Name: o.forgejoAsset.Name,
Size: o.forgejoAsset.Size,
ContentType: o.contentType,
DownloadCount: o.forgejoAsset.DownloadCount,
SHA256: o.sha,
DownloadURL: o.forgejoAsset.DownloadURL,
Created: o.forgejoAsset.Created,
DownloadFunc: o.downloadFunc,
}
}
func (o *asset) FromFormat(content f3.Interface) {
asset := content.(*f3.ReleaseAsset)
o.forgejoAsset = &forgejo_sdk.Attachment{
ID: util.ParseInt(asset.GetID()),
Name: asset.Name,
Size: asset.Size,
DownloadCount: asset.DownloadCount,
Created: asset.Created,
DownloadURL: asset.DownloadURL,
}
o.sha = asset.SHA256
o.contentType = asset.ContentType
o.downloadFunc = asset.DownloadFunc
}
func (o *asset) Get(ctx context.Context) bool {
node := o.GetNode()
o.Trace("%s", node.GetID())
owner := f3_tree.GetOwnerName(o.GetNode())
project := f3_tree.GetProjectName(o.GetNode())
release := f3_tree.GetReleaseID(o.GetNode())
asset, resp, err := o.getClient().GetReleaseAttachment(owner, project, release, node.GetID().Int64())
if resp.StatusCode == 404 {
return false
}
if err != nil {
panic(fmt.Errorf("asset %v %w", o, err))
}
o.forgejoAsset = asset
return true
}
func (o *asset) Put(ctx context.Context) id.NodeID {
node := o.GetNode()
o.Trace("%s", node.GetID())
owner := f3_tree.GetOwnerName(o.GetNode())
project := f3_tree.GetProjectName(o.GetNode())
release := f3_tree.GetReleaseID(o.GetNode())
asset, _, err := o.getClient().CreateReleaseAttachment(owner, project, release, o.downloadFunc(), o.forgejoAsset.Name)
if err != nil {
panic(err)
}
o.forgejoAsset = asset
o.sha = ""
return id.NewNodeID(o.GetNativeID())
}
func (o *asset) Patch(ctx context.Context) {
node := o.GetNode()
o.Trace("%s", node.GetID())
owner := f3_tree.GetOwnerName(o.GetNode())
project := f3_tree.GetProjectName(o.GetNode())
release := f3_tree.GetReleaseID(o.GetNode())
_, _, err := o.getClient().EditReleaseAttachment(owner, project, release, node.GetID().Int64(), forgejo_sdk.EditAttachmentOptions{
Name: o.forgejoAsset.Name,
})
if err != nil {
panic(err)
}
}
func (o *asset) Delete(ctx context.Context) {
node := o.GetNode()
o.Trace("%s", node.GetID())
owner := f3_tree.GetOwnerName(o.GetNode())
project := f3_tree.GetProjectName(o.GetNode())
release := f3_tree.GetReleaseID(o.GetNode())
_, err := o.getClient().DeleteReleaseAttachment(owner, project, release, node.GetID().Int64())
if err != nil {
panic(err)
}
}