function! s:openBasedOnMergeMode() abort
    if merginal#isRebaseMode()
        call merginal#openRebaseConflictsBuffer()
    elseif merginal#isRebaseAmendMode()
        call merginal#openRebaseAmendBuffer()
    elseif merginal#isMergeMode()
        call merginal#openMergeConflictsBuffer()
    else
        call merginal#openBranchListBuffer()
    endif
endfunction

function! s:toggleBasedOnMergeMode() abort
    let l:repo=fugitive#repo()
    let l:merginalWindowNumber=bufwinnr('Merginal:')
    if 0<=l:merginalWindowNumber
        let l:merginalBufferNumber=winbufnr(l:merginalWindowNumber)
        let l:merginalBufferName=bufname(l:merginalBufferNumber)

        "If we are not on the same dir we need to reload the merginal buffer
        "anyways:
        if getbufvar(l:merginalBufferNumber,'merginal_repo').dir()==l:repo.dir()
            if merginal#isRebaseMode()
                if 'Merginal:Rebase'==l:merginalBufferName
                    call merginal#closeMerginalBuffer()
                    return
                endif
            elseif merginal#isRebaseAmendMode()
                if 'Merginal:RebaseAmend'==l:merginalBufferName
                    call merginal#closeMerginalBuffer()
                    return
                endif
            elseif merginal#isMergeMode()
                if 'Merginal:Conflicts'==l:merginalBufferName
                    call merginal#closeMerginalBuffer()
                    return
                endif
            else
                if 'Merginal:Branches'==l:merginalBufferName
                    call merginal#closeMerginalBuffer()
                    return
                endif
            end
        endif
    endif
    call s:openBasedOnMergeMode()
endfunction

autocmd User Fugitive command! -buffer -nargs=0 Merginal call s:openBasedOnMergeMode()
autocmd User Fugitive command! -buffer -nargs=0 MerginalToggle call s:toggleBasedOnMergeMode()
autocmd User Fugitive command! -buffer -nargs=0 MerginalClose call merginal#closeMerginalBuffer()