Skip to content

Commit d879c6b

Browse files
committed
introduce minimal pr type
1 parent efe9d40 commit d879c6b

File tree

3 files changed

+153
-23
lines changed

3 files changed

+153
-23
lines changed

pkg/github/minimal_types.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,138 @@ type MinimalProject struct {
134134
OwnerType string `json:"owner_type,omitempty"`
135135
}
136136

137+
// MinimalPullRequest is the trimmed output type for pull request objects to reduce verbosity.
138+
type MinimalPullRequest struct {
139+
Number int `json:"number"`
140+
Title string `json:"title"`
141+
Body string `json:"body,omitempty"`
142+
State string `json:"state"`
143+
Draft bool `json:"draft"`
144+
Merged bool `json:"merged"`
145+
MergeableState string `json:"mergeable_state,omitempty"`
146+
HTMLURL string `json:"html_url"`
147+
User *MinimalUser `json:"user,omitempty"`
148+
Labels []string `json:"labels,omitempty"`
149+
Assignees []string `json:"assignees,omitempty"`
150+
RequestedReviewers []string `json:"requested_reviewers,omitempty"`
151+
MergedBy string `json:"merged_by,omitempty"`
152+
Head *MinimalPRBranch `json:"head,omitempty"`
153+
Base *MinimalPRBranch `json:"base,omitempty"`
154+
Additions int `json:"additions,omitempty"`
155+
Deletions int `json:"deletions,omitempty"`
156+
ChangedFiles int `json:"changed_files,omitempty"`
157+
Commits int `json:"commits,omitempty"`
158+
Comments int `json:"comments,omitempty"`
159+
CreatedAt string `json:"created_at,omitempty"`
160+
UpdatedAt string `json:"updated_at,omitempty"`
161+
ClosedAt string `json:"closed_at,omitempty"`
162+
MergedAt string `json:"merged_at,omitempty"`
163+
Milestone string `json:"milestone,omitempty"`
164+
}
165+
166+
// MinimalPRBranch is the trimmed output type for pull request branch references.
167+
type MinimalPRBranch struct {
168+
Ref string `json:"ref"`
169+
SHA string `json:"sha"`
170+
Repo *MinimalPRBranchRepo `json:"repo,omitempty"`
171+
}
172+
173+
// MinimalPRBranchRepo is the trimmed repo info nested inside a PR branch.
174+
type MinimalPRBranchRepo struct {
175+
FullName string `json:"full_name"`
176+
Description string `json:"description,omitempty"`
177+
}
178+
137179
// Helper functions
138180

181+
func convertToMinimalPullRequest(pr *github.PullRequest) MinimalPullRequest {
182+
m := MinimalPullRequest{
183+
Number: pr.GetNumber(),
184+
Title: pr.GetTitle(),
185+
Body: pr.GetBody(),
186+
State: pr.GetState(),
187+
Draft: pr.GetDraft(),
188+
Merged: pr.GetMerged(),
189+
MergeableState: pr.GetMergeableState(),
190+
HTMLURL: pr.GetHTMLURL(),
191+
User: convertToMinimalUser(pr.GetUser()),
192+
Additions: pr.GetAdditions(),
193+
Deletions: pr.GetDeletions(),
194+
ChangedFiles: pr.GetChangedFiles(),
195+
Commits: pr.GetCommits(),
196+
Comments: pr.GetComments(),
197+
}
198+
199+
if pr.CreatedAt != nil {
200+
m.CreatedAt = pr.CreatedAt.Format("2006-01-02T15:04:05Z")
201+
}
202+
if pr.UpdatedAt != nil {
203+
m.UpdatedAt = pr.UpdatedAt.Format("2006-01-02T15:04:05Z")
204+
}
205+
if pr.ClosedAt != nil {
206+
m.ClosedAt = pr.ClosedAt.Format("2006-01-02T15:04:05Z")
207+
}
208+
if pr.MergedAt != nil {
209+
m.MergedAt = pr.MergedAt.Format("2006-01-02T15:04:05Z")
210+
}
211+
212+
for _, label := range pr.Labels {
213+
if label != nil {
214+
m.Labels = append(m.Labels, label.GetName())
215+
}
216+
}
217+
218+
for _, assignee := range pr.Assignees {
219+
if assignee != nil {
220+
m.Assignees = append(m.Assignees, assignee.GetLogin())
221+
}
222+
}
223+
224+
for _, reviewer := range pr.RequestedReviewers {
225+
if reviewer != nil {
226+
m.RequestedReviewers = append(m.RequestedReviewers, reviewer.GetLogin())
227+
}
228+
}
229+
230+
if mergedBy := pr.GetMergedBy(); mergedBy != nil {
231+
m.MergedBy = mergedBy.GetLogin()
232+
}
233+
234+
if head := pr.Head; head != nil {
235+
m.Head = convertToMinimalPRBranch(head)
236+
}
237+
238+
if base := pr.Base; base != nil {
239+
m.Base = convertToMinimalPRBranch(base)
240+
}
241+
242+
if milestone := pr.GetMilestone(); milestone != nil {
243+
m.Milestone = milestone.GetTitle()
244+
}
245+
246+
return m
247+
}
248+
249+
func convertToMinimalPRBranch(branch *github.PullRequestBranch) *MinimalPRBranch {
250+
if branch == nil {
251+
return nil
252+
}
253+
254+
b := &MinimalPRBranch{
255+
Ref: branch.GetRef(),
256+
SHA: branch.GetSHA(),
257+
}
258+
259+
if repo := branch.GetRepo(); repo != nil {
260+
b.Repo = &MinimalPRBranchRepo{
261+
FullName: repo.GetFullName(),
262+
Description: repo.GetDescription(),
263+
}
264+
}
265+
266+
return b
267+
}
268+
139269
func convertToMinimalProject(fullProject *github.ProjectV2) *MinimalProject {
140270
if fullProject == nil {
141271
return nil

pkg/github/pullrequests.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,9 @@ func GetPullRequest(ctx context.Context, client *github.Client, deps ToolDepende
186186
}
187187
}
188188

189-
r, err := json.Marshal(pr)
190-
if err != nil {
191-
return nil, fmt.Errorf("failed to marshal response: %w", err)
192-
}
189+
minimalPR := convertToMinimalPullRequest(pr)
193190

194-
return utils.NewToolResultText(string(r)), nil
191+
return MarshalledTextResult(minimalPR), nil
195192
}
196193

197194
func GetPullRequestDiff(ctx context.Context, client *github.Client, owner, repo string, pullNumber int) (*mcp.CallToolResult, error) {
@@ -1171,12 +1168,15 @@ func ListPullRequests(t translations.TranslationHelperFunc) inventory.ServerTool
11711168
}
11721169
}
11731170

1174-
r, err := json.Marshal(prs)
1175-
if err != nil {
1176-
return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil, nil
1171+
minimalPRs := make([]MinimalPullRequest, 0, len(prs))
1172+
for _, pr := range prs {
1173+
if pr == nil {
1174+
continue
1175+
}
1176+
minimalPRs = append(minimalPRs, convertToMinimalPullRequest(pr))
11771177
}
11781178

1179-
return utils.NewToolResultText(string(r)), nil, nil
1179+
return MarshalledTextResult(minimalPRs), nil, nil
11801180
})
11811181
}
11821182

pkg/github/pullrequests_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,14 @@ func Test_GetPullRequest(t *testing.T) {
127127
// Parse the result and get the text content if no error
128128
textContent := getTextResult(t, result)
129129

130-
// Unmarshal and verify the result
131-
var returnedPR github.PullRequest
130+
// Unmarshal and verify the minimal result
131+
var returnedPR MinimalPullRequest
132132
err = json.Unmarshal([]byte(textContent.Text), &returnedPR)
133133
require.NoError(t, err)
134-
assert.Equal(t, *tc.expectedPR.Number, *returnedPR.Number)
135-
assert.Equal(t, *tc.expectedPR.Title, *returnedPR.Title)
136-
assert.Equal(t, *tc.expectedPR.State, *returnedPR.State)
137-
assert.Equal(t, *tc.expectedPR.HTMLURL, *returnedPR.HTMLURL)
134+
assert.Equal(t, tc.expectedPR.GetNumber(), returnedPR.Number)
135+
assert.Equal(t, tc.expectedPR.GetTitle(), returnedPR.Title)
136+
assert.Equal(t, tc.expectedPR.GetState(), returnedPR.State)
137+
assert.Equal(t, tc.expectedPR.GetHTMLURL(), returnedPR.HTMLURL)
138138
})
139139
}
140140
}
@@ -670,17 +670,17 @@ func Test_ListPullRequests(t *testing.T) {
670670
// Parse the result and get the text content if no error
671671
textContent := getTextResult(t, result)
672672

673-
// Unmarshal and verify the result
674-
var returnedPRs []*github.PullRequest
673+
// Unmarshal and verify the minimal result
674+
var returnedPRs []MinimalPullRequest
675675
err = json.Unmarshal([]byte(textContent.Text), &returnedPRs)
676676
require.NoError(t, err)
677677
assert.Len(t, returnedPRs, 2)
678-
assert.Equal(t, *tc.expectedPRs[0].Number, *returnedPRs[0].Number)
679-
assert.Equal(t, *tc.expectedPRs[0].Title, *returnedPRs[0].Title)
680-
assert.Equal(t, *tc.expectedPRs[0].State, *returnedPRs[0].State)
681-
assert.Equal(t, *tc.expectedPRs[1].Number, *returnedPRs[1].Number)
682-
assert.Equal(t, *tc.expectedPRs[1].Title, *returnedPRs[1].Title)
683-
assert.Equal(t, *tc.expectedPRs[1].State, *returnedPRs[1].State)
678+
assert.Equal(t, tc.expectedPRs[0].GetNumber(), returnedPRs[0].Number)
679+
assert.Equal(t, tc.expectedPRs[0].GetTitle(), returnedPRs[0].Title)
680+
assert.Equal(t, tc.expectedPRs[0].GetState(), returnedPRs[0].State)
681+
assert.Equal(t, tc.expectedPRs[1].GetNumber(), returnedPRs[1].Number)
682+
assert.Equal(t, tc.expectedPRs[1].GetTitle(), returnedPRs[1].Title)
683+
assert.Equal(t, tc.expectedPRs[1].GetState(), returnedPRs[1].State)
684684
})
685685
}
686686
}

0 commit comments

Comments
 (0)