diff --git a/api/queries_repo.go b/api/queries_repo.go index 6eb7088fc..c8ba31348 100644 --- a/api/queries_repo.go +++ b/api/queries_repo.go @@ -623,6 +623,7 @@ func RepoResolveMetadataIDs(client *Client, repo ghrepo.Interface, input RepoRes } query := &bytes.Buffer{} + fmt.Fprint(query, "{\n") for i, u := range users { fmt.Fprintf(query, "u%03d: user(login:%q){id,login}\n", i, u) } @@ -640,6 +641,7 @@ func RepoResolveMetadataIDs(client *Client, repo ghrepo.Interface, input RepoRes } fmt.Fprint(query, "}\n") } + fmt.Fprint(query, "}\n") response := make(map[string]json.RawMessage) err = client.GraphQL(query.String(), nil, &response) diff --git a/api/queries_repo_test.go b/api/queries_repo_test.go index 94be4001c..a3a6876a8 100644 --- a/api/queries_repo_test.go +++ b/api/queries_repo_test.go @@ -188,7 +188,8 @@ func Test_RepoResolveMetadataIDs(t *testing.T) { Labels: []string{"bug", "help wanted"}, } - expectedQuery := `u000: user(login:"monalisa"){id,login} + expectedQuery := `{ +u000: user(login:"monalisa"){id,login} u001: user(login:"hubot"){id,login} u002: user(login:"octocat"){id,login} repository(owner:"OWNER",name:"REPO"){ @@ -199,6 +200,7 @@ organization(login:"OWNER"){ t000: team(slug:"core"){id,slug} t001: team(slug:"robots"){id,slug} } +} ` responseJSON := ` { "data": { diff --git a/command/issue.go b/command/issue.go index 902481c7e..19b4072df 100644 --- a/command/issue.go +++ b/command/issue.go @@ -471,25 +471,9 @@ func issueCreate(cmd *cobra.Command, args []string) error { "body": body, } - if tb.HasMetadata() { - if tb.MetadataResult == nil { - resolveInput := api.RepoResolveInput{ - Assignees: tb.Assignees, - Labels: tb.Labels, - Projects: tb.Projects, - Milestones: tb.Milestones, - } - - tb.MetadataResult, err = api.RepoResolveMetadataIDs(apiClient, baseRepo, resolveInput) - if err != nil { - return err - } - } - - err = addMetadataToIssueParams(params, tb.MetadataResult, tb.Assignees, tb.Labels, tb.Projects, tb.Milestones) - if err != nil { - return err - } + err = addMetadataToIssueParams(apiClient, baseRepo, params, &tb) + if err != nil { + return err } newIssue, err := api.IssueCreate(apiClient, repo, params) @@ -505,33 +489,79 @@ func issueCreate(cmd *cobra.Command, args []string) error { return nil } -func addMetadataToIssueParams(params map[string]interface{}, metadata *api.RepoMetadataResult, assignees, labelNames, projectNames, milestoneTitles []string) error { - assigneeIDs, err := metadata.MembersToIDs(assignees) +func addMetadataToIssueParams(client *api.Client, baseRepo ghrepo.Interface, params map[string]interface{}, tb *issueMetadataState) error { + if !tb.HasMetadata() { + return nil + } + + if tb.MetadataResult == nil { + resolveInput := api.RepoResolveInput{ + Reviewers: tb.Reviewers, + Assignees: tb.Assignees, + Labels: tb.Labels, + Projects: tb.Projects, + Milestones: tb.Milestones, + } + + var err error + tb.MetadataResult, err = api.RepoResolveMetadataIDs(client, baseRepo, resolveInput) + if err != nil { + return err + } + } + + assigneeIDs, err := tb.MetadataResult.MembersToIDs(tb.Assignees) if err != nil { return fmt.Errorf("could not assign user: %w", err) } params["assigneeIds"] = assigneeIDs - labelIDs, err := metadata.LabelsToIDs(labelNames) + labelIDs, err := tb.MetadataResult.LabelsToIDs(tb.Labels) if err != nil { return fmt.Errorf("could not add label: %w", err) } params["labelIds"] = labelIDs - projectIDs, err := metadata.ProjectsToIDs(projectNames) + projectIDs, err := tb.MetadataResult.ProjectsToIDs(tb.Projects) if err != nil { return fmt.Errorf("could not add to project: %w", err) } params["projectIds"] = projectIDs - if len(milestoneTitles) > 0 { - milestoneID, err := metadata.MilestoneToID(milestoneTitles[0]) + if len(tb.Milestones) > 0 { + milestoneID, err := tb.MetadataResult.MilestoneToID(tb.Milestones[0]) if err != nil { - return fmt.Errorf("could not add to milestone '%s': %w", milestoneTitles[0], err) + return fmt.Errorf("could not add to milestone '%s': %w", tb.Milestones[0], err) } params["milestoneId"] = milestoneID } + if len(tb.Reviewers) == 0 { + return nil + } + + var userReviewers []string + var teamReviewers []string + for _, r := range tb.Reviewers { + if strings.ContainsRune(r, '/') { + teamReviewers = append(teamReviewers, r) + } else { + userReviewers = append(teamReviewers, r) + } + } + + userReviewerIDs, err := tb.MetadataResult.MembersToIDs(userReviewers) + if err != nil { + return fmt.Errorf("could not request reviewer: %w", err) + } + params["userReviewerIds"] = userReviewerIDs + + teamReviewerIDs, err := tb.MetadataResult.TeamsToIDs(teamReviewers) + if err != nil { + return fmt.Errorf("could not request reviewer: %w", err) + } + params["teamReviewerIds"] = teamReviewerIDs + return nil } diff --git a/command/pr_create.go b/command/pr_create.go index 9e096c0eb..96dc08791 100644 --- a/command/pr_create.go +++ b/command/pr_create.go @@ -325,48 +325,9 @@ func prCreate(cmd *cobra.Command, _ []string) error { "headRefName": headBranchLabel, } - if tb.HasMetadata() { - if tb.MetadataResult == nil { - resolveInput := api.RepoResolveInput{ - Reviewers: tb.Reviewers, - Assignees: tb.Assignees, - Labels: tb.Labels, - Projects: tb.Projects, - Milestones: tb.Milestones, - } - - tb.MetadataResult, err = api.RepoResolveMetadataIDs(client, baseRepo, resolveInput) - if err != nil { - return err - } - } - - err = addMetadataToIssueParams(params, tb.MetadataResult, tb.Assignees, tb.Labels, tb.Projects, tb.Milestones) - if err != nil { - return err - } - - var userReviewers []string - var teamReviewers []string - for _, r := range tb.Reviewers { - if strings.ContainsRune(r, '/') { - teamReviewers = append(teamReviewers, r) - } else { - userReviewers = append(teamReviewers, r) - } - } - - userReviewerIDs, err := tb.MetadataResult.MembersToIDs(userReviewers) - if err != nil { - return fmt.Errorf("could not request reviewer: %w", err) - } - params["userReviewerIds"] = userReviewerIDs - - teamReviewerIDs, err := tb.MetadataResult.TeamsToIDs(teamReviewers) - if err != nil { - return fmt.Errorf("could not request reviewer: %w", err) - } - params["teamReviewerIds"] = teamReviewerIDs + err = addMetadataToIssueParams(client, baseRepo, params, &tb) + if err != nil { + return err } pr, err := api.CreatePullRequest(client, baseRepo, params)