From 6edc5de4b90fd3cbf4d393603c7cf036dd80117f Mon Sep 17 00:00:00 2001 From: ono-teruya <27873650+teru01@users.noreply.github.com> Date: Fri, 4 Jul 2025 15:51:35 +0900 Subject: [PATCH 1/2] add break Signed-off-by: ono-teruya <27873650+teru01@users.noreply.github.com> --- flow/process.go | 1 + 1 file changed, 1 insertion(+) diff --git a/flow/process.go b/flow/process.go index faac243..58a386a 100644 --- a/flow/process.go +++ b/flow/process.go @@ -147,6 +147,7 @@ func (f *Flow) process(ctx context.Context, app *Application, version string) Pu } } } + break } } return prs From 31015238752723e10dd90ce8c1605eb9b78a3dc6 Mon Sep 17 00:00:00 2001 From: ono-teruya <27873650+teru01@users.noreply.github.com> Date: Fri, 4 Jul 2025 17:04:27 +0900 Subject: [PATCH 2/2] refactor Signed-off-by: ono-teruya <27873650+teru01@users.noreply.github.com> --- flow/process.go | 163 +++++++++++++++++++++++++----------------------- 1 file changed, 85 insertions(+), 78 deletions(-) diff --git a/flow/process.go b/flow/process.go index 58a386a..0694448 100644 --- a/flow/process.go +++ b/flow/process.go @@ -63,94 +63,101 @@ func (f *Flow) process(ctx context.Context, app *Application, version string) Pu continue } for attempt := 1; attempt <= f.maxRetries; attempt++ { - release := newRelease(*app, manifest, version, fmt.Sprintf("%d", attempt)) - - oldVersionSet := map[string]interface{}{} - for _, filePath := range manifest.Files { - release.MakeChangeFunc(ctx, client, filePath, fmt.Sprintf(imageRewriteRegexTemplate, app.Image), func(m regexp2.Match) string { - oldVersionSet[m.GroupByName("version").String()] = nil - return fmt.Sprintf("%s:%s", app.Image, version) - }) - release.MakeChangeFunc(ctx, client, filePath, versionRewriteRegex, func(m regexp2.Match) string { - oldVersionSet[m.GroupByName("version").String()] = nil - if f.enableVersionQuote { - return fmt.Sprintf("version: \"%s\"", version) - } - return fmt.Sprintf("version: %s", version) - }) - - for _, key := range app.AdditionalRewriteKeys { - release.MakeChangeFunc(ctx, client, filePath, fmt.Sprintf(additionalRewriteKeysRegexTemplate, key), func(m regexp2.Match) string { - oldVersionSet[m.GroupByName("version").String()] = nil - if f.enableVersionQuote { - return fmt.Sprintf("%s: \"%s\"", key, version) - } - return fmt.Sprintf("%s: %s", key, version) - }) - } - for _, prefix := range app.AdditionalRewritePrefix { - release.MakeChangeFunc(ctx, client, filePath, fmt.Sprintf(additionalRewritePrefixRegexTemplate, prefix), func(m regexp2.Match) string { - oldVersionSet[m.GroupByName("version").String()] = nil - return fmt.Sprintf("%s%s", prefix, version) - }) - } + err := f.processAttempt(ctx, client, app, manifest, version, attempt, &prs) + if err == nil { + break } + } + } + return prs +} - oldVersions := []string{} - for oldVersion := range oldVersionSet { - oldVersions = append(oldVersions, oldVersion) +func (f *Flow) processAttempt(ctx context.Context, client *github.Client, app *Application, manifest Manifest, version string, attempt int, prs *PullRequests) error { + release := newRelease(*app, manifest, version, fmt.Sprintf("%d", attempt)) + + oldVersionSet := map[string]interface{}{} + for _, filePath := range manifest.Files { + release.MakeChangeFunc(ctx, client, filePath, fmt.Sprintf(imageRewriteRegexTemplate, app.Image), func(m regexp2.Match) string { + oldVersionSet[m.GroupByName("version").String()] = nil + return fmt.Sprintf("%s:%s", app.Image, version) + }) + release.MakeChangeFunc(ctx, client, filePath, versionRewriteRegex, func(m regexp2.Match) string { + oldVersionSet[m.GroupByName("version").String()] = nil + if f.enableVersionQuote { + return fmt.Sprintf("version: \"%s\"", version) } - body := generateBody(ctx, client, app, manifest, version, oldVersions) - release.SetBody(body) + return fmt.Sprintf("version: %s", version) + }) + + for _, key := range app.AdditionalRewriteKeys { + release.MakeChangeFunc(ctx, client, filePath, fmt.Sprintf(additionalRewriteKeysRegexTemplate, key), func(m regexp2.Match) string { + oldVersionSet[m.GroupByName("version").String()] = nil + if f.enableVersionQuote { + return fmt.Sprintf("%s: \"%s\"", key, version) + } + return fmt.Sprintf("%s: %s", key, version) + }) + } + for _, prefix := range app.AdditionalRewritePrefix { + release.MakeChangeFunc(ctx, client, filePath, fmt.Sprintf(additionalRewritePrefixRegexTemplate, prefix), func(m regexp2.Match) string { + oldVersionSet[m.GroupByName("version").String()] = nil + return fmt.Sprintf("%s%s", prefix, version) + }) + } + } + + oldVersions := []string{} + for oldVersion := range oldVersionSet { + oldVersions = append(oldVersions, oldVersion) + } + body := generateBody(ctx, client, app, manifest, version, oldVersions) + release.SetBody(body) + + err := release.Commit(ctx, client) + if err != nil { + log.Printf("Error Commiting: %s", err) + return err + } - err := release.Commit(ctx, client) + if !manifest.CommitWithoutPR { + url, err := release.CreatePR(ctx, client) + if err != nil { + log.Printf("Error Submitting PR: %s", err) + return err + } + *prs = append(*prs, PullRequest{ + env: manifest.Env, + url: *url, + }) + + if f.enableAutoMerge && url != nil { + parts := strings.Split(*url, "/") + // Extract repository owner and name from the URL + // URL format: https://github.com/{owner}/{repo}/pull/{number} + if len(parts) < 5 { + log.Printf("Invalid PR URL format: %s", *url) + return fmt.Errorf("invalid PR URL format: %s", *url) + } + prNumber, err := strconv.Atoi(parts[len(parts)-1]) if err != nil { - log.Printf("Error Commiting: %s", err) - continue + log.Printf("Error extracting PR number from URL %s: %s", *url, err) + return fmt.Errorf("error extracting PR number from URL %s: %w", *url, err) } + repoOwner := parts[len(parts)-4] + repoName := parts[len(parts)-3] - if !manifest.CommitWithoutPR { - url, err := release.CreatePR(ctx, client) - if err != nil { - log.Printf("Error Submitting PR: %s", err) - continue - } - prs = append(prs, PullRequest{ - env: manifest.Env, - url: *url, - }) - - if f.enableAutoMerge && url != nil { - parts := strings.Split(*url, "/") - // Extract repository owner and name from the URL - // URL format: https://github.com/{owner}/{repo}/pull/{number} - if len(parts) < 5 { - log.Printf("Invalid PR URL format: %s", *url) - continue - } - prNumber, err := strconv.Atoi(parts[len(parts)-1]) - if err != nil { - log.Printf("Error extracting PR number from URL %s: %s", *url, err) - continue - } - repoOwner := parts[len(parts)-4] - repoName := parts[len(parts)-3] - - _, _, err = client.PullRequests.Merge(ctx, repoOwner, repoName, prNumber, "Auto-merged by flow", &github.PullRequestOptions{ - MergeMethod: "squash", - }) - if err != nil { - log.Printf("Error merging PR #%d: %s", prNumber, err) - continue - } else { - log.Printf("Successfully auto-merged PR #%d", prNumber) - } - } + _, _, err = client.PullRequests.Merge(ctx, repoOwner, repoName, prNumber, "Auto-merged by flow", &github.PullRequestOptions{ + MergeMethod: "squash", + }) + if err != nil { + log.Printf("Error merging PR #%d: %s", prNumber, err) + return fmt.Errorf("error merging PR #%d: %w", prNumber, err) + } else { + log.Printf("Successfully auto-merged PR #%d", prNumber) } - break } } - return prs + return nil } func shouldProcess(m Manifest, version string) bool {