diff --git a/main.go b/main.go index df87e52..025c670 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "io" "log" @@ -28,7 +29,7 @@ func main() { logger.Printf("ODOO_TICKET_NUMBER: %s\n", issueOdooTicketString) issueTitle := os.Getenv("ISSUE_TITLE") - labelsStr := os.Getenv("ISSUE_LABELS") + labelsEnv := os.Getenv("ISSUE_LABELS") issueNumberString := os.Getenv("ISSUE_NUMBER") giteaToken := os.Getenv("GITEA_TOKEN") @@ -57,14 +58,17 @@ func main() { logger.Printf("Odoo ticket ID: %d\n", issueOdooTicketID) // Map labels to Git Flow prefixes - prefix := "feature" - if labelsStr != "" { - prefix, err = getPrefixFromLabels(labelsStr) + labels := parseLabels(labelsEnv, logger) + if len(labels) > 0 { + logger.Printf("Extracted labels: %s\n", strings.Join(labels, ", ")) } + prefix := "feature" + prefix, err = getPrefixFromLabels(labels) if err != nil { logger.Printf("Error while determining the prefix: %v\n", err) os.Exit(1) } + logger.Printf("Chosen prefix: %s\n", prefix) // Form the branch name in the format "prefix/ticket-number" branchName := fmt.Sprintf("%s/ticket-%d", prefix, issueOdooTicketID) @@ -150,7 +154,7 @@ func main() { } // Function to map labels to prefixes -func getPrefixFromLabels(labelsStr string) (string, error) { +func getPrefixFromLabels(labels []string) (string, error) { // Define the label ➔ prefix correspondence labelPrefixMap := map[string]string{ "enhancement": "feature", @@ -158,9 +162,6 @@ func getPrefixFromLabels(labelsStr string) (string, error) { "bug": "hotfix", } - // Split labels (assuming they are comma-separated) - labels := strings.Split(labelsStr, ",") - // Create a mapping with lower-case keys labelPrefixMapLower := make(map[string]string) for key, value := range labelPrefixMap { @@ -169,9 +170,9 @@ func getPrefixFromLabels(labelsStr string) (string, error) { } for _, label := range labels { - label = strings.TrimSpace(label) - labelLower := strings.ToLower(label) - fmt.Printf("Current label: %s", labelLower) + trimmed := strings.TrimSpace(label) + labelLower := strings.ToLower(trimmed) + fmt.Printf("Current label: %s\n", labelLower) if prefix, exists := labelPrefixMapLower[labelLower]; exists { return prefix, nil } @@ -180,6 +181,58 @@ func getPrefixFromLabels(labelsStr string) (string, error) { 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 { cmd := exec.Command(name, arg...) cmd.Stdout = os.Stdout