~sanchayanmaity/dotfiles

d3b8cec40a8a7413ece947be0d268761dc9e9e5c — Sanchayan Maity 2 months ago a85a76c
nvim: git: Add functionality to restore using git reflog
M nvim/.config/nvim/after/ftplugin/git.vim => nvim/.config/nvim/after/ftplugin/git.vim +1 -0
@@ 12,3 12,4 @@ nnoremap <buffer> <Leader>gL :call git#git_branch_log_pretty()<CR>
nnoremap <buffer> <Leader>gp :call git#git_cherry_pick()<CR>
xnoremap <buffer> <Leader>gP :<C-U>call git#git_cherry_pick_range()<CR>
nnoremap <buffer> <Leader>gr :call git#git_rebase_branch()<CR>
nnoremap <buffer> <Leader>gR :call git#git_reflog_restore()<CR>

M nvim/.config/nvim/after/plugin/fugitive.vim => nvim/.config/nvim/after/plugin/fugitive.vim +1 -0
@@ 25,6 25,7 @@ nnoremap <Leader>g- :Git stash<CR>:e<CR>
nnoremap <Leader>g+ :Git stash pop<CR>:e<CR>
nnoremap <Leader>gs :Git<CR>
nnoremap <Leader>gS :Git stash -- %<CR>
nnoremap <Leader>gt :Git reflog<CR>
nnoremap <Leader>gw :Gwrite<CR>
nnoremap <Leader>G  :Git<SPACE>


M nvim/.config/nvim/autoload/git.vim => nvim/.config/nvim/autoload/git.vim +21 -0
@@ 181,6 181,27 @@ function! git#git_rebase_branch() abort
  silent execute "bw"
endfunction

" Git reflog should be run first before invoking this
function! git#git_reflog_restore() abort
  let line = trim(getline('.'))
  " A line in git reflog is of the form below
  " f6a8c7ed4 HEAD@{73}: rebase (pick): gst-rtmp: Add mux queues to stats gathering
  let sl1 = split(line, ":")
  " sl1[0] will give f6a8c7ed4 HEAD@{73} for above example
  let sl2 = split(sl1[0], " ")
  " sl2[0] will have f6a8c7ed4 and sl2[1] will have HEAD@{73}
  echom "Command executed will be: Git reset --hard " . sl2[1]
  call inputsave()
  let restore = input('Restore to: ' . line . '. Enter y to proceed: ')
  call inputrestore()
  let to_restore = match(restore, 'y')
  if (to_restore == 0)
    execute "Git reset --hard " . sl2[1]
  else
    echom "Not restoring to " . line
  endif
endfunction

" Figures out whether default branch is main or master and runs git rebase.
function! git#git_rebase_origin() abort
  let default = split(trim(system('git symbolic-ref refs/remotes/origin/HEAD')), '/')