mirror of
https://github.com/github/gh-stack.git
synced 2026-09-14 20:26:28 +08:00
a4485f5298
When a user runs `gh stack submit` and an existing PR is discovered for
a branch via `FindPRForBranch`, that PR may have auto-merge enabled.
Auto-merge is incompatible with stacked PRs because the PR would merge
on its own, breaking the stack's base chain.
Previously, the eligibility guard for auto-merge was only in the `link`
command (which blocks such PRs with an error). The `submit` command had
no such check, allowing users to add auto-merge-enabled PRs to a stack
by running `init` followed by `submit`.
This change adds auto-merge detection and automatic disabling in
`submit`'s `ensurePR` function. When an existing PR with auto-merge
enabled is discovered, the CLI disables auto-merge via the
`disablePullRequestAutoMerge` GraphQL mutation and warns the user.
If the disable call fails, submit continues with a warning (non-fatal).
The `link` command retains its stricter behavior of blocking auto-merge
PRs outright, since the user explicitly chose those PRs and can fix
them before retrying.
Changes:
internal/github/github.go:
- Add DisableAutoMerge() method using the
disablePullRequestAutoMerge GraphQL mutation
internal/github/client_interface.go:
- Add DisableAutoMerge(prID string) error to ClientOps interface
internal/github/mock_client.go:
- Add DisableAutoMergeFn field and mock implementation
cmd/submit.go:
- In ensurePR, after discovering an existing PR with auto-merge
enabled, call DisableAutoMerge before proceeding. Warns on
success ("Disabled auto-merge for PR #N (incompatible with
stacked PRs)") and on failure ("failed to disable auto-merge").
cmd/submit_test.go:
- Add TestSubmit_DisablesAutoMergeOnExistingPR: verifies auto-merge
is disabled and warning is shown
- Add TestSubmit_DisableAutoMergeFailure_ContinuesWithWarning:
verifies submit continues even if the disable call fails
- Add TestSubmit_NoAutoMerge_SkipsDisable: verifies DisableAutoMerge
is not called for PRs without auto-merge
22 lines
817 B
Go
22 lines
817 B
Go
package github
|
|
|
|
// ClientOps defines the interface for GitHub API operations.
|
|
// The concrete Client type satisfies this interface.
|
|
// Tests can substitute a MockClient.
|
|
type ClientOps interface {
|
|
FindPRForBranch(branch string) (*PullRequest, error)
|
|
FindPRByNumber(number int) (*PullRequest, error)
|
|
FindPRDetailsForBranch(branch string) (*PRDetails, error)
|
|
CreatePR(base, head, title, body string, draft bool) (*PullRequest, error)
|
|
UpdatePRBase(number int, base string) error
|
|
MarkPRReadyForReview(prID string) error
|
|
DisableAutoMerge(prID string) error
|
|
ListStacks() ([]RemoteStack, error)
|
|
CreateStack(prNumbers []int) (int, error)
|
|
UpdateStack(stackID string, prNumbers []int) error
|
|
DeleteStack(stackID string) error
|
|
}
|
|
|
|
// Compile-time check that Client satisfies ClientOps.
|
|
var _ ClientOps = (*Client)(nil)
|