1
0
Fork 0
golang-forgejo-f3-gof3/forges/forgejo/project.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

189 lines
4.9 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"
"strings"
"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 project struct {
common
forgejoProject *forgejo_sdk.Repository
forked *f3.Reference
}
var _ f3_tree.ForgeDriverInterface = &project{}
func newProject() generic.NodeDriverInterface {
return &project{}
}
func (o *project) SetNative(project any) {
o.forgejoProject = project.(*forgejo_sdk.Repository)
}
func (o *project) GetNativeID() string {
return fmt.Sprintf("%d", o.forgejoProject.ID)
}
func (o *project) NewFormat() f3.Interface {
node := o.GetNode()
return node.GetTree().(f3_tree.TreeInterface).NewFormat(node.GetKind())
}
func (o *project) getForkedReference() *f3.Reference {
if !o.forgejoProject.Fork {
return nil
}
if o.forked == nil {
_, resp, err := o.getClient().GetOrg(o.forgejoProject.Parent.Owner.UserName)
owners := "organizations"
if resp.StatusCode == 404 {
owners = "users"
} else if err != nil {
panic(fmt.Errorf("get org %v %w", o, err))
}
o.forked = f3_tree.NewProjectReference(owners, fmt.Sprintf("%d", o.forgejoProject.Parent.Owner.ID), fmt.Sprintf("%d", o.forgejoProject.Parent.ID))
}
return o.forked
}
func (o *project) ToFormat() f3.Interface {
if o.forgejoProject == nil {
return o.NewFormat()
}
return &f3.Project{
Common: f3.NewCommon(o.GetNativeID()),
Name: o.forgejoProject.Name,
IsPrivate: o.forgejoProject.Private,
Description: o.forgejoProject.Description,
DefaultBranch: o.forgejoProject.DefaultBranch,
Forked: o.getForkedReference(),
}
}
func (o *project) FromFormat(content f3.Interface) {
project := content.(*f3.Project)
o.forgejoProject = &forgejo_sdk.Repository{
ID: util.ParseInt(project.GetID()),
Name: project.Name,
Private: project.IsPrivate,
Description: project.Description,
DefaultBranch: project.DefaultBranch,
}
o.forked = project.Forked
}
func (o *project) Get(ctx context.Context) bool {
node := o.GetNode()
o.Trace("%s", node.GetID())
var project *forgejo_sdk.Repository
var err error
var resp *forgejo_sdk.Response
if node.GetID() != id.NilID {
project, resp, err = o.getClient().GetRepoByID(node.GetID().Int64())
} else {
panic("GetID() == 0")
}
if resp.StatusCode == 404 {
return false
}
if err != nil {
if strings.Contains(err.Error(), "project not found") {
return false
}
panic(fmt.Errorf("project %v %w", o, err))
}
o.forgejoProject = project
return true
}
func (o *project) Put(ctx context.Context) id.NodeID {
owner := f3_tree.GetOwner(o.GetNode()).ToFormat()
var ownerName string
var isOrganization bool
switch v := owner.(type) {
case *f3.User:
ownerName = v.UserName
o.maybeSudoName(ownerName)
case *f3.Organization:
ownerName = v.Name
isOrganization = true
default:
panic(fmt.Errorf("Put unexpected type %T", owner))
}
defer o.notSudo()
if o.forked == nil {
var repo *forgejo_sdk.Repository
var err error
if isOrganization {
repo, _, err = o.getClient().CreateOrgRepo(ownerName, forgejo_sdk.CreateRepoOption{
Name: o.forgejoProject.Name,
Description: o.forgejoProject.Description,
Private: o.forgejoProject.Private,
DefaultBranch: o.forgejoProject.DefaultBranch,
})
} else {
repo, _, err = o.getClient().CreateRepo(forgejo_sdk.CreateRepoOption{
Name: o.forgejoProject.Name,
Description: o.forgejoProject.Description,
Private: o.forgejoProject.Private,
DefaultBranch: o.forgejoProject.DefaultBranch,
})
}
if err != nil {
panic(err)
}
o.forgejoProject = repo
o.Trace("project created %d", o.forgejoProject.ID)
} else {
options := forgejo_sdk.CreateForkOption{
Name: &o.forgejoProject.Name,
}
owner, project := f3_tree.ResolveProjectReference(ctx, o.getTree(), o.forked)
repo, _, err := o.getClient().CreateFork(owner, project, options)
if err != nil {
panic(fmt.Errorf("CreateFork %s %s - %w", owner, project, err))
}
o.forgejoProject = repo
o.Trace("forked project created %d", o.forgejoProject.ID)
}
return id.NewNodeID(o.GetNativeID())
}
func (o *project) Patch(context.Context) {
owner := f3_tree.GetOwnerName(o.GetNode())
repo, _, err := o.getClient().EditRepo(owner, o.forgejoProject.Name, forgejo_sdk.EditRepoOption{
Description: &o.forgejoProject.Description,
})
if err != nil {
panic(err)
}
o.forgejoProject = repo
o.Trace("%d", o.forgejoProject.ID)
}
func (o *project) Delete(ctx context.Context) {
_, err := o.getClient().DeleteRepo(o.forgejoProject.Owner.UserName, o.forgejoProject.Name)
if err != nil {
panic(err)
}
}