feat: extract odoo ticket number from reference branch
This commit is contained in:
parent
b7bc01b0a7
commit
e27b7cc233
@ -1,7 +1,7 @@
|
|||||||
name: 'create-odoo-timesheet'
|
name: 'create-odoo-timesheet'
|
||||||
description: 'Create an Odoo timesheet via FastAPI when time is added on a Gitea Issue.'
|
description: 'Create an Odoo timesheet via FastAPI when time is added on a Gitea Issue.'
|
||||||
|
|
||||||
author: 'Mandresy RABENJAHARISON <mandresy.rabenjaharison@gmail.com>'
|
author: 'Mandresy RABENJAHARISON <mandresy.rabenjaharison@ethumada.com>'
|
||||||
branding:
|
branding:
|
||||||
icon: clock
|
icon: clock
|
||||||
color: blue
|
color: blue
|
||||||
@ -19,7 +19,7 @@ runs:
|
|||||||
ISSUE_NUMBER: ${{ gitea.event.issue.number }}
|
ISSUE_NUMBER: ${{ gitea.event.issue.number }}
|
||||||
ISSUE_TITLE: ${{ gitea.event.issue.title }}
|
ISSUE_TITLE: ${{ gitea.event.issue.title }}
|
||||||
SENDER_LOGIN: ${{ gitea.event.sender.login }}
|
SENDER_LOGIN: ${{ gitea.event.sender.login }}
|
||||||
# Issue time tracking fields (from the event payload)
|
|
||||||
TRACKED_SECONDS: ${{ gitea.event.tracked_time.time }}
|
TRACKED_SECONDS: ${{ gitea.event.tracked_time.time }}
|
||||||
TRACKED_CREATED: ${{ gitea.event.tracked_time.created }}
|
TRACKED_CREATED: ${{ gitea.event.tracked_time.created }}
|
||||||
EVENT_ACTION: ${{ gitea.event.action }}
|
EVENT_ACTION: ${{ gitea.event.action }}
|
||||||
|
BRANCH_REF: ${{ gitea.event.issue.ref }}
|
||||||
|
|||||||
50
main.go
50
main.go
@ -20,16 +20,54 @@ type TimesheetPayload struct {
|
|||||||
TaskID int64 `json:"task_id"`
|
TaskID int64 `json:"task_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseOdooTicketID extracts the numeric ticket id from a ref formatted like
|
||||||
|
// "<prefix>/ticket-<number>". It scans path segments and picks the first segment
|
||||||
|
// that starts with "ticket-" (case-insensitive), then reads leading digits.
|
||||||
|
func parseOdooTicketID(ref string) (int64, error) {
|
||||||
|
if strings.TrimSpace(ref) == "" {
|
||||||
|
return 0, fmt.Errorf("empty ref")
|
||||||
|
}
|
||||||
|
parts := strings.Split(ref, "/")
|
||||||
|
for _, seg := range parts {
|
||||||
|
if seg == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
lower := strings.ToLower(seg)
|
||||||
|
const pfx = "ticket-"
|
||||||
|
if strings.HasPrefix(lower, pfx) {
|
||||||
|
numPart := seg[len(pfx):]
|
||||||
|
// collect leading digits
|
||||||
|
var digits strings.Builder
|
||||||
|
for _, r := range numPart {
|
||||||
|
if r >= '0' && r <= '9' {
|
||||||
|
digits.WriteRune(r)
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if digits.Len() == 0 {
|
||||||
|
return 0, fmt.Errorf("no digits after ticket- in segment: %s", seg)
|
||||||
|
}
|
||||||
|
id, err := strconv.ParseInt(digits.String(), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return id, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, fmt.Errorf("no ticket-<number> segment found in ref: %s", ref)
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
baseURL := os.Getenv("BASE_URL")
|
baseURL := os.Getenv("BASE_URL")
|
||||||
issueNumber := os.Getenv("ISSUE_NUMBER")
|
branchRef := os.Getenv("BRANCH_REF")
|
||||||
sender := os.Getenv("SENDER_LOGIN")
|
sender := os.Getenv("SENDER_LOGIN")
|
||||||
title := os.Getenv("ISSUE_TITLE")
|
title := os.Getenv("ISSUE_TITLE")
|
||||||
trackedSeconds := os.Getenv("TRACKED_SECONDS")
|
trackedSeconds := os.Getenv("TRACKED_SECONDS")
|
||||||
trackedCreated := os.Getenv("TRACKED_CREATED")
|
trackedCreated := os.Getenv("TRACKED_CREATED")
|
||||||
action := os.Getenv("EVENT_ACTION")
|
action := os.Getenv("EVENT_ACTION")
|
||||||
|
|
||||||
if baseURL == "" || issueNumber == "" || sender == "" || trackedSeconds == "" || trackedCreated == "" {
|
if baseURL == "" || branchRef == "" || sender == "" || trackedSeconds == "" || trackedCreated == "" {
|
||||||
fmt.Println("Some required environment variables are missing.")
|
fmt.Println("Some required environment variables are missing.")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
@ -48,8 +86,12 @@ func main() {
|
|||||||
defer logFile.Close()
|
defer logFile.Close()
|
||||||
logger := log.New(io.MultiWriter(os.Stdout, logFile), "", log.LstdFlags)
|
logger := log.New(io.MultiWriter(os.Stdout, logFile), "", log.LstdFlags)
|
||||||
|
|
||||||
var taskID int64
|
// Extract task ID from branch ref
|
||||||
fmt.Sscanf(issueNumber, "%d", &taskID)
|
taskID, err := parseOdooTicketID(branchRef)
|
||||||
|
if err != nil {
|
||||||
|
logger.Printf("Failed to parse Odoo ticket from BRANCH_REF '%s': %v\n", branchRef, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
seconds, err := strconv.ParseInt(trackedSeconds, 10, 64)
|
seconds, err := strconv.ParseInt(trackedSeconds, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user