122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
package shared
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
"github.com/cli/cli/v2/api"
|
|
"github.com/cli/cli/v2/internal/ghinstance"
|
|
"github.com/cli/cli/v2/internal/ghrepo"
|
|
graphql "github.com/cli/shurcooL-graphql"
|
|
"github.com/shurcooL/githubv4"
|
|
)
|
|
|
|
func UpdateIssue(httpClient *http.Client, repo ghrepo.Interface, id string, isPR bool, options Editable) error {
|
|
title := ghString(options.TitleValue())
|
|
body := ghString(options.BodyValue())
|
|
|
|
apiClient := api.NewClientFromHTTP(httpClient)
|
|
assigneeIds, err := options.AssigneeIds(apiClient, repo)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
labelIds, err := options.LabelIds()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
projectIds, err := options.ProjectIds()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
milestoneId, err := options.MilestoneId()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if isPR {
|
|
params := githubv4.UpdatePullRequestInput{
|
|
PullRequestID: id,
|
|
Title: title,
|
|
Body: body,
|
|
AssigneeIDs: ghIds(assigneeIds),
|
|
LabelIDs: ghIds(labelIds),
|
|
ProjectIDs: ghIds(projectIds),
|
|
MilestoneID: ghId(milestoneId),
|
|
}
|
|
if options.Base.Edited {
|
|
params.BaseRefName = ghString(&options.Base.Value)
|
|
}
|
|
return updatePullRequest(httpClient, repo, params)
|
|
}
|
|
|
|
return updateIssue(httpClient, repo, githubv4.UpdateIssueInput{
|
|
ID: id,
|
|
Title: title,
|
|
Body: body,
|
|
AssigneeIDs: ghIds(assigneeIds),
|
|
LabelIDs: ghIds(labelIds),
|
|
ProjectIDs: ghIds(projectIds),
|
|
MilestoneID: ghId(milestoneId),
|
|
})
|
|
}
|
|
|
|
func updateIssue(httpClient *http.Client, repo ghrepo.Interface, params githubv4.UpdateIssueInput) error {
|
|
var mutation struct {
|
|
UpdateIssue struct {
|
|
Issue struct {
|
|
ID string
|
|
}
|
|
} `graphql:"updateIssue(input: $input)"`
|
|
}
|
|
variables := map[string]interface{}{"input": params}
|
|
gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), httpClient)
|
|
return gql.MutateNamed(context.Background(), "IssueUpdate", &mutation, variables)
|
|
}
|
|
|
|
func updatePullRequest(httpClient *http.Client, repo ghrepo.Interface, params githubv4.UpdatePullRequestInput) error {
|
|
var mutation struct {
|
|
UpdatePullRequest struct {
|
|
PullRequest struct {
|
|
ID string
|
|
}
|
|
} `graphql:"updatePullRequest(input: $input)"`
|
|
}
|
|
variables := map[string]interface{}{"input": params}
|
|
gql := graphql.NewClient(ghinstance.GraphQLEndpoint(repo.RepoHost()), httpClient)
|
|
err := gql.MutateNamed(context.Background(), "PullRequestUpdate", &mutation, variables)
|
|
return err
|
|
}
|
|
|
|
func ghIds(s *[]string) *[]githubv4.ID {
|
|
if s == nil {
|
|
return nil
|
|
}
|
|
ids := make([]githubv4.ID, len(*s))
|
|
for i, v := range *s {
|
|
ids[i] = v
|
|
}
|
|
return &ids
|
|
}
|
|
|
|
func ghId(s *string) *githubv4.ID {
|
|
if s == nil {
|
|
return nil
|
|
}
|
|
if *s == "" {
|
|
r := githubv4.ID(nil)
|
|
return &r
|
|
}
|
|
r := githubv4.ID(*s)
|
|
return &r
|
|
}
|
|
|
|
func ghString(s *string) *githubv4.String {
|
|
if s == nil {
|
|
return nil
|
|
}
|
|
r := githubv4.String(*s)
|
|
return &r
|
|
}
|