Skip to content

Commit c1fd417

Browse files
fix(repos): restore commit pagination defaults
Normalize omitted and explicit zero pagination to page 1 and perPage 30 for get_commit and list_commits. Cover legacy and modern wire calls and direct handlers. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 79f584d commit c1fd417

3 files changed

Lines changed: 62 additions & 11 deletions

File tree

‎pkg/github/repositories.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func GetCommit(t translations.TranslationHelperFunc) inventory.ServerTool {
136136
result = attachRepoVisibilityIFCLabel(ctx, deps, client, input.Owner, input.Repo, result, ifc.LabelCommitContents)
137137
return result, minimalCommit, nil
138138
},
139-
normalizeTypedReadArgumentsPreservingZero(nil),
139+
normalizeTypedReadArguments(nil, false),
140140
)
141141
}
142142

@@ -307,7 +307,7 @@ func ListCommits(t translations.TranslationHelperFunc) inventory.ServerTool {
307307
}
308308
return result, minimalCommits, nil
309309
},
310-
normalizeTypedReadArgumentsPreservingZero(nil),
310+
normalizeTypedReadArguments(nil, false),
311311
)
312312
}
313313

‎pkg/github/typed_read_normalizers.go‎

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,6 @@ import (
1111
)
1212

1313
func normalizeTypedReadArguments(uppercaseFields []string, preserveZeroPage bool) inventory.InputNormalizer {
14-
return normalizeTypedArguments(uppercaseFields, preserveZeroPage, false)
15-
}
16-
17-
func normalizeTypedReadArgumentsPreservingZero(uppercaseFields []string) inventory.InputNormalizer {
18-
return normalizeTypedArguments(uppercaseFields, true, true)
19-
}
20-
21-
func normalizeTypedArguments(uppercaseFields []string, preserveZeroPage, preserveZeroPerPage bool) inventory.InputNormalizer {
2214
return func(raw json.RawMessage) (json.RawMessage, error) {
2315
var args map[string]json.RawMessage
2416
if err := json.Unmarshal(raw, &args); err != nil {
@@ -65,7 +57,7 @@ func normalizeTypedArguments(uppercaseFields []string, preserveZeroPage, preserv
6557
continue
6658
}
6759
}
68-
if field == "perPage" && !preserveZeroPerPage {
60+
if field == "perPage" {
6961
if parsed, ok := number.(float64); ok && parsed == 0 {
7062
delete(args, field)
7163
continue

‎pkg/github/typed_repository_commit_outputs_test.go‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,65 @@ import (
1515
"github.com/stretchr/testify/require"
1616
)
1717

18+
func TestTypedRepositoryCommitPaginationDefaults(t *testing.T) {
19+
for _, protocol := range []string{"2025-11-25", inventory.ProtocolVersionMultiRoundTrip} {
20+
t.Run(protocol, func(t *testing.T) {
21+
for _, tool := range []inventory.ServerTool{
22+
GetCommit(translations.NullTranslationHelper),
23+
ListCommits(translations.NullTranslationHelper),
24+
} {
25+
t.Run(tool.Tool.Name, func(t *testing.T) {
26+
for _, tc := range []struct {
27+
name string
28+
args map[string]any
29+
}{
30+
{"omitted", map[string]any{}},
31+
{"numeric_zero", map[string]any{"page": 0, "perPage": 0}},
32+
{"string_zero", map[string]any{"page": "0", "perPage": "0"}},
33+
} {
34+
t.Run(tc.name, func(t *testing.T) {
35+
calls := 0
36+
handler := func(w http.ResponseWriter, r *http.Request) {
37+
calls++
38+
assert.Equal(t, "1", r.URL.Query().Get("page"))
39+
assert.Equal(t, "30", r.URL.Query().Get("per_page"))
40+
var response any = &github.RepositoryCommit{SHA: github.Ptr("abc123")}
41+
if tool.Tool.Name == "list_commits" {
42+
response = []*github.RepositoryCommit{{SHA: github.Ptr("abc123")}}
43+
}
44+
mockResponse(t, http.StatusOK, response)(w, r)
45+
}
46+
deps := BaseDeps{Client: mustNewGHClient(t, MockHTTPClientWithHandlers(map[string]http.HandlerFunc{
47+
GetReposCommitsByOwnerByRepoByRef: handler,
48+
GetReposCommitsByOwnerByRepo: handler,
49+
}))}
50+
server := mcp.NewServer(&mcp.Implementation{Name: "commit-pagination-test", Version: "v1"}, nil)
51+
server.AddReceivingMiddleware(InjectDepsMiddleware(deps))
52+
tool.RegisterFunc(server, deps)
53+
session := connectCommentVisibilityClient(t, server, protocol)
54+
tc.args["owner"] = "owner"
55+
tc.args["repo"] = "repo"
56+
if tool.Tool.Name == "get_commit" {
57+
tc.args["sha"] = "abc123"
58+
}
59+
result, err := session.CallTool(context.Background(), &mcp.CallToolParams{
60+
Name: tool.Tool.Name, Arguments: tc.args,
61+
})
62+
require.NoError(t, err)
63+
require.False(t, result.IsError, "%+v", result)
64+
assert.Equal(t, 1, calls)
65+
request := createMCPRequest(tc.args)
66+
directResult, err := tool.Handler(deps)(ContextWithDeps(context.Background(), deps), &request)
67+
require.NoError(t, err)
68+
require.False(t, directResult.IsError, "%+v", directResult)
69+
assert.Equal(t, 2, calls)
70+
})
71+
}
72+
})
73+
}
74+
})
75+
}
76+
}
1877
func TestTypedRepositoryCommitOutputs(t *testing.T) {
1978
commit := &github.RepositoryCommit{
2079
SHA: github.Ptr("abc123"),

0 commit comments

Comments
 (0)