Skip to content

Commit 147cdcd

Browse files
committed
Add extra confirm step and a flag
1 parent 0083607 commit 147cdcd

File tree

1 file changed

+69
-55
lines changed

1 file changed

+69
-55
lines changed

pkg/cmd/pr/merge/merge.go

Lines changed: 69 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type MergeOptions struct {
3333
DeleteLocalBranch bool
3434
MergeMethod api.PullRequestMergeMethod
3535
InteractiveMode bool
36+
ConfirmSubmit bool
3637
}
3738

3839
func NewCmdMerge(f *cmdutil.Factory, runF func(*MergeOptions) error) *cobra.Command {
@@ -107,7 +108,7 @@ func NewCmdMerge(f *cmdutil.Factory, runF func(*MergeOptions) error) *cobra.Comm
107108
cmd.Flags().BoolVarP(&flagMerge, "merge", "m", false, "Merge the commits with the base branch")
108109
cmd.Flags().BoolVarP(&flagRebase, "rebase", "r", false, "Rebase the commits onto the base branch")
109110
cmd.Flags().BoolVarP(&flagSquash, "squash", "s", false, "Squash the commits into one commit and merge it into the base branch")
110-
111+
cmd.Flags().BoolVarP(&opts.ConfirmSubmit, "confirm", "y", false, "Confirm Merging the PR (default: false)")
111112
return cmd
112113
}
113114

@@ -145,79 +146,92 @@ func mergeRun(opts *MergeOptions) error {
145146
}
146147
}
147148

148-
var action string
149-
if mergeMethod == api.PullRequestMergeMethodRebase {
150-
action = "Rebased and merged"
151-
err = api.PullRequestMerge(apiClient, baseRepo, pr, api.PullRequestMergeMethodRebase)
152-
} else if mergeMethod == api.PullRequestMergeMethodSquash {
153-
action = "Squashed and merged"
154-
err = api.PullRequestMerge(apiClient, baseRepo, pr, api.PullRequestMergeMethodSquash)
155-
} else if mergeMethod == api.PullRequestMergeMethodMerge {
156-
action = "Merged"
157-
err = api.PullRequestMerge(apiClient, baseRepo, pr, api.PullRequestMergeMethodMerge)
158-
} else {
159-
err = fmt.Errorf("unknown merge method (%d) used", mergeMethod)
160-
return err
149+
shouldSubmitFromFlag := opts.ConfirmSubmit
150+
if !shouldSubmitFromFlag {
151+
fmt.Println(opts.ConfirmSubmit)
152+
err := prompt.Confirm("Submit? ", &shouldSubmitFromFlag)
153+
if err != nil {
154+
return err
155+
}
161156
}
162157

163-
if err != nil {
164-
return fmt.Errorf("API call failed: %w", err)
165-
}
158+
if shouldSubmitFromFlag {
159+
var action string
160+
if mergeMethod == api.PullRequestMergeMethodRebase {
161+
action = "Rebased and merged"
162+
err = api.PullRequestMerge(apiClient, baseRepo, pr, api.PullRequestMergeMethodRebase)
163+
} else if mergeMethod == api.PullRequestMergeMethodSquash {
164+
action = "Squashed and merged"
165+
err = api.PullRequestMerge(apiClient, baseRepo, pr, api.PullRequestMergeMethodSquash)
166+
} else if mergeMethod == api.PullRequestMergeMethodMerge {
167+
action = "Merged"
168+
err = api.PullRequestMerge(apiClient, baseRepo, pr, api.PullRequestMergeMethodMerge)
169+
} else {
170+
err = fmt.Errorf("unknown merge method (%d) used", mergeMethod)
171+
return err
172+
}
166173

167-
isTerminal := opts.IO.IsStdoutTTY()
174+
if err != nil {
175+
return fmt.Errorf("API call failed: %w", err)
176+
}
168177

169-
if isTerminal {
170-
fmt.Fprintf(opts.IO.ErrOut, "%s %s pull request #%d (%s)\n", utils.Magenta("✔"), action, pr.Number, pr.Title)
171-
}
178+
isTerminal := opts.IO.IsStdoutTTY()
172179

173-
if deleteBranch {
174-
branchSwitchString := ""
180+
if isTerminal {
181+
fmt.Fprintf(opts.IO.ErrOut, "%s %s pull request #%d (%s)\n", utils.Magenta("✔"), action, pr.Number, pr.Title)
182+
}
175183

176-
if opts.DeleteLocalBranch && !crossRepoPR {
177-
currentBranch, err := opts.Branch()
178-
if err != nil {
179-
return err
180-
}
184+
if deleteBranch {
185+
branchSwitchString := ""
181186

182-
var branchToSwitchTo string
183-
if currentBranch == pr.HeadRefName {
184-
branchToSwitchTo, err = api.RepoDefaultBranch(apiClient, baseRepo)
187+
if opts.DeleteLocalBranch && !crossRepoPR {
188+
currentBranch, err := opts.Branch()
185189
if err != nil {
186190
return err
187191
}
188-
err = git.CheckoutBranch(branchToSwitchTo)
189-
if err != nil {
190-
return err
192+
193+
var branchToSwitchTo string
194+
if currentBranch == pr.HeadRefName {
195+
branchToSwitchTo, err = api.RepoDefaultBranch(apiClient, baseRepo)
196+
if err != nil {
197+
return err
198+
}
199+
err = git.CheckoutBranch(branchToSwitchTo)
200+
if err != nil {
201+
return err
202+
}
191203
}
192-
}
193204

194-
localBranchExists := git.HasLocalBranch(pr.HeadRefName)
195-
if localBranchExists {
196-
err = git.DeleteLocalBranch(pr.HeadRefName)
197-
if err != nil {
198-
err = fmt.Errorf("failed to delete local branch %s: %w", utils.Cyan(pr.HeadRefName), err)
199-
return err
205+
localBranchExists := git.HasLocalBranch(pr.HeadRefName)
206+
if localBranchExists {
207+
err = git.DeleteLocalBranch(pr.HeadRefName)
208+
if err != nil {
209+
err = fmt.Errorf("failed to delete local branch %s: %w", utils.Cyan(pr.HeadRefName), err)
210+
return err
211+
}
200212
}
201-
}
202213

203-
if branchToSwitchTo != "" {
204-
branchSwitchString = fmt.Sprintf(" and switched to branch %s", utils.Cyan(branchToSwitchTo))
214+
if branchToSwitchTo != "" {
215+
branchSwitchString = fmt.Sprintf(" and switched to branch %s", utils.Cyan(branchToSwitchTo))
216+
}
205217
}
206-
}
207218

208-
if !crossRepoPR {
209-
err = api.BranchDeleteRemote(apiClient, baseRepo, pr.HeadRefName)
210-
var httpErr api.HTTPError
211-
// The ref might have already been deleted by GitHub
212-
if err != nil && (!errors.As(err, &httpErr) || httpErr.StatusCode != 422) {
213-
err = fmt.Errorf("failed to delete remote branch %s: %w", utils.Cyan(pr.HeadRefName), err)
214-
return err
219+
if !crossRepoPR {
220+
err = api.BranchDeleteRemote(apiClient, baseRepo, pr.HeadRefName)
221+
var httpErr api.HTTPError
222+
// The ref might have already been deleted by GitHub
223+
if err != nil && (!errors.As(err, &httpErr) || httpErr.StatusCode != 422) {
224+
err = fmt.Errorf("failed to delete remote branch %s: %w", utils.Cyan(pr.HeadRefName), err)
225+
return err
226+
}
215227
}
216-
}
217228

218-
if isTerminal {
219-
fmt.Fprintf(opts.IO.ErrOut, "%s Deleted branch %s%s\n", utils.Red("✔"), utils.Cyan(pr.HeadRefName), branchSwitchString)
229+
if isTerminal {
230+
fmt.Fprintf(opts.IO.ErrOut, "%s Deleted branch %s%s\n", utils.Red("✔"), utils.Cyan(pr.HeadRefName), branchSwitchString)
231+
}
220232
}
233+
} else {
234+
fmt.Println("Discarding")
221235
}
222236

223237
return nil

0 commit comments

Comments
 (0)