Files
2024-04-24 15:39:50 +02:00

120 lines
2.5 KiB
Go

package main
import (
"code.gitea.io/sdk/gitea"
"fmt"
"github.com/sirupsen/logrus"
"net/http"
"os"
"path/filepath"
"strings"
)
type (
Repo struct {
Owner string
Name string
}
Pr struct {
Index int64
}
Build struct {
Event string
}
Config struct {
APIKey string
MessageText string
MessageFile string
BaseURl string
DeleteIdentifier string
}
Plugin struct {
Repo Repo
Pr Pr
Build Build
Config Config
}
)
func (p Plugin) Exec() error {
if p.Build.Event != "pull_request" {
return fmt.Errorf("only pull request may trigger this plugin. (was %s)", p.Build.Event)
}
if p.Config.APIKey == "" {
return fmt.Errorf("you must provide an API key")
}
if p.Config.BaseURl == "" {
return fmt.Errorf("you must provide the repo's base url")
}
if !strings.HasSuffix(p.Config.BaseURl, "/") {
p.Config.BaseURl = p.Config.BaseURl + "/"
}
if p.Pr.Index == 0 {
return fmt.Errorf("pull request number is not set")
}
var content []byte
if p.Config.MessageText == "" {
if p.Config.MessageFile == "" {
return fmt.Errorf("you must provide either a message text or a message file")
}
glob, err := filepath.Glob(p.Config.MessageFile)
if err != nil {
return fmt.Errorf("failed to glob %s. %s", p.Config.MessageFile, err)
}
if len(glob) == 0 {
return fmt.Errorf("no file found matching %s", p.Config.MessageFile)
}
content, err = os.ReadFile(glob[0])
if err != nil {
return fmt.Errorf("failed to read the file %s. %s", glob[0], err)
}
} else {
if p.Config.MessageFile != "" {
return fmt.Errorf("you must provide either a message text or a message file, not both")
}
content = []byte(p.Config.MessageText)
}
logrus.WithFields(logrus.Fields{
"repo.baseurl": p.Config.BaseURl,
"repo.owner": p.Repo.Owner,
"repo.name": p.Repo.Name,
"pr.index": p.Pr.Index,
}).Info("Start message commenting")
httpClient := &http.Client{}
client, err := gitea.NewClient(p.Config.BaseURl, gitea.SetToken(p.Config.APIKey), gitea.SetHTTPClient(httpClient))
mc := messageClient{
Client: client,
Owner: p.Repo.Owner,
Repo: p.Repo.Name,
Index: p.Pr.Index,
Message: string(content),
DeleteIdentifier: p.Config.DeleteIdentifier,
}
_, err = mc.deletePreviousMessages()
if err != nil {
return fmt.Errorf("error deleting previous messages: %w", err)
}
logrus.Info("Sending message as PR comment...")
_, _, err = mc.sendMessage()
if err == nil {
logrus.Info("Done.")
}
return err
}