@@ -33,6 +33,7 @@ type MergeOptions struct {
3333 DeleteLocalBranch bool
3434 MergeMethod api.PullRequestMergeMethod
3535 InteractiveMode bool
36+ ConfirmSubmit bool
3637}
3738
3839func 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