feat: enhance label parsing to support multiple formats and improve logging

This commit is contained in:
Mandresy RABENJAHARISON 2025-09-16 16:27:45 +03:00
parent e1d0d43b5c
commit 444487b324

75
main.go
View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
"io" "io"
"log" "log"
@ -28,7 +29,7 @@ func main() {
logger.Printf("ODOO_TICKET_NUMBER: %s\n", issueOdooTicketString) logger.Printf("ODOO_TICKET_NUMBER: %s\n", issueOdooTicketString)
issueTitle := os.Getenv("ISSUE_TITLE") issueTitle := os.Getenv("ISSUE_TITLE")
labelsStr := os.Getenv("ISSUE_LABELS") labelsEnv := os.Getenv("ISSUE_LABELS")
issueNumberString := os.Getenv("ISSUE_NUMBER") issueNumberString := os.Getenv("ISSUE_NUMBER")
giteaToken := os.Getenv("GITEA_TOKEN") giteaToken := os.Getenv("GITEA_TOKEN")
@ -57,14 +58,17 @@ func main() {
logger.Printf("Odoo ticket ID: %d\n", issueOdooTicketID) logger.Printf("Odoo ticket ID: %d\n", issueOdooTicketID)
// Map labels to Git Flow prefixes // Map labels to Git Flow prefixes
prefix := "feature" labels := parseLabels(labelsEnv, logger)
if labelsStr != "" { if len(labels) > 0 {
prefix, err = getPrefixFromLabels(labelsStr) logger.Printf("Extracted labels: %s\n", strings.Join(labels, ", "))
} }
prefix := "feature"
prefix, err = getPrefixFromLabels(labels)
if err != nil { if err != nil {
logger.Printf("Error while determining the prefix: %v\n", err) logger.Printf("Error while determining the prefix: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logger.Printf("Chosen prefix: %s\n", prefix)
// Form the branch name in the format "prefix/ticket-number" // Form the branch name in the format "prefix/ticket-number"
branchName := fmt.Sprintf("%s/ticket-%d", prefix, issueOdooTicketID) branchName := fmt.Sprintf("%s/ticket-%d", prefix, issueOdooTicketID)
@ -150,7 +154,7 @@ func main() {
} }
// Function to map labels to prefixes // Function to map labels to prefixes
func getPrefixFromLabels(labelsStr string) (string, error) { func getPrefixFromLabels(labels []string) (string, error) {
// Define the label ➔ prefix correspondence // Define the label ➔ prefix correspondence
labelPrefixMap := map[string]string{ labelPrefixMap := map[string]string{
"enhancement": "feature", "enhancement": "feature",
@ -158,9 +162,6 @@ func getPrefixFromLabels(labelsStr string) (string, error) {
"bug": "hotfix", "bug": "hotfix",
} }
// Split labels (assuming they are comma-separated)
labels := strings.Split(labelsStr, ",")
// Create a mapping with lower-case keys // Create a mapping with lower-case keys
labelPrefixMapLower := make(map[string]string) labelPrefixMapLower := make(map[string]string)
for key, value := range labelPrefixMap { for key, value := range labelPrefixMap {
@ -169,9 +170,9 @@ func getPrefixFromLabels(labelsStr string) (string, error) {
} }
for _, label := range labels { for _, label := range labels {
label = strings.TrimSpace(label) trimmed := strings.TrimSpace(label)
labelLower := strings.ToLower(label) labelLower := strings.ToLower(trimmed)
fmt.Printf("Current label: %s", labelLower) fmt.Printf("Current label: %s\n", labelLower)
if prefix, exists := labelPrefixMapLower[labelLower]; exists { if prefix, exists := labelPrefixMapLower[labelLower]; exists {
return prefix, nil return prefix, nil
} }
@ -180,6 +181,58 @@ func getPrefixFromLabels(labelsStr string) (string, error) {
return "feature", nil return "feature", nil
} }
// Parse ISSUE_LABELS env which can be:
// - JSON array of strings: ["bug", "enhancement"]
// - JSON array of objects: [{"name":"bug"},{"name":"ui"}]
// - Comma-separated string: "bug, enhancement"
func parseLabels(raw string, logger *log.Logger) []string {
raw = strings.TrimSpace(raw)
if raw == "" {
return nil
}
// Try JSON array of strings
var arrStr []string
if err := json.Unmarshal([]byte(raw), &arrStr); err == nil {
return arrStr
}
// Try JSON array of objects with name
type lbl struct {
Name string `json:"name"`
}
var arrObj []lbl
if err := json.Unmarshal([]byte(raw), &arrObj); err == nil {
out := make([]string, 0, len(arrObj))
for _, o := range arrObj {
if o.Name != "" {
out = append(out, o.Name)
}
}
if len(out) > 0 {
return out
}
}
// Fallback: comma-separated values
if strings.Contains(raw, ",") {
parts := strings.Split(raw, ",")
for i := range parts {
parts[i] = strings.TrimSpace(parts[i])
}
return parts
}
// Last resort: if it looks like JSON but couldn't parse, log and return nil
if strings.HasPrefix(raw, "[") || strings.HasPrefix(raw, "{") {
logger.Printf("Warning: could not parse ISSUE_LABELS JSON: %s\n", raw)
return nil
}
// Otherwise single token
return []string{raw}
}
func runCommand(logger *log.Logger, name string, arg ...string) error { func runCommand(logger *log.Logger, name string, arg ...string) error {
cmd := exec.Command(name, arg...) cmd := exec.Command(name, arg...)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout