MCPcopy Create free account
hub / github.com/cli/cli / MetadataSurvey

Function MetadataSurvey

pkg/cmd/pr/shared/survey.go:157–387  ·  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 return slices.Contains(state.Metadata, m)
160 }
161
162 allowReviewers := state.Type == PRMetadata
163
164 extraFieldsOptions := []string{}
165 if allowReviewers {
166 extraFieldsOptions = append(extraFieldsOptions, "Reviewers")
167 }
168 extraFieldsOptions = append(extraFieldsOptions, "Assignees", "Labels", "Projects", "Milestone")
169
170 selected, err := p.MultiSelect("What would you like to add?", nil, extraFieldsOptions)
171 if err != nil {
172 return err
173 }
174 for _, i := range selected {
175 state.Metadata = append(state.Metadata, extraFieldsOptions[i])
176 }
177
178 // Retrieve and process data for survey prompts based on the extra fields selected.
179 // When search-based selection is available, skip the expensive assignable-users
180 // and teams fetch since they are found dynamically via the search function.
181 // TODO ApiActorsSupported
182 useReviewerSearch := state.ApiActorsSupported && reviewerSearchFunc != nil
183 useAssigneeSearch := state.ApiActorsSupported && assigneeSearchFunc != nil
184 metadataInput := api.RepoMetadataInput{
185 Reviewers: isChosen("Reviewers") && !useReviewerSearch,
186 TeamReviewers: isChosen("Reviewers") && !useReviewerSearch,
187 Assignees: isChosen("Assignees") && !useAssigneeSearch,
188 ApiActorsSupported: state.ApiActorsSupported,
189 Labels: isChosen("Labels"),
190 ProjectsV1: isChosen("Projects") && projectsV1Support == gh.ProjectsV1Supported,
191 ProjectsV2: isChosen("Projects"),
192 Milestones: isChosen("Milestone"),
193 }
194 metadataResult, err := fetcher.RepoMetadataFetch(metadataInput)
195 if err != nil {
196 return fmt.Errorf("error fetching metadata options: %w", err)
197 }
198
199 var reviewers []string
200 if !useReviewerSearch {
201 for _, u := range metadataResult.AssignableUsers {
202 if u.Login() != metadataResult.CurrentLogin {
203 reviewers = append(reviewers, u.DisplayName())
204 }
205 }
206 for _, t := range metadataResult.Teams {
207 reviewers = append(reviewers, fmt.Sprintf("%s/%s", baseRepo.RepoOwner(), t.Slug))
208 }
209 }
210
211 // Populate the list of selectable assignees and their default selections.
212 // When search-based selection is available, skip building the static list.
213 var assignees []string
214 var assigneesDefault []string

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