containers/apps/ci-os/packages/forgejo-comment/src/main.go

142 lines
3.2 KiB
Go

package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"io"
"net/http"
"os"
"strconv"
)
func main() {
// Define command-line flags
var forgejoAPIURL string
var token string
var repoOwner string
var repoName string
var issueId int
flag.StringVar(&forgejoAPIURL, "forgejo-api-url", "https://code.252.no/api/v1", "Forgejo API URL")
flag.StringVar(&token, "token", "", "Forgejo API token")
flag.StringVar(&repoOwner, "repo-owner", "", "Repository owner")
flag.StringVar(&repoName, "repo-name", "", "Repository name")
flag.IntVar(&issueId, "issue-id", 0, "Issue id")
flag.Parse()
// Get the diff file from the positional arguments
args := flag.Args()
if len(args) < 1 {
fmt.Println("Usage: forgejo-comment <diff-file>")
os.Exit(1)
}
diffFile := args[0]
// Read environment variables if flags are not set
if forgejoAPIURL == "" {
forgejoAPIURL = os.Getenv("FORGEJO_API_URL")
if forgejoAPIURL == "" {
fmt.Println("Error: FORGEJO_API_URL is not set")
os.Exit(1)
}
}
if token == "" {
token = os.Getenv("FORGEJO_TOKEN")
if token == "" {
fmt.Println("Error: FORGEJO_TOKEN is not set")
os.Exit(1)
}
}
if repoOwner == "" {
repoOwner = os.Getenv("REPO_OWNER")
if repoOwner == "" {
fmt.Println("Error: REPO_OWNER is not set")
os.Exit(1)
}
}
if repoName == "" {
repoName = os.Getenv("REPO_NAME")
if repoName == "" {
fmt.Println("Error: REPO_NAME is not set")
os.Exit(1)
}
}
if issueId == 0 {
issueIdEnv := os.Getenv("ISSUE_ID")
if issueIdEnv == "" {
fmt.Println("Error: ISSUE_ID is not set")
os.Exit(1)
}
var err error
issueId, err = strconv.Atoi(issueIdEnv)
if err != nil {
fmt.Println("Error: Invalid ISSUE_ID")
os.Exit(1)
}
}
// Read the diff file
diffContentBytes, err := os.ReadFile(diffFile)
if err != nil {
fmt.Printf("Error reading diff file: %v\n", err)
os.Exit(1)
}
// Prepare the comment content
diffContent := string(diffContentBytes)
commentBody := fmt.Sprintf("```diff\n%s\n```", diffContent)
// Prepare the request payload
payload := map[string]string{
"body": commentBody,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
fmt.Printf("Error marshaling payload: %v\n", err)
os.Exit(1)
}
// Construct the API URL
apiURL := fmt.Sprintf("%s/repos/%s/%s/issues/%d/comments", forgejoAPIURL, repoOwner, repoName, issueId)
// Create the HTTP request
req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(payloadBytes))
if err != nil {
fmt.Printf("Error creating request: %v\n", err)
os.Exit(1)
}
req.Header.Set("Authorization", fmt.Sprintf("token %s", token))
req.Header.Set("Content-Type", "application/json")
// Send the request
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("Error sending request: %v\n", err)
os.Exit(1)
}
defer resp.Body.Close()
// Read the response body
respBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf("Error reading response: %v\n", err)
os.Exit(1)
}
// Check the response status code
if resp.StatusCode != 201 {
fmt.Printf("Failed to post comment. HTTP status: %d\n", resp.StatusCode)
fmt.Printf("Response body: %s\n", string(respBody))
os.Exit(1)
} else {
fmt.Printf("Posted diff to Forgejo issue #%d\n", issueId)
}
}