package gitea import ( "context" "encoding/json" "fmt" "net/url" ) type PullRequest struct { Number int `json:"number"` Title string `json:"title"` Body string `json:"body"` HTMLURL string `json:"html_url"` State string `json:"state"` Draft bool `json:"draft"` Head struct { Ref string `json:"ref"` } `json:"head"` Base struct { Ref string `json:"ref"` } `json:"base"` } type CreatePullRequestArgs struct { Title string `json:"title"` Body string `json:"body"` Head string `json:"head"` Base string `json:"base"` Draft bool `json:"draft"` } func (c *Client) CreatePullRequest(ctx context.Context, owner, repo string, args CreatePullRequestArgs) (*PullRequest, error) { p := fmt.Sprintf("/api/v1/repos/%s/%s/pulls", owner, repo) payload, err := json.Marshal(args) if err != nil { return nil, err } body, status, err := c.PostJSON(ctx, p, payload) if err != nil { return nil, err } if err := MapStatus(status, body); err != nil { return nil, err } var pr PullRequest if err := json.Unmarshal(body, &pr); err != nil { return nil, err } return &pr, nil } func (c *Client) GetPullRequest(ctx context.Context, owner, repo string, index int) (*PullRequest, error) { p := fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d", owner, repo, index) body, status, err := c.GetJSON(ctx, p) if err != nil { return nil, err } if err := MapStatus(status, body); err != nil { return nil, err } var pr PullRequest if err := json.Unmarshal(body, &pr); err != nil { return nil, err } return &pr, nil } type PullRequestFile struct { Filename string `json:"filename"` Status string `json:"status"` // added | modified | deleted | renamed Additions int `json:"additions"` Deletions int `json:"deletions"` } func (c *Client) GetPullRequestFiles(ctx context.Context, owner, repo string, index int) ([]PullRequestFile, error) { p := fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/files", owner, repo, index) body, status, err := c.GetJSON(ctx, p) if err != nil { return nil, err } if err := MapStatus(status, body); err != nil { return nil, err } var files []PullRequestFile if err := json.Unmarshal(body, &files); err != nil { return nil, err } return files, nil } // GetPullRequestDiff returns the raw unified diff. The endpoint serves text/plain, not JSON, // so we use doRaw to bypass the json Accept header expectation. func (c *Client) GetPullRequestDiff(ctx context.Context, owner, repo string, index int) ([]byte, error) { p := fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d.diff", owner, repo, index) resp, err := c.doRaw(ctx, "GET", p, nil) if err != nil { return nil, err } if err := MapStatus(resp.Status, resp.Body); err != nil { return nil, err } return resp.Body, nil } func (c *Client) ListPullRequests(ctx context.Context, owner, repo, state, head string, page, limit int) ([]PullRequest, error) { if page < 1 { page = 1 } if limit < 1 { limit = 30 } p := fmt.Sprintf("/api/v1/repos/%s/%s/pulls?state=%s&page=%d&limit=%d", owner, repo, url.QueryEscape(state), page, limit) if head != "" { p += "&head=" + url.QueryEscape(head) } body, status, err := c.GetJSON(ctx, p) if err != nil { return nil, err } if err := MapStatus(status, body); err != nil { return nil, err } var prs []PullRequest if err := json.Unmarshal(body, &prs); err != nil { return nil, err } return prs, nil }