Skip to content

Commit e07fe2d

Browse files
committed
Refresh released PRs before retrying modify submission
1 parent a2cd1c3 commit e07fe2d

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

‎cmd/submit.go‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,11 @@ func runSubmit(cfg *config.Config, opts *submitOptions) error {
188188
}
189189
}
190190

191-
// A pending modify owns its replacement identity, including on retries
192-
// after unstacking left only merged PRs in the old remote stack.
193-
if stacksAvailable && !pendingModify {
191+
// A modify retry may still have the old catalog ID. Refresh detached PRs
192+
// after clearing it so merged or queued PRs are not pushed again.
193+
if pendingModify {
194+
prDetails = syncStackPRs(cfg, s)
195+
} else if stacksAvailable {
194196
s, err = maybeForkFromMergedBase(cfg, client, sf, s, gitDir)
195197
if err != nil {
196198
cfg.Errorf("%s", err)

‎cmd/submit_test.go‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1866,6 +1866,7 @@ func TestSubmit_PendingModifyCompletion(t *testing.T) {
18661866
priorDeleted bool
18671867
mergedBase bool
18681868
retry bool
1869+
mergeOnRetry bool
18691870
}{
18701871
{name: "one existing PR", branches: 1},
18711872
{name: "one new PR", branches: 1, newPR: true},
@@ -1883,6 +1884,7 @@ func TestSubmit_PendingModifyCompletion(t *testing.T) {
18831884
{name: "multiple PRs complete", branches: 3},
18841885
{name: "multiple PRs after partial unstack", branches: 3, mergedBase: true},
18851886
{name: "retry push after partial unstack", branches: 3, mergedBase: true, failure: "push", retry: true},
1887+
{name: "released PR merged before retry", branches: 3, mergedBase: true, failure: "push", retry: true, mergeOnRetry: true},
18861888
{name: "retry creation after partial unstack", branches: 3, mergedBase: true, failure: "stack", retry: true},
18871889
{name: "multiple PRs failed lookup", branches: 3, failure: "lookup"},
18881890
{name: "multiple PRs failed creation", branches: 3, newPR: true, failure: "create"},
@@ -1996,6 +1998,9 @@ func TestSubmit_PendingModifyCompletion(t *testing.T) {
19961998
if branch == target && (tc.failure == "lookup" || (tc.failure == "refresh" && baseUpdates > 0)) {
19971999
return nil, assert.AnError
19982000
}
2001+
if pr := prs[branch]; pr != nil && pr.Merged {
2002+
return nil, nil
2003+
}
19992004
return prs[branch], nil
20002005
},
20012006
UnstackFn: func(number int) (*github.RemoteStack, bool, error) {
@@ -2084,7 +2089,15 @@ func TestSubmit_PendingModifyCompletion(t *testing.T) {
20842089
}
20852090
}
20862091
if tc.retry {
2092+
if tc.mergeOnRetry {
2093+
before, loadErr := stack.Load(dir)
2094+
require.NoError(t, loadErr)
2095+
assert.Equal(t, "42", before.Stacks[0].ID)
2096+
prs["b2"].Merged = true
2097+
prs["b2"].State = "MERGED"
2098+
}
20872099
tc.failure = ""
2100+
pushStart := len(pushes)
20882101
retryCfg, retryOut, retryErr := config.NewTestConfig()
20892102
retryCfg.GitHubClientOverride = client
20902103
err := runSubmit(retryCfg, &submitOptions{auto: true})
@@ -2096,6 +2109,15 @@ func TestSubmit_PendingModifyCompletion(t *testing.T) {
20962109
require.Len(t, saved.Stacks, 1)
20972110
assert.Equal(t, s.BranchNames(), saved.Stacks[0].BranchNames())
20982111
assert.Equal(t, "77", saved.Stacks[0].ID)
2112+
if tc.mergeOnRetry {
2113+
assert.Equal(t, []string{"b1", "b3"}, pushes[pushStart:])
2114+
assert.Zero(t, createdPRs)
2115+
require.NotNil(t, replacement)
2116+
assert.Equal(t, []int{10, 12}, replacement.PullRequests)
2117+
mergedIndex := saved.Stacks[0].IndexOf("b2")
2118+
require.NotEqual(t, -1, mergedIndex)
2119+
assert.True(t, saved.Stacks[0].Branches[mergedIndex].IsMerged())
2120+
}
20992121
}
21002122
if tc.priorDeleted {
21012123
assert.Zero(t, unstackCalls)

0 commit comments

Comments
 (0)