-
Notifications
You must be signed in to change notification settings - Fork 7.4k
Feature detect v1 projects on interactive pr create
#10915
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
pr create
As far as I can see, when there is project metadata, the preview option will never be shown in the interactive multiselect, so I don't believe this change has any functional difference. However, I did use the opportunity to drive out tests for generateCompareURL
c237606 to
1a5b7ca
Compare
andyfeller
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me! ✨ Nothing blocking
| index, err := IndexFor(options, answer) | ||
| if err != nil { | ||
| return nil, err | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thought: this will return an error if any answer is not an available option. IndexFor returns -1 for the int index of the answer, which is necessary being a literal with anything 0 or more being a valid index while this has []int.
makes sense
| httpmock.StringResponse(` | ||
| { "data": { "repository": { "projects": { | ||
| "nodes": [ | ||
| { "name": "ProjectV1Title", "id": "PROJECTV1ID", "resourcePath": "/OWNER/REPO/projects/1" } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
praise: thanks for the distinct v1 project info vs v2 project
| ProjectTitles: []string{"ProjectTitle"}, | ||
| }, | ||
| projectsV1Support: gh.ProjectsV1Unsupported, | ||
| want: "https://github.com/OWNER/REPO/compare/main...feature?body=&expand=1&projects=OWNER%2FREPO%2F3", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: I wish there was a different way to craft this type of string as the URL encoding requires a bit of care from the review's part map the 3 in %2F3 as the resourcePath above
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would it help if I provided the unescaped URL and passed it into a function that did the escaping?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
honestly, I struggled with a good suggestion that didn't feel over engineered, so I don't know if there is a simple solution but wish there was. 🤷
| // Register a handler to check for projects V2 just to avoid the registry panicking, even | ||
| // though we return a 500 error. This is because the project lookup is done in parallel | ||
| // so the previous error doesn't early exit. | ||
| reg.Register( | ||
| httpmock.GraphQL(`projectsV2`), | ||
| // Simulate a GraphQL error to early exit the test. | ||
| httpmock.StatusStringResponse(500, ""), | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
praise: thank you for the comment explaining this 🙇
| if p == "Title (required)" { | ||
| return "Test Title", nil | ||
| } else { | ||
| return "", prompter.NoSuchPromptErr(p) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: I know it isn't functionally any different but 🤏 slimmer
| if p == "Title (required)" { | |
| return "Test Title", nil | |
| } else { | |
| return "", prompter.NoSuchPromptErr(p) | |
| } | |
| if p == "Title (required)" { | |
| return "Test Title", nil | |
| } | |
| return "", prompter.NoSuchPromptErr(p) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks. Think I just copy and pasted this from somewhere.
| if p == "Body" { | ||
| return "Test Body", nil | ||
| } else { | ||
| return "", prompter.NoSuchPromptErr(p) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if p == "Body" { | |
| return "Test Body", nil | |
| } else { | |
| return "", prompter.NoSuchPromptErr(p) | |
| } | |
| if p == "Body" { | |
| return "Test Body", nil | |
| } | |
| return "", prompter.NoSuchPromptErr(p) |
| // Ignore the error because we have no way to really stub it without | ||
| // fully stubbing a GQL error structure in the request body. | ||
| _ = createRun(&opts) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: what's your opinion on when to combine lines like this with the initialization on line 2323 versus separate?
genuine curiosity as they're functionally the same, just unsure if intentional.
cli/pkg/cmd/pr/create/create_test.go
Lines 2164 to 2196 in 1a5b7ca
| _ = createRun(&CreateOptions{ | |
| Detector: &fd.EnabledDetectorMock{}, | |
| IO: ios, | |
| HttpClient: func() (*http.Client, error) { | |
| return &http.Client{Transport: reg}, nil | |
| }, | |
| GitClient: &git.Client{ | |
| GhPath: "some/path/gh", | |
| GitPath: "some/path/git", | |
| }, | |
| Remotes: func() (context.Remotes, error) { | |
| return context.Remotes{ | |
| { | |
| Remote: &git.Remote{ | |
| Name: "upstream", | |
| Resolved: "base", | |
| }, | |
| Repo: ghrepo.New("OWNER", "REPO"), | |
| }, | |
| }, nil | |
| }, | |
| Finder: shared.NewMockFinder("feature", nil, nil), | |
| HeadBranch: "feature", | |
| TitleProvided: true, | |
| BodyProvided: true, | |
| Title: "Test Title", | |
| Body: "Test Body", | |
| // Required to force a lookup of projects | |
| Projects: []string{"Project"}, | |
| }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just copy and pasted from different locations. Happy to combine into one form if you prefer one or the other.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for confirming; I don't really care but making sure to ask curious question in case there was something.
| if p == "Title (required)" { | ||
| return "Test Title", nil | ||
| } else { | ||
| return "", prompter.NoSuchPromptErr(p) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if p == "Title (required)" { | |
| return "Test Title", nil | |
| } else { | |
| return "", prompter.NoSuchPromptErr(p) | |
| } | |
| if p == "Title (required)" { | |
| return "Test Title", nil | |
| } | |
| return "", prompter.NoSuchPromptErr(p) |
| if p == "Body" { | ||
| return "Test Body", nil | ||
| } else { | ||
| return "", prompter.NoSuchPromptErr(p) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if p == "Body" { | |
| return "Test Body", nil | |
| } else { | |
| return "", prompter.NoSuchPromptErr(p) | |
| } | |
| if p == "Body" { | |
| return "Test Body", nil | |
| } | |
| return "", prompter.NoSuchPromptErr(p) |
| }) | ||
|
|
||
| // Verify that our request contained projectCards | ||
| // Verify that our request did not contain projectCards |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
praise: thank you for catching and fixing this
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [cli/cli](https://github.com/cli/cli) | minor | `v2.72.0` -> `v2.73.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>cli/cli (cli/cli)</summary> ### [`v2.73.0`](https://github.com/cli/cli/releases/tag/v2.73.0): GitHub CLI 2.73.0 [Compare Source](cli/cli@v2.72.0...v2.73.0) ####Copilot Coding Agent Support You can now assign issues to GitHub Copilot directly from `gh`, just as you would assign them to a teammate. Use `gh issue edit <number> --add-assignee @​copilot` to assign the GitHub Copilot coding agent, and Copilot will work in the background to understand the issue, propose a solution, and open a pull request when it's ready for your review. If you run `gh issue edit` interactively, `Copilot (AI)` will be displayed as a potential assignee. This feature is available for GitHub Copilot Pro+ and Copilot Enterprise subscribers. For more details, refer to [the full changelog post for Copilot coding agent](https://github.blog/changelog/2025-05-19-github-copilot-coding-agent-in-public-preview/). #### What's Changed ##### ✨ Features - Copilot is assignable to issues and pull requests with `issue edit` and `pr edit` by [@​BagToad](https://github.com/BagToad) in cli/cli#10992 - `gh issue edit`: actors are assignable to issues by [@​BagToad](https://github.com/BagToad) in cli/cli#10960 - `gh pr edit`: Assign actors to pull requests by [@​BagToad](https://github.com/BagToad) in cli/cli#10984 - `issue edit`, `pr edit`: handle display names in interactive assignee editing by [@​BagToad](https://github.com/BagToad) in cli/cli#10990 - `issue edit`, `pr edit`: Support special non-interactive (flags) assignee name `@copilot` by [@​BagToad](https://github.com/BagToad) in cli/cli#10991 - \[gh issue/pr comment] Add support for last comment delete for issues and MRs by [@​sinansonmez](https://github.com/sinansonmez) in cli/cli#10596 - \[gh issue view] Expose `closedByPullRequestsReferences` JSON field by [@​iamazeem](https://github.com/iamazeem) in cli/cli#10941 - Accessible prompter always displays selection defaults in a format readable by a screen reader by [@​BagToad](https://github.com/BagToad) in cli/cli#10937 ##### 🐛 Fixes - Fix `StatusJSONResponse` usage by [@​babakks](https://github.com/babakks) in cli/cli#10810 - Fix panic on `gh pr view 0` by [@​nopcoder](https://github.com/nopcoder) in cli/cli#10729 - Fix flakey test for accessible prompter by [@​BagToad](https://github.com/BagToad) in cli/cli#10918 - Fix accessible prompter flaky tests by [@​babakks](https://github.com/babakks) in cli/cli#10977 - Handle missing archive URLs on release download by [@​williammartin](https://github.com/williammartin) in cli/cli#10947 - Fix bug when removing all MR reviewers by [@​babakks](https://github.com/babakks) in cli/cli#10975 ##### 📚 Docs & Chores - Feature detect v1 projects on pr view by [@​williammartin](https://github.com/williammartin) in cli/cli#10821 - Feature detect v1 projects on non-interactive pr create by [@​williammartin](https://github.com/williammartin) in cli/cli#10909 - Feature detect v1 projects on web mode pr create by [@​williammartin](https://github.com/williammartin) in cli/cli#10911 - Feature detect v1 projects on interactive `pr create` by [@​williammartin](https://github.com/williammartin) in cli/cli#10915 - Feature detect v1 projects on pr edit by [@​williammartin](https://github.com/williammartin) in cli/cli#10942 - Move predicate type filtering in `gh attestation verify` by [@​malancas](https://github.com/malancas) in cli/cli#10670 - Improve assertion for disabled echo mode by [@​babakks](https://github.com/babakks) in cli/cli#10927 #####
Dependencies - chore(deps): bump actions/attest-build-provenance from 2.2.2 to 2.3.0 by [@​dependabot](https://github.com/dependabot) in cli/cli#10886 - chore(deps): bump github.com/cpuguy83/go-md2man/v2 from 2.0.6 to 2.0.7 by [@​dependabot](https://github.com/dependabot) in cli/cli#10869 #### What's Changed #### New Contributors - [@​sinansonmez](https://github.com/sinansonmez) made their first contribution in cli/cli#10596 - [@​nopcoder](https://github.com/nopcoder) made their first contribution in cli/cli#10729 **Full Changelog**: cli/cli@v2.72.0...v2.73.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xNS4wIiwidXBkYXRlZEluVmVyIjoiNDAuMTUuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Description
Relates to: #10714
Builds on: #10911
This PR tackles projectv1 deprecation on pr creation for the interactive mode.
Reviewer Notes
DO NOT MERGE into base branch, wait for base branch to be merged into trunk.
You can verify the presence or absence of
projectsby running:And proceeding through the interactive prompts to add a project, and submit a PR with a project added to the metadata.
This exists for queries
RepositoryProjectListandOrganizationProjectList