bbde7ee110
## Summary
`list_issues` could not be scoped to a milestone, and the milestone was
absent from its list output. To find which milestone an issue belongs to,
callers had to read every issue individually — expensive on repositories
with hundreds of issues.
## Changes
- `list_issues`: add `milestones` (name or ID filter) and `type`
(`issues`/`pulls`) parameters, wiring the SDK's
`ListIssueOption.Milestones` and `ListIssueOption.Type`.
- Include the `milestone` `{id, title}` field in `slimIssues` (the list
output), consistent with the existing `slimIssue` (single-issue) output.
- Tests: extend `Test_listRepoIssuesFn_filters` to assert the `milestones`
and `type` query params, and add `Test_listRepoIssuesFn_includesMilestone`
for the milestone field in list output.
This is a natural continuation of #164 (which added `labels`/`since`/`before`
to `list_issues`); `milestones` and `type` are supported by the SDK but were
not yet wired through.
## Testing
- `go build ./...` — ok
- `go vet ./operation/issue/` — ok
- `go test ./...` — all pass
- `make fmt` — clean
---
This PR was written with the help of Claude Opus 4.8
Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/199
Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: jermey <186737+jermey@noreply.gitea.com>
Co-committed-by: jermey <186737+jermey@noreply.gitea.com>
96 lines
1.9 KiB
Go
96 lines
1.9 KiB
Go
package issue
|
|
|
|
import (
|
|
"gitea.com/gitea/gitea-mcp/pkg/slim"
|
|
|
|
gitea_sdk "gitea.dev/sdk"
|
|
)
|
|
|
|
func slimIssue(i *gitea_sdk.Issue) map[string]any {
|
|
if i == nil {
|
|
return nil
|
|
}
|
|
m := map[string]any{
|
|
"number": i.Index,
|
|
"title": i.Title,
|
|
"body": i.Body,
|
|
"state": i.State,
|
|
"html_url": i.HTMLURL,
|
|
"user": slim.UserLogin(i.Poster),
|
|
"labels": slim.LabelNames(i.Labels),
|
|
"comments": i.Comments,
|
|
"created_at": i.Created,
|
|
"updated_at": i.Updated,
|
|
"closed_at": i.Closed,
|
|
}
|
|
if len(i.Assignees) > 0 {
|
|
m["assignees"] = slim.UserLogins(i.Assignees)
|
|
}
|
|
if i.Milestone != nil {
|
|
m["milestone"] = map[string]any{
|
|
"id": i.Milestone.ID,
|
|
"title": i.Milestone.Title,
|
|
}
|
|
}
|
|
if i.Ref != "" {
|
|
m["ref"] = i.Ref
|
|
}
|
|
if i.Deadline != nil {
|
|
m["deadline"] = i.Deadline
|
|
}
|
|
if i.PullRequest != nil {
|
|
m["is_pull"] = true
|
|
}
|
|
return m
|
|
}
|
|
|
|
func slimIssues(issues []*gitea_sdk.Issue) []map[string]any {
|
|
out := make([]map[string]any, 0, len(issues))
|
|
for _, i := range issues {
|
|
if i == nil {
|
|
continue
|
|
}
|
|
m := map[string]any{
|
|
"number": i.Index,
|
|
"title": i.Title,
|
|
"state": i.State,
|
|
"html_url": i.HTMLURL,
|
|
"user": slim.UserLogin(i.Poster),
|
|
"comments": i.Comments,
|
|
"created_at": i.Created,
|
|
"updated_at": i.Updated,
|
|
}
|
|
if len(i.Labels) > 0 {
|
|
m["labels"] = slim.LabelNames(i.Labels)
|
|
}
|
|
if i.Milestone != nil {
|
|
m["milestone"] = map[string]any{
|
|
"id": i.Milestone.ID,
|
|
"title": i.Milestone.Title,
|
|
}
|
|
}
|
|
if i.Ref != "" {
|
|
m["ref"] = i.Ref
|
|
}
|
|
if i.Deadline != nil {
|
|
m["deadline"] = i.Deadline
|
|
}
|
|
out = append(out, m)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func slimComment(c *gitea_sdk.Comment) map[string]any {
|
|
if c == nil {
|
|
return nil
|
|
}
|
|
return map[string]any{
|
|
"id": c.ID,
|
|
"body": c.Body,
|
|
"user": slim.UserLogin(c.Poster),
|
|
"html_url": c.HTMLURL,
|
|
"created_at": c.Created,
|
|
"updated_at": c.Updated,
|
|
}
|
|
}
|