@@ -12,6 +12,7 @@ import (
12
12
"github.com/sashabaranov/go-openai"
13
13
14
14
ghClient "github.com/ravilushqa/gpt-pullrequest-updater/github"
15
+ "github.com/ravilushqa/gpt-pullrequest-updater/jira"
15
16
oAIClient "github.com/ravilushqa/gpt-pullrequest-updater/openai"
16
17
)
17
18
@@ -22,6 +23,7 @@ var opts struct {
22
23
Repo string `long:"repo" env:"REPO" description:"GitHub repo" required:"true"`
23
24
PRNumber int `long:"pr-number" env:"PR_NUMBER" description:"Pull request number" required:"true"`
24
25
Test bool `long:"test" env:"TEST" description:"Test mode"`
26
+ JiraURL string `long:"jira-url" env:"JIRA_URL" description:"Jira URL"`
25
27
}
26
28
27
29
func main () {
@@ -35,6 +37,10 @@ func main() {
35
37
os .Exit (0 )
36
38
}
37
39
40
+ if opts .Test {
41
+ fmt .Println ("Test mode" )
42
+ }
43
+
38
44
if err := run (ctx ); err != nil {
39
45
panic (err )
40
46
}
@@ -54,50 +60,104 @@ func run(ctx context.Context) error {
54
60
return fmt .Errorf ("error getting commits: %w" , err )
55
61
}
56
62
57
- var OverallDescribeCompletion string
58
- OverallDescribeCompletion += fmt .Sprintf ("Pull request title: %s, body: %s\n \n " , pr .GetTitle (), pr .GetBody ())
63
+ var sumDiffs int
64
+ for _ , file := range diff .Files {
65
+ sumDiffs += len (* file .Patch )
66
+ }
67
+
68
+ var completion string
69
+ if sumDiffs < 4000 {
70
+ completion , err = genCompletionOnce (ctx , openAIClient , diff )
71
+ if err != nil {
72
+ return fmt .Errorf ("error generating completition once: %w" , err )
73
+ }
74
+ } else {
75
+ completion , err = genCompletionPerFile (ctx , openAIClient , diff , pr )
76
+ if err != nil {
77
+ return fmt .Errorf ("error generating completition twice: %w" , err )
78
+ }
79
+ }
80
+
81
+ if opts .JiraURL != "" {
82
+ fmt .Println ("Adding Jira ticket" )
83
+ id , err := jira .ExtractJiraTicketID (* pr .Title )
84
+ if err != nil {
85
+ return err
86
+ }
87
+ completion = fmt .Sprintf ("### JIRA ticket: [%s](%s) \n \n %s" , id , jira .GenerateJiraTicketURL (opts .JiraURL , id ), completion )
88
+ }
89
+
90
+ if opts .Test {
91
+ fmt .Println (completion )
92
+ return nil
93
+ }
94
+
95
+ // Update the pull request description
96
+ fmt .Println ("Updating pull request" )
97
+ updatePr := & github.PullRequest {Body : github .String (completion )}
98
+ if _ , err = githubClient .UpdatePullRequest (ctx , opts .Owner , opts .Repo , opts .PRNumber , updatePr ); err != nil {
99
+ return fmt .Errorf ("error updating pull request: %w" , err )
100
+ }
101
+
102
+ return nil
103
+ }
104
+
105
+ func genCompletionOnce (ctx context.Context , client * oAIClient.Client , diff * github.CommitsComparison ) (string , error ) {
106
+ fmt .Println ("Generating completion once" )
107
+ messages := make ([]openai.ChatCompletionMessage , 0 , len (diff .Files ))
108
+ messages = append (messages , openai.ChatCompletionMessage {
109
+ Role : openai .ChatMessageRoleUser ,
110
+ Content : oAIClient .PromptDescribeChanges ,
111
+ })
59
112
for _ , file := range diff .Files {
113
+ messages = append (messages , openai.ChatCompletionMessage {
114
+ Role : openai .ChatMessageRoleUser ,
115
+ Content : * file .Patch ,
116
+ })
117
+ }
118
+
119
+ fmt .Println ("Sending prompt to OpenAI" )
120
+ completion , err := client .ChatCompletion (ctx , messages )
121
+ if err != nil {
122
+ return "" , fmt .Errorf ("error completing prompt: %w" , err )
123
+ }
124
+
125
+ return completion , nil
126
+ }
127
+
128
+ func genCompletionPerFile (ctx context.Context , client * oAIClient.Client , diff * github.CommitsComparison , pr * github.PullRequest ) (string , error ) {
129
+ fmt .Println ("Generating completion per file" )
130
+ OverallDescribeCompletion := fmt .Sprintf ("Pull request title: %s, body: %s\n \n " , pr .GetTitle (), pr .GetBody ())
131
+
132
+ for i , file := range diff .Files {
60
133
prompt := fmt .Sprintf (oAIClient .PromptDescribeChanges , * file .Patch )
61
134
62
135
if len (prompt ) > 4096 {
63
136
prompt = fmt .Sprintf ("%s..." , prompt [:4093 ])
64
137
}
65
138
66
- completion , err := openAIClient .ChatCompletion (ctx , []openai.ChatCompletionMessage {
139
+ fmt .Printf ("Sending prompt to OpenAI for file %d/%d\n " , i + 1 , len (diff .Files ))
140
+ completion , err := client .ChatCompletion (ctx , []openai.ChatCompletionMessage {
67
141
{
68
142
Role : openai .ChatMessageRoleUser ,
69
143
Content : prompt ,
70
144
},
71
145
})
72
146
if err != nil {
73
- return fmt .Errorf ("error getting review: %w" , err )
147
+ return "" , fmt .Errorf ("error getting review: %w" , err )
74
148
}
75
149
OverallDescribeCompletion += fmt .Sprintf ("File: %s \n Description: %s \n \n " , file .GetFilename (), completion )
76
150
}
77
151
78
- overallCompletion , err := openAIClient .ChatCompletion (ctx , []openai.ChatCompletionMessage {
152
+ overallCompletion , err := client .ChatCompletion (ctx , []openai.ChatCompletionMessage {
79
153
{
80
154
Role : openai .ChatMessageRoleUser ,
81
155
Content : fmt .Sprintf (oAIClient .PromptOverallDescribe , OverallDescribeCompletion ),
82
156
},
83
157
})
84
158
if err != nil {
85
- return fmt .Errorf ("error getting overall review: %w" , err )
86
- }
87
-
88
- if opts .Test {
89
- fmt .Println (OverallDescribeCompletion )
90
- fmt .Println ("=====================================" )
91
- fmt .Println (overallCompletion )
92
-
93
- return nil
159
+ return "" , fmt .Errorf ("error getting overall review: %w" , err )
94
160
}
95
161
96
- // Update the pull request description
97
- updatePr := & github.PullRequest {Body : github .String (overallCompletion )}
98
- if _ , err = githubClient .UpdatePullRequest (ctx , opts .Owner , opts .Repo , opts .PRNumber , updatePr ); err != nil {
99
- return fmt .Errorf ("error updating pull request: %w" , err )
100
- }
101
-
102
- return nil
162
+ return overallCompletion , nil
103
163
}
0 commit comments