One-PR stack: submit reports success, but merge says the stack was not submitted
- Lingua principale
- Go
- Stelle
- 1.5k
- Fork
- 70
- Merge medio
- 1g 8h
- PR unite (30g)
- 7
Descrizione
## Summary
A local stack can contain one branch and one pull request. `gh stack submit` reports success for this stack:
```text
✓ Pushed and synced 1 branches
```
However, GitHub does not create a remote stack object. A remote stack requires at least two pull requests.
`gh stack merge` then rejects the local stack:
```text
✗ this stack has not been submitted to GitHub yet; run `gh stack submit` first
```
A second `gh stack submit` does not fix the problem. It reports success again.
## Reproduction
1. Create a branch from the trunk branch.
2. Commit a change on the new branch.
3. Initialize a local stack that contains only the new branch.
4. Run `gh stack submit` and create the pull request.
5. Run `gh stack submit` again.
6. Run `gh stack merge --squash`.
Example output:
```text
$ gh stack submit
Checking stack state...
Pushing to origin...
PR #30 for close-clinkr-cli-entry-point is up to date
✓ Pushed and synced 1 branches
$ gh stack sync
✓ Fetched latest main from origin
✓ Trunk main is already up to date
Pushing 1 branch to origin...
✓ Pushed 1 branches
Syncing PRs ...
✓ PR #30 (close-clinkr-cli-entry-point) — Open
✓ Branches synced
Stacked on main (69c442c)
$ gh stack merge --squash
✗ this stack has not been submitted to GitHub yet; run `gh stack submit` first
```
The pull request exists and is open. In this reproduction, GitHub also reported the pull request as mergeable and clean.
## Expected behavior
The commands should not give conflicting results.
`gh stack submit` should state that it published a regular pull request but did not create a remote stack object. Alternatively, it should explain that a remote stack requires at least two pull requests.
`gh stack merge` should handle a local stack with one pull request. It can merge the pull request directly, or it can show an actionable command such as `gh pr merge`.
## Actual behavior
`gh stack submit` reports that it pushed and synchronized the one-branch stack. It exits successfully.
`gh stack merge` reports that the same stack was not submitted. It tells the user to repeat the command that already reported success.
## Source context
The behavior is also present on the current `github/gh-stack` `main` branch at commit `ab00aa4a3f2dddc51aa65849c68b391a1b079311`.
In `cmd/submit.go`, `syncStack` returns `false` when the stack has fewer than two pull requests:
```go
// The API requires at least 2 PRs to form a stack.
if len(prNumbers) < 2 {
return false
}
```
The caller does not use this result:
```go
if stacksAvailable {
syncStack(cfg, client, s)
clearPendingModifyState(cfg, gitDir)
}
```
The command then prints the success message:
```go
cfg.Successf("Pushed and synced %d branches", len(s.ActiveBranches()))
```
In `cmd/merge.go`, the merge command requires a remote stack ID or number:
```go
if s.ID == "" && s.Number == 0 {
cfg.Errorf("this stack has not been submitted to GitHub yet; run `gh stack submit` first")
return nil, ErrNotInStack
}
```
Thus, the submit command knows that it did not create a remote stack object. However, it discards that result and reports success.
## Environment
```text
gh stack version 0.1.0
Darwin 25.6.0 arm64
```
---
Deviations: none.
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Start in cmd/submit.go by reading syncStack and its caller, then compare the remote-stack check in cmd/merge.go. Reproduce the one-PR flow with the commands in the issue; done means submit accurately reports the missing remote stack and merge gives a usable result or next command without telling the user to repeat a successful submission.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- go
- Ambito
- cli
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Attiva
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 76/100