@@ -90,6 +90,7 @@ func (gui *Gui) handlePickHunk() error {
9090 if err := gui .handleCompleteMerge (); err != nil {
9191 return err
9292 }
93+ return nil
9394 }
9495 return gui .refreshMergePanel ()
9596 })
@@ -151,32 +152,40 @@ func (gui *Gui) refreshMergePanelWithLock() error {
151152 return gui .withMergeConflictLock (gui .refreshMergePanel )
152153}
153154
154- func (gui * Gui ) refreshMergePanel () error {
155- panelState := gui .State .Panels .Merging
155+ // not re-using state here because we can run into issues with mutexes when
156+ // doing that.
157+ func (gui * Gui ) renderConflictsFromFilesPanel () error {
158+ state := mergeconflicts .NewState ()
159+ _ , err := gui .renderConflicts (state , false )
160+
161+ return err
162+ }
163+
164+ func (gui * Gui ) renderConflicts (state * mergeconflicts.State , hasFocus bool ) (bool , error ) {
156165 cat , err := gui .catSelectedFile ()
157166 if err != nil {
158- return gui .refreshMainViews (refreshMainOpts {
167+ return false , gui .refreshMainViews (refreshMainOpts {
159168 main : & viewUpdateOpts {
160169 title : "" ,
161170 task : NewRenderStringTask (err .Error ()),
162171 },
163172 })
164173 }
165174
166- panelState .SetConflictsFromCat (cat )
175+ state .SetConflictsFromCat (cat )
167176
168- if panelState .NoConflicts () {
169- return gui .handleCompleteMerge ()
177+ if state .NoConflicts () {
178+ // we shouldn't end up here
179+ return false , nil
170180 }
171181
172- hasFocus := gui .currentViewName () == "main"
173- content := mergeconflicts .ColoredConflictFile (cat , panelState .State , hasFocus )
182+ content := mergeconflicts .ColoredConflictFile (cat , state , hasFocus )
174183
175- if err := gui .scrollToConflict (); err != nil {
176- return err
184+ if ! gui .State . Panels . Merging . UserVerticalScrolling {
185+ gui . centerYPos ( gui . Views . Main , state . GetConflictMiddle ())
177186 }
178187
179- return gui .refreshMainViews (refreshMainOpts {
188+ return true , gui .refreshMainViews (refreshMainOpts {
180189 main : & viewUpdateOpts {
181190 title : gui .Tr .MergeConflictsTitle ,
182191 task : NewRenderStringWithoutScrollTask (content ),
@@ -185,6 +194,19 @@ func (gui *Gui) refreshMergePanel() error {
185194 })
186195}
187196
197+ func (gui * Gui ) refreshMergePanel () error {
198+ conflictsFound , err := gui .renderConflicts (gui .State .Panels .Merging .State , true )
199+ if err != nil {
200+ return err
201+ }
202+
203+ if ! conflictsFound {
204+ return gui .handleCompleteMerge ()
205+ }
206+
207+ return nil
208+ }
209+
188210func (gui * Gui ) catSelectedFile () (string , error ) {
189211 item := gui .getSelectedFile ()
190212 if item == nil {
@@ -203,21 +225,6 @@ func (gui *Gui) catSelectedFile() (string, error) {
203225 return cat , nil
204226}
205227
206- func (gui * Gui ) scrollToConflict () error {
207- if gui .State .Panels .Merging .UserVerticalScrolling {
208- return nil
209- }
210-
211- panelState := gui .State .Panels .Merging
212- if panelState .NoConflicts () {
213- return nil
214- }
215-
216- gui .centerYPos (gui .Views .Main , panelState .GetConflictMiddle ())
217-
218- return nil
219- }
220-
221228func (gui * Gui ) centerYPos (view * gocui.View , y int ) {
222229 ox , _ := view .Origin ()
223230 _ , height := view .Size ()
@@ -238,18 +245,11 @@ func (gui *Gui) getMergingOptions() map[string]string {
238245}
239246
240247func (gui * Gui ) handleEscapeMerge () error {
241- gui .takeOverMergeConflictScrolling ()
242-
243- gui .State .Panels .Merging .Reset ()
244248 if err := gui .refreshSidePanels (refreshOptions {scope : []RefreshableView {FILES }}); err != nil {
245249 return err
246250 }
247- // it's possible this method won't be called from the merging view so we need to
248- // ensure we only 'return' focus if we already have it
249- if gui .g .CurrentView () == gui .Views .Main {
250- return gui .pushContext (gui .State .Contexts .Files )
251- }
252- return nil
251+
252+ return gui .escapeMerge ()
253253}
254254
255255func (gui * Gui ) handleCompleteMerge () error {
@@ -259,16 +259,26 @@ func (gui *Gui) handleCompleteMerge() error {
259259 if err := gui .refreshSidePanels (refreshOptions {scope : []RefreshableView {FILES }}); err != nil {
260260 return err
261261 }
262- // if we got conflicts after unstashing, we don't want to call any git
263- // commands to continue rebasing/merging here
264- if gui .Git .Status .WorkingTreeState () == enums .REBASE_MODE_NONE {
265- return gui .handleEscapeMerge ()
266- }
262+
267263 // if there are no more files with merge conflicts, we should ask whether the user wants to continue
268- if ! gui .anyFilesWithMergeConflicts () {
264+ if gui . Git . Status . WorkingTreeState () != enums . REBASE_MODE_NONE && ! gui .anyFilesWithMergeConflicts () {
269265 return gui .promptToContinueRebase ()
270266 }
271- return gui .handleEscapeMerge ()
267+
268+ return gui .escapeMerge ()
269+ }
270+
271+ func (gui * Gui ) escapeMerge () error {
272+ gui .takeOverMergeConflictScrolling ()
273+
274+ gui .State .Panels .Merging .Reset ()
275+
276+ // it's possible this method won't be called from the merging view so we need to
277+ // ensure we only 'return' focus if we already have it
278+ if gui .g .CurrentView () == gui .Views .Main {
279+ return gui .pushContext (gui .State .Contexts .Files )
280+ }
281+ return nil
272282}
273283
274284// promptToContinueRebase asks the user if they want to continue the rebase/merge that's in progress
0 commit comments