feat: enhance label parsing to support multiple formats and improve logging
This commit is contained in:
parent
e1d0d43b5c
commit
444487b324
75
main.go
75
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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user