MCPcopy
hub / github.com/cli/cli / MetadataSurvey

Function MetadataSurvey

pkg/cmd/pr/shared/survey.go:157–392  ·  view source on GitHub ↗
(p Prompt, io *iostreams.IOStreams, baseRepo ghrepo.Interface, fetcher RepoMetadataFetcher, state *IssueMetadataState, projectsV1Support gh.ProjectsV1Support, reviewerSearchFunc func(string) prompter.MultiSelectSearchResult, assigneeSearchFunc func(string) prompter.MultiSelectSearchResult)

Source from the content-addressed store, hash-verified

155}
156
157func MetadataSurvey(p Prompt, io *iostreams.IOStreams, baseRepo ghrepo.Interface, fetcher RepoMetadataFetcher, state *IssueMetadataState, projectsV1Support gh.ProjectsV1Support, reviewerSearchFunc func(string) prompter.MultiSelectSearchResult, assigneeSearchFunc func(string) prompter.MultiSelectSearchResult) error {
158 isChosen := func(m string) bool {
159 for _, c := range state.Metadata {
160 if m == c {
161 return true
162 }
163 }
164 return false
165 }
166
167 allowReviewers := state.Type == PRMetadata
168
169 extraFieldsOptions := []string{}
170 if allowReviewers {
171 extraFieldsOptions = append(extraFieldsOptions, "Reviewers")
172 }
173 extraFieldsOptions = append(extraFieldsOptions, "Assignees", "Labels", "Projects", "Milestone")
174
175 selected, err := p.MultiSelect("What would you like to add?", nil, extraFieldsOptions)
176 if err != nil {
177 return err
178 }
179 for _, i := range selected {
180 state.Metadata = append(state.Metadata, extraFieldsOptions[i])
181 }
182
183 // Retrieve and process data for survey prompts based on the extra fields selected.
184 // When search-based selection is available, skip the expensive assignable-users
185 // and teams fetch since they are found dynamically via the search function.
186 // TODO ApiActorsSupported
187 useReviewerSearch := state.ApiActorsSupported && reviewerSearchFunc != nil
188 useAssigneeSearch := state.ApiActorsSupported && assigneeSearchFunc != nil
189 metadataInput := api.RepoMetadataInput{
190 Reviewers: isChosen("Reviewers") && !useReviewerSearch,
191 TeamReviewers: isChosen("Reviewers") && !useReviewerSearch,
192 Assignees: isChosen("Assignees") && !useAssigneeSearch,
193 ApiActorsSupported: state.ApiActorsSupported,
194 Labels: isChosen("Labels"),
195 ProjectsV1: isChosen("Projects") && projectsV1Support == gh.ProjectsV1Supported,
196 ProjectsV2: isChosen("Projects"),
197 Milestones: isChosen("Milestone"),
198 }
199 metadataResult, err := fetcher.RepoMetadataFetch(metadataInput)
200 if err != nil {
201 return fmt.Errorf("error fetching metadata options: %w", err)
202 }
203
204 var reviewers []string
205 if !useReviewerSearch {
206 for _, u := range metadataResult.AssignableUsers {
207 if u.Login() != metadataResult.CurrentLogin {
208 reviewers = append(reviewers, u.DisplayName())
209 }
210 }
211 for _, t := range metadataResult.Teams {
212 reviewers = append(reviewers, fmt.Sprintf("%s/%s", baseRepo.RepoOwner(), t.Slug))
213 }
214 }

Callers 4

createRunFunction · 0.92

Calls 9

ContainsMethod · 0.80
MultiSelectMethod · 0.65
RepoMetadataFetchMethod · 0.65
ErrorfMethod · 0.65
LoginMethod · 0.65
DisplayNameMethod · 0.65
RepoOwnerMethod · 0.65
MultiSelectWithSearchMethod · 0.65
SelectMethod · 0.65