From e650c550d1521bf0ed6bf9da32e5bbbbd1a7ab45 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Sun, 9 Jul 2023 12:06:42 +0800 Subject: [PATCH 01/13] Add ShortcutBaseURL param --- cmd/description/main.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index aef8e06..68b9a17 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -17,14 +17,15 @@ import ( ) var opts struct { - GithubToken string `long:"gh-token" env:"GITHUB_TOKEN" description:"GitHub token" required:"true"` - OpenAIToken string `long:"openai-token" env:"OPENAI_TOKEN" description:"OpenAI token" required:"true"` - Owner string `long:"owner" env:"OWNER" description:"GitHub owner" required:"true"` - Repo string `long:"repo" env:"REPO" description:"GitHub repo" required:"true"` - PRNumber int `long:"pr-number" env:"PR_NUMBER" description:"Pull request number" required:"true"` - OpenAIModel string `long:"openai-model" env:"OPENAI_MODEL" description:"OpenAI model" default:"gpt-3.5-turbo"` - Test bool `long:"test" env:"TEST" description:"Test mode"` - JiraURL string `long:"jira-url" env:"JIRA_URL" description:"Jira URL. Example: https://jira.atlassian.com"` + GithubToken string `long:"gh-token" env:"GITHUB_TOKEN" description:"GitHub token" required:"true"` + OpenAIToken string `long:"openai-token" env:"OPENAI_TOKEN" description:"OpenAI token" required:"true"` + Owner string `long:"owner" env:"OWNER" description:"GitHub owner" required:"true"` + Repo string `long:"repo" env:"REPO" description:"GitHub repo" required:"true"` + PRNumber int `long:"pr-number" env:"PR_NUMBER" description:"Pull request number" required:"true"` + OpenAIModel string `long:"openai-model" env:"OPENAI_MODEL" description:"OpenAI model" default:"gpt-3.5-turbo"` + Test bool `long:"test" env:"TEST" description:"Test mode"` + JiraURL string `long:"jira-url" env:"JIRA_URL" description:"Jira URL. Example: https://jira.atlassian.com"` + ShortcutBaseURL string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo/"` } func main() { From 35e205c8c8e0d8289a3ba0ef70d4fcf934dcdb5b Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Sun, 9 Jul 2023 13:02:25 +0800 Subject: [PATCH 02/13] Add shortcut link to description --- README.md | 2 +- cmd/description/main.go | 32 +++++++++++++++++++++++++++++--- shortcut/shortcut.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 shortcut/shortcut.go diff --git a/README.md b/README.md index 8cf5535..47c268a 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Replace ``, ``, ``, ``, and ` Date: Sun, 9 Jul 2023 13:09:53 +0800 Subject: [PATCH 03/13] Fix after linter --- cmd/description/main.go | 18 +++++++++--------- shortcut/shortcut.go | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index 0a70774..16991ca 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -3,8 +3,6 @@ package main import ( "context" "fmt" - "github.com/ravilushqa/gpt-pullrequest-updater/description" - oAIClient "github.com/ravilushqa/gpt-pullrequest-updater/openai" "github.com/ravilushqa/gpt-pullrequest-updater/shortcut" "os" "os/signal" @@ -13,8 +11,10 @@ import ( "github.com/google/go-github/v51/github" "github.com/jessevdk/go-flags" + "github.com/ravilushqa/gpt-pullrequest-updater/description" ghClient "github.com/ravilushqa/gpt-pullrequest-updater/github" "github.com/ravilushqa/gpt-pullrequest-updater/jira" + oAIClient "github.com/ravilushqa/gpt-pullrequest-updater/openai" ) var opts struct { @@ -26,7 +26,7 @@ var opts struct { OpenAIModel string `long:"openai-model" env:"OPENAI_MODEL" description:"OpenAI model" default:"gpt-3.5-turbo"` Test bool `long:"test" env:"TEST" description:"Test mode"` JiraURL string `long:"jira-url" env:"JIRA_URL" description:"Jira URL. Example: https://jira.atlassian.com"` - ShortcutBaseUrl string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo/"` + ShortcutBaseURL string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo/"` } func main() { @@ -74,8 +74,8 @@ func run(ctx context.Context) error { } } - if opts.ShortcutBaseUrl != "" { - shortcutContent := buildShortcutContent(opts.ShortcutBaseUrl, pr) + if opts.ShortcutBaseURL != "" { + shortcutContent := buildShortcutContent(opts.ShortcutBaseURL, pr) if shortcutContent != "" { completion = fmt.Sprintf("%s\n\n%s", shortcutContent, completion) } @@ -95,14 +95,14 @@ func run(ctx context.Context) error { return nil } -func buildShortcutContent(shortcutBaseUrl string, pr *github.PullRequest) string { +func buildShortcutContent(shortcutBaseURL string, pr *github.PullRequest) string { fmt.Println("Adding Shortcut ticket") - id, err := shortcut.ExtractShortcutStoryId(*pr.Title) + id, err := shortcut.ExtractShortcutStoryID(*pr.Title) if err != nil { // Extracting from the branch name - id, err = shortcut.ExtractShortcutStoryId(*pr.Head.Ref) + id, err = shortcut.ExtractShortcutStoryID(*pr.Head.Ref) } if err != nil { @@ -110,5 +110,5 @@ func buildShortcutContent(shortcutBaseUrl string, pr *github.PullRequest) string return "" } - return fmt.Sprintf("### Shortcut story: [%s](%s)", id, shortcut.GenerateShortcutStoryUrl(shortcutBaseUrl, id)) + return fmt.Sprintf("### Shortcut story: [%s](%s)", id, shortcut.GenerateShortcutStoryUrl(shortcutBaseURL, id)) } diff --git a/shortcut/shortcut.go b/shortcut/shortcut.go index fb7af04..165fdcb 100644 --- a/shortcut/shortcut.go +++ b/shortcut/shortcut.go @@ -7,7 +7,7 @@ import ( const storyUrlFormat = "%s/story/%s" -func ExtractShortcutStoryId(title string) (string, error) { +func ExtractShortcutStoryID(title string) (string, error) { // This regular expression pattern matches a Shortcut story ID (e.g. sc-12345). pattern := `sc-([\d]+)` From 5d34b063051b6438fbe37258f45bfb0e279722dc Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Sun, 9 Jul 2023 13:17:37 +0800 Subject: [PATCH 04/13] Fix after lint and add test --- cmd/description/main.go | 6 ++--- shortcut/shortcut.go | 6 ++--- shortcut/shortcut_test.go | 51 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 shortcut/shortcut_test.go diff --git a/cmd/description/main.go b/cmd/description/main.go index 16991ca..873572d 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -3,7 +3,6 @@ package main import ( "context" "fmt" - "github.com/ravilushqa/gpt-pullrequest-updater/shortcut" "os" "os/signal" "syscall" @@ -15,6 +14,7 @@ import ( ghClient "github.com/ravilushqa/gpt-pullrequest-updater/github" "github.com/ravilushqa/gpt-pullrequest-updater/jira" oAIClient "github.com/ravilushqa/gpt-pullrequest-updater/openai" + "github.com/ravilushqa/gpt-pullrequest-updater/shortcut" ) var opts struct { @@ -26,7 +26,7 @@ var opts struct { OpenAIModel string `long:"openai-model" env:"OPENAI_MODEL" description:"OpenAI model" default:"gpt-3.5-turbo"` Test bool `long:"test" env:"TEST" description:"Test mode"` JiraURL string `long:"jira-url" env:"JIRA_URL" description:"Jira URL. Example: https://jira.atlassian.com"` - ShortcutBaseURL string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo/"` + ShortcutBaseURL string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo"` } func main() { @@ -110,5 +110,5 @@ func buildShortcutContent(shortcutBaseURL string, pr *github.PullRequest) string return "" } - return fmt.Sprintf("### Shortcut story: [%s](%s)", id, shortcut.GenerateShortcutStoryUrl(shortcutBaseURL, id)) + return fmt.Sprintf("### Shortcut story: [%s](%s)", id, shortcut.GenerateShortcutStoryURL(shortcutBaseURL, id)) } diff --git a/shortcut/shortcut.go b/shortcut/shortcut.go index 165fdcb..9335e5e 100644 --- a/shortcut/shortcut.go +++ b/shortcut/shortcut.go @@ -5,7 +5,7 @@ import ( "regexp" ) -const storyUrlFormat = "%s/story/%s" +const storyURLFormat = "%s/story/%s" func ExtractShortcutStoryID(title string) (string, error) { @@ -24,6 +24,6 @@ func ExtractShortcutStoryID(title string) (string, error) { return matches[1], nil } -func GenerateShortcutStoryUrl(shortcutBaseUrl, ticketId string) string { - return fmt.Sprintf(storyUrlFormat, shortcutBaseUrl, ticketId) +func GenerateShortcutStoryURL(shortcutBaseUrl, ticketId string) string { + return fmt.Sprintf(storyURLFormat, shortcutBaseUrl, ticketId) } diff --git a/shortcut/shortcut_test.go b/shortcut/shortcut_test.go new file mode 100644 index 0000000..62f5b44 --- /dev/null +++ b/shortcut/shortcut_test.go @@ -0,0 +1,51 @@ +package shortcut + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExtractShortcutStoryID(t *testing.T) { + testCases := []struct { + title string + expectedID string + expectedErr bool + }{ + { + title: "This is a sample title with a valid story ID sc-12345", + expectedID: "12345", + expectedErr: false, + }, + { + title: "No story ID in this title", + expectedID: "", + expectedErr: true, + }, + { + title: "Invalid story ID format sc-abcde", + expectedID: "", + expectedErr: true, + }, + } + + for _, tc := range testCases { + id, err := ExtractShortcutStoryID(tc.title) + + if tc.expectedErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.expectedID, id) + } + } +} + +func TestGenerateShortcutStoryURL(t *testing.T) { + baseURL := "https://app.shortcut.com/foo" + ticketID := "12345" + expectedURL := "https://app.shortcut.com/foo/story/12345" + + url := GenerateShortcutStoryURL(baseURL, ticketID) + assert.Equal(t, expectedURL, url) +} From d64de60abbca1e2798d172390779e65f0e8bc498 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Sun, 9 Jul 2023 13:19:24 +0800 Subject: [PATCH 05/13] Fix lint --- shortcut/shortcut.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shortcut/shortcut.go b/shortcut/shortcut.go index 9335e5e..0adc6e3 100644 --- a/shortcut/shortcut.go +++ b/shortcut/shortcut.go @@ -24,6 +24,6 @@ func ExtractShortcutStoryID(title string) (string, error) { return matches[1], nil } -func GenerateShortcutStoryURL(shortcutBaseUrl, ticketId string) string { - return fmt.Sprintf(storyURLFormat, shortcutBaseUrl, ticketId) +func GenerateShortcutStoryURL(shortcutBaseURL, ticketID string) string { + return fmt.Sprintf(storyURLFormat, shortcutBaseURL, ticketID) } From 0af79ba4fc93d6637407ba5dd3f61dab2e1ed393 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Mon, 10 Jul 2023 09:39:32 +0800 Subject: [PATCH 06/13] Use placeholder for description --- cmd/description/main.go | 49 ++++++++++++++++++++++++++++++++------ description/description.go | 6 +++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index 873572d..84dd7de 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "os/signal" + "strings" "syscall" "github.com/google/go-github/v51/github" @@ -29,6 +30,14 @@ var opts struct { ShortcutBaseURL string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo"` } +type prDataType struct { + completion string + jiraInfo string + shortcutInfo string +} + +var prData prDataType + func main() { ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() @@ -59,7 +68,7 @@ func run(ctx context.Context) error { return fmt.Errorf("error getting commits: %w", err) } - completion, err := description.GenerateCompletion(ctx, openAIClient, diff, pr) + prData.completion, err = description.GenerateCompletion(ctx, openAIClient, diff, pr) if err != nil { return fmt.Errorf("error generating completion: %w", err) } @@ -70,15 +79,12 @@ func run(ctx context.Context) error { if err != nil { fmt.Printf("Error extracting Jira ticket ID: %v \n", err) } else { - completion = fmt.Sprintf("### JIRA ticket: [%s](%s) \n\n%s", id, jira.GenerateJiraTicketURL(opts.JiraURL, id), completion) + prData.jiraInfo = fmt.Sprintf("### JIRA ticket: [%s](%s)", id, jira.GenerateJiraTicketURL(opts.JiraURL, id)) } } if opts.ShortcutBaseURL != "" { - shortcutContent := buildShortcutContent(opts.ShortcutBaseURL, pr) - if shortcutContent != "" { - completion = fmt.Sprintf("%s\n\n%s", shortcutContent, completion) - } + prData.shortcutInfo = buildShortcutContent(opts.ShortcutBaseURL, pr) } if opts.Test { @@ -87,7 +93,7 @@ func run(ctx context.Context) error { // Update the pull request description fmt.Println("Updating pull request") - updatePr := &github.PullRequest{Body: github.String(completion)} + updatePr := buildUpdatedDescription(*pr.Body, prData) if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatePr); err != nil { return fmt.Errorf("error updating pull request: %w", err) } @@ -112,3 +118,32 @@ func buildShortcutContent(shortcutBaseURL string, pr *github.PullRequest) string return fmt.Sprintf("### Shortcut story: [%s](%s)", id, shortcut.GenerateShortcutStoryURL(shortcutBaseURL, id)) } + +func buildUpdatedDescription(existingBody string, prData prDataType) *github.PullRequest { + + desc := "" + + if prData.jiraInfo != "" { + desc = prData.jiraInfo + "\n\n" + desc + } + + if prData.shortcutInfo != "" { + desc = prData.shortcutInfo + "\n\n" + desc + } + + if prData.completion != "" { + desc += prData.completion + } + + if existingBody != "" && strings.Contains(existingBody, description.Placeholder) { + builtBody := strings.Replace( + existingBody, + description.Placeholder, + description.PlaceholderHidden+desc, + 1, + ) + return &github.PullRequest{Body: github.String(builtBody)} + } + + return &github.PullRequest{Body: github.String(desc)} +} diff --git a/description/description.go b/description/description.go index 5887a33..7d2f098 100644 --- a/description/description.go +++ b/description/description.go @@ -10,6 +10,12 @@ import ( oAIClient "github.com/ravilushqa/gpt-pullrequest-updater/openai" ) +const Placeholder = "gpt-updater:description" +const PlaceholderHidden = ` +` + func GenerateCompletion(ctx context.Context, client *oAIClient.Client, diff *github.CommitsComparison, pr *github.PullRequest) (string, error) { sumDiffs := calculateSumDiffs(diff) From 4594511c96cd14e35f40e527a959fd2f6f9b3e10 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Mon, 10 Jul 2023 13:13:02 +0800 Subject: [PATCH 07/13] Isolate method --- cmd/description/main.go | 48 +++++--------------------------------- description/description.go | 42 +++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 47 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index 84dd7de..29c253f 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "os/signal" - "strings" "syscall" "github.com/google/go-github/v51/github" @@ -30,13 +29,7 @@ var opts struct { ShortcutBaseURL string `long:"shortcut-url" env:"SHORTCUT_URL" description:"Shortcut URL. Example: https://app.shortcut.com/foo"` } -type prDataType struct { - completion string - jiraInfo string - shortcutInfo string -} - -var prData prDataType +var descriptionInfo description.Info func main() { ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) @@ -68,7 +61,7 @@ func run(ctx context.Context) error { return fmt.Errorf("error getting commits: %w", err) } - prData.completion, err = description.GenerateCompletion(ctx, openAIClient, diff, pr) + descriptionInfo.Completion, err = description.GenerateCompletion(ctx, openAIClient, diff, pr) if err != nil { return fmt.Errorf("error generating completion: %w", err) } @@ -79,12 +72,12 @@ func run(ctx context.Context) error { if err != nil { fmt.Printf("Error extracting Jira ticket ID: %v \n", err) } else { - prData.jiraInfo = fmt.Sprintf("### JIRA ticket: [%s](%s)", id, jira.GenerateJiraTicketURL(opts.JiraURL, id)) + descriptionInfo.JiraInfo = fmt.Sprintf("### JIRA ticket: [%s](%s)", id, jira.GenerateJiraTicketURL(opts.JiraURL, id)) } } if opts.ShortcutBaseURL != "" { - prData.shortcutInfo = buildShortcutContent(opts.ShortcutBaseURL, pr) + descriptionInfo.ShortcutInfo = buildShortcutContent(opts.ShortcutBaseURL, pr) } if opts.Test { @@ -93,8 +86,8 @@ func run(ctx context.Context) error { // Update the pull request description fmt.Println("Updating pull request") - updatePr := buildUpdatedDescription(*pr.Body, prData) - if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatePr); err != nil { + updatedPr := description.BuildUpdatedPullRequest(*pr.Body, descriptionInfo) + if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatedPr); err != nil { return fmt.Errorf("error updating pull request: %w", err) } @@ -118,32 +111,3 @@ func buildShortcutContent(shortcutBaseURL string, pr *github.PullRequest) string return fmt.Sprintf("### Shortcut story: [%s](%s)", id, shortcut.GenerateShortcutStoryURL(shortcutBaseURL, id)) } - -func buildUpdatedDescription(existingBody string, prData prDataType) *github.PullRequest { - - desc := "" - - if prData.jiraInfo != "" { - desc = prData.jiraInfo + "\n\n" + desc - } - - if prData.shortcutInfo != "" { - desc = prData.shortcutInfo + "\n\n" + desc - } - - if prData.completion != "" { - desc += prData.completion - } - - if existingBody != "" && strings.Contains(existingBody, description.Placeholder) { - builtBody := strings.Replace( - existingBody, - description.Placeholder, - description.PlaceholderHidden+desc, - 1, - ) - return &github.PullRequest{Body: github.String(builtBody)} - } - - return &github.PullRequest{Body: github.String(desc)} -} diff --git a/description/description.go b/description/description.go index 7d2f098..7724e19 100644 --- a/description/description.go +++ b/description/description.go @@ -3,6 +3,7 @@ package description import ( "context" "fmt" + "strings" "github.com/google/go-github/v51/github" "github.com/sashabaranov/go-openai" @@ -10,11 +11,13 @@ import ( oAIClient "github.com/ravilushqa/gpt-pullrequest-updater/openai" ) -const Placeholder = "gpt-updater:description" -const PlaceholderHidden = ` -` +const placeholder = "gpt-updater:description" + +type Info struct { + Completion string + JiraInfo string + ShortcutInfo string +} func GenerateCompletion(ctx context.Context, client *oAIClient.Client, diff *github.CommitsComparison, pr *github.PullRequest) (string, error) { sumDiffs := calculateSumDiffs(diff) @@ -30,6 +33,35 @@ func GenerateCompletion(ctx context.Context, client *oAIClient.Client, diff *git return completion, err } +func BuildUpdatedPullRequest(existingDescription string, info Info) *github.PullRequest { + + desc := "" + + if info.JiraInfo != "" { + desc = info.JiraInfo + "\n\n" + desc + } + + if info.ShortcutInfo != "" { + desc = info.ShortcutInfo + "\n\n" + desc + } + + if info.Completion != "" { + desc += info.Completion + } + + if existingDescription != "" && strings.Contains(existingDescription, placeholder) { + builtBody := strings.Replace( + existingDescription, + placeholder, + fmt.Sprintf("## 🤖 gpt-updater description\n\n%s", placeholder, desc), + 1, + ) + return &github.PullRequest{Body: github.String(builtBody)} + } + + return &github.PullRequest{Body: github.String(desc)} +} + func calculateSumDiffs(diff *github.CommitsComparison) int { sumDiffs := 0 for _, file := range diff.Files { From 98a9345aed7f4f51d0d94c1d2d19b26faeefd175 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Mon, 10 Jul 2023 13:33:53 +0800 Subject: [PATCH 08/13] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 47c268a..9263bcb 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,11 @@ Replace ``, ``, ``, ``, and ` Date: Mon, 10 Jul 2023 13:46:01 +0800 Subject: [PATCH 09/13] Add template block --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9263bcb..ef1b28e 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,10 @@ Replace ``, ``, ``, ``, and ` Date: Mon, 10 Jul 2023 13:47:11 +0800 Subject: [PATCH 10/13] Add PR template --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..0b26d05 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1 @@ +gpt-updater:description From 11d20372b592e8bd9ff06380781cb1cbc65c8013 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Tue, 11 Jul 2023 14:11:19 +0800 Subject: [PATCH 11/13] Fix double description --- cmd/description/main.go | 11 ++++++++--- description/description.go | 24 +++++++++++++++--------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index 29c253f..eb7797f 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -86,9 +86,14 @@ func run(ctx context.Context) error { // Update the pull request description fmt.Println("Updating pull request") - updatedPr := description.BuildUpdatedPullRequest(*pr.Body, descriptionInfo) - if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatedPr); err != nil { - return fmt.Errorf("error updating pull request: %w", err) + + if description.IsDescriptionFinished(*pr.Body) { + fmt.Println("Pull request already has a generated description. Skipping...") + } else { + updatedPr := description.BuildUpdatedPullRequest(*pr.Body, descriptionInfo) + if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatedPr); err != nil { + return fmt.Errorf("error updating pull request: %w", err) + } } return nil diff --git a/description/description.go b/description/description.go index 7724e19..e5a01d7 100644 --- a/description/description.go +++ b/description/description.go @@ -12,6 +12,7 @@ import ( ) const placeholder = "gpt-updater:description" +const placeholderFinished = "" type Info struct { Completion string @@ -49,17 +50,22 @@ func BuildUpdatedPullRequest(existingDescription string, info Info) *github.Pull desc += info.Completion } - if existingDescription != "" && strings.Contains(existingDescription, placeholder) { - builtBody := strings.Replace( - existingDescription, - placeholder, - fmt.Sprintf("## 🤖 gpt-updater description\n\n%s", placeholder, desc), - 1, - ) - return &github.PullRequest{Body: github.String(builtBody)} + builtBody := fmt.Sprintf("## 🤖 gpt-updater description\n%s\n%s", placeholderFinished, desc) + + if needToUpdateByPlaceholder(existingDescription) { + builtBody = strings.Replace(existingDescription, placeholder, builtBody, 1) } - return &github.PullRequest{Body: github.String(desc)} + return &github.PullRequest{Body: github.String(builtBody)} +} + +func IsDescriptionFinished(existingDescription string) bool { + return strings.Contains(existingDescription, placeholderFinished) +} + +func needToUpdateByPlaceholder(existingDescription string) bool { + return !strings.Contains(existingDescription, placeholderFinished) && + strings.Contains(existingDescription, placeholder) } func calculateSumDiffs(diff *github.CommitsComparison) int { From d02203abdcb1e3ce684979a283081d64468fd9a0 Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Tue, 11 Jul 2023 14:20:55 +0800 Subject: [PATCH 12/13] Optimizing requests --- cmd/description/main.go | 16 ++++++++-------- description/description.go | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index eb7797f..6fb00fd 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -56,6 +56,11 @@ func run(ctx context.Context) error { return fmt.Errorf("error getting pull request: %w", err) } + if description.IsDescriptionFinished(*pr.Body) { + fmt.Println("Pull request already has a generated description. Skipping...") + return nil + } + diff, err := githubClient.CompareCommits(ctx, opts.Owner, opts.Repo, pr.GetBase().GetSHA(), pr.GetHead().GetSHA()) if err != nil { return fmt.Errorf("error getting commits: %w", err) @@ -86,14 +91,9 @@ func run(ctx context.Context) error { // Update the pull request description fmt.Println("Updating pull request") - - if description.IsDescriptionFinished(*pr.Body) { - fmt.Println("Pull request already has a generated description. Skipping...") - } else { - updatedPr := description.BuildUpdatedPullRequest(*pr.Body, descriptionInfo) - if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatedPr); err != nil { - return fmt.Errorf("error updating pull request: %w", err) - } + updatedPr := description.BuildUpdatedPullRequest(*pr.Body, descriptionInfo) + if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatedPr); err != nil { + return fmt.Errorf("error updating pull request: %w", err) } return nil diff --git a/description/description.go b/description/description.go index e5a01d7..f722f0d 100644 --- a/description/description.go +++ b/description/description.go @@ -50,7 +50,7 @@ func BuildUpdatedPullRequest(existingDescription string, info Info) *github.Pull desc += info.Completion } - builtBody := fmt.Sprintf("## 🤖 gpt-updater description\n%s\n%s", placeholderFinished, desc) + builtBody := fmt.Sprintf("%s\n## 🤖 gpt-updater description\n%s", placeholderFinished, desc) if needToUpdateByPlaceholder(existingDescription) { builtBody = strings.Replace(existingDescription, placeholder, builtBody, 1) From f50fad157d5b5868d6340479e96c4d61b8cdc43c Mon Sep 17 00:00:00 2001 From: vanilevsky Date: Thu, 13 Jul 2023 11:27:12 +0800 Subject: [PATCH 13/13] Fix nil pointer --- cmd/description/main.go | 4 ++-- description/description.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/description/main.go b/cmd/description/main.go index 6fb00fd..7be50bb 100644 --- a/cmd/description/main.go +++ b/cmd/description/main.go @@ -56,7 +56,7 @@ func run(ctx context.Context) error { return fmt.Errorf("error getting pull request: %w", err) } - if description.IsDescriptionFinished(*pr.Body) { + if pr.Body != nil && description.IsDescriptionFinished(*pr.Body) { fmt.Println("Pull request already has a generated description. Skipping...") return nil } @@ -91,7 +91,7 @@ func run(ctx context.Context) error { // Update the pull request description fmt.Println("Updating pull request") - updatedPr := description.BuildUpdatedPullRequest(*pr.Body, descriptionInfo) + updatedPr := description.BuildUpdatedPullRequest(pr.Body, descriptionInfo) if _, err = githubClient.UpdatePullRequest(ctx, opts.Owner, opts.Repo, opts.PRNumber, updatedPr); err != nil { return fmt.Errorf("error updating pull request: %w", err) } diff --git a/description/description.go b/description/description.go index f722f0d..828c8f0 100644 --- a/description/description.go +++ b/description/description.go @@ -34,7 +34,7 @@ func GenerateCompletion(ctx context.Context, client *oAIClient.Client, diff *git return completion, err } -func BuildUpdatedPullRequest(existingDescription string, info Info) *github.PullRequest { +func BuildUpdatedPullRequest(existingDescription *string, info Info) *github.PullRequest { desc := "" @@ -52,8 +52,8 @@ func BuildUpdatedPullRequest(existingDescription string, info Info) *github.Pull builtBody := fmt.Sprintf("%s\n## 🤖 gpt-updater description\n%s", placeholderFinished, desc) - if needToUpdateByPlaceholder(existingDescription) { - builtBody = strings.Replace(existingDescription, placeholder, builtBody, 1) + if existingDescription != nil && needToUpdateByPlaceholder(*existingDescription) { + builtBody = strings.Replace(*existingDescription, placeholder, builtBody, 1) } return &github.PullRequest{Body: github.String(builtBody)}