Skip to content

Commit 439fd3a

Browse files
committed
fix(pullrequests): return get_files patches as raw text (#2242)
1 parent 8bbd902 commit 439fd3a

2 files changed

Lines changed: 76 additions & 13 deletions

File tree

pkg/github/pullrequests.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,45 @@ func GetPullRequestFiles(ctx context.Context, client *github.Client, owner, repo
368368

369369
minimalFiles := convertToMinimalPRFiles(files)
370370

371-
return MarshalledTextResult(minimalFiles), nil
371+
type fileMeta struct {
372+
Filename string `json:"filename"`
373+
Status string `json:"status,omitempty"`
374+
Additions int `json:"additions,omitempty"`
375+
Deletions int `json:"deletions,omitempty"`
376+
Changes int `json:"changes,omitempty"`
377+
PreviousFilename string `json:"previous_filename,omitempty"`
378+
}
379+
380+
metas := make([]fileMeta, len(minimalFiles))
381+
for i, f := range minimalFiles {
382+
metas[i] = fileMeta{
383+
Filename: f.Filename,
384+
Status: f.Status,
385+
Additions: f.Additions,
386+
Deletions: f.Deletions,
387+
Changes: f.Changes,
388+
PreviousFilename: f.PreviousFilename,
389+
}
390+
}
391+
392+
metaJSON, err := json.Marshal(metas)
393+
if err != nil {
394+
return nil, fmt.Errorf("failed to marshal file metadata: %w", err)
395+
}
396+
397+
contents := []mcp.Content{
398+
&mcp.TextContent{Text: string(metaJSON)},
399+
}
400+
401+
for _, f := range minimalFiles {
402+
if f.Patch != "" {
403+
contents = append(contents, &mcp.TextContent{
404+
Text: fmt.Sprintf("filename: %s\n%s", f.Filename, f.Patch),
405+
})
406+
}
407+
}
408+
409+
return &mcp.CallToolResult{Content: contents}, nil
372410
}
373411

374412
// GraphQL types for review threads query

pkg/github/pullrequests_test.go

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,20 +1242,45 @@ func Test_GetPullRequestFiles(t *testing.T) {
12421242
require.NoError(t, err)
12431243
require.False(t, result.IsError)
12441244

1245-
// Parse the result and get the text content if no error
1246-
textContent := getTextResult(t, result)
1245+
// Verify multi-content response
1246+
assert.NotNil(t, result)
1247+
require.Len(t, result.Content, 3) // 1 metadata + 2 patches
12471248

1248-
// Unmarshal and verify the result
1249-
var returnedFiles []MinimalPRFile
1250-
err = json.Unmarshal([]byte(textContent.Text), &returnedFiles)
1249+
// Verify Content[0] is metadata JSON
1250+
metaContent, ok := result.Content[0].(*mcp.TextContent)
1251+
require.True(t, ok, "expected first content to be TextContent")
1252+
1253+
var returnedMetas []map[string]any
1254+
err = json.Unmarshal([]byte(metaContent.Text), &returnedMetas)
12511255
require.NoError(t, err)
1252-
assert.Len(t, returnedFiles, len(tc.expectedFiles))
1253-
for i, file := range returnedFiles {
1254-
assert.Equal(t, tc.expectedFiles[i].GetFilename(), file.Filename)
1255-
assert.Equal(t, tc.expectedFiles[i].GetStatus(), file.Status)
1256-
assert.Equal(t, tc.expectedFiles[i].GetAdditions(), file.Additions)
1257-
assert.Equal(t, tc.expectedFiles[i].GetDeletions(), file.Deletions)
1258-
}
1256+
assert.Len(t, returnedMetas, len(tc.expectedFiles))
1257+
1258+
// Verify metadata content for first file
1259+
assert.Equal(t, "file1.go", returnedMetas[0]["filename"])
1260+
assert.Equal(t, "modified", returnedMetas[0]["status"])
1261+
assert.Equal(t, float64(10), returnedMetas[0]["additions"])
1262+
assert.Equal(t, float64(5), returnedMetas[0]["deletions"])
1263+
assert.Equal(t, float64(15), returnedMetas[0]["changes"])
1264+
assert.Nil(t, returnedMetas[0]["patch"], "metadata should not contain patch field")
1265+
1266+
// Verify metadata content for second file
1267+
assert.Equal(t, "file2.go", returnedMetas[1]["filename"])
1268+
assert.Equal(t, "added", returnedMetas[1]["status"])
1269+
assert.Equal(t, float64(20), returnedMetas[1]["additions"])
1270+
assert.Equal(t, float64(20), returnedMetas[1]["changes"])
1271+
assert.Nil(t, returnedMetas[1]["patch"], "metadata should not contain patch field")
1272+
1273+
// Verify Content[1] is patch for file1.go
1274+
patch1Content, ok := result.Content[1].(*mcp.TextContent)
1275+
require.True(t, ok, "expected second content to be TextContent")
1276+
assert.Contains(t, patch1Content.Text, "filename: file1.go")
1277+
assert.Contains(t, patch1Content.Text, "@@ -1,5 +1,10 @@")
1278+
1279+
// Verify Content[2] is patch for file2.go
1280+
patch2Content, ok := result.Content[2].(*mcp.TextContent)
1281+
require.True(t, ok, "expected third content to be TextContent")
1282+
assert.Contains(t, patch2Content.Text, "filename: file2.go")
1283+
assert.Contains(t, patch2Content.Text, "@@ -0,0 +1,20 @@")
12591284
})
12601285
}
12611286
}

0 commit comments

Comments
 (0)