diff autoload/lawrencium/log.vim @ 139:065625e1bb31

Split plugin file into multiple extensions.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 13 Jun 2016 09:32:34 -0700
parents
children 652a6f5df0f3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/autoload/lawrencium/log.vim	Mon Jun 13 09:32:34 2016 -0700
@@ -0,0 +1,203 @@
+
+function! lawrencium#log#init() abort
+    call lawrencium#add_command("Hglogthis  :call lawrencium#log#HgLog(0, '%:p')")
+    call lawrencium#add_command("Hgvlogthis :call lawrencium#log#HgLog(1, '%:p')")
+    call lawrencium#add_command("-nargs=* -complete=customlist,lawrencium#list_repo_files Hglog  :call lawrencium#log#HgLog(0, <f-args>)")
+    call lawrencium#add_command("-nargs=* -complete=customlist,lawrencium#list_repo_files Hgvlog  :call lawrencium#log#HgLog(1, <f-args>)")
+
+    call lawrencium#add_reader("log", "lawrencium#log#read")
+    call lawrencium#add_reader("logpatch", "lawrencium#log#read_patch")
+endfunction
+
+let s:log_style_file = expand("<sfile>:h:h") . "/resources/hg_log.style"
+
+function! lawrencium#log#read(repo, path_parts, full_path) abort
+    let l:log_opts = join(split(a:path_parts['value'], ','))
+    let l:log_cmd = "log " . l:log_opts
+
+    if a:path_parts['path'] == ''
+        call a:repo.ReadCommandOutput(l:log_cmd, '--style', s:log_style_file)
+    else
+        call a:repo.ReadCommandOutput(l:log_cmd, '--style', s:log_style_file, a:full_path)
+    endif
+    setlocal filetype=hglog
+endfunction
+
+function! lawrencium#log#read_patch(repo, path_parts, full_path) abort
+    let l:log_cmd = 'log --patch --verbose --rev ' . a:path_parts['value']
+
+    if a:path_parts['path'] == ''
+        call a:repo.ReadCommandOutput(l:log_cmd)
+    else
+        call a:repo.ReadCommandOutput(l:log_cmd, a:full_path)
+    endif
+    setlocal filetype=diff
+endfunction
+
+function! lawrencium#log#HgLog(vertical, ...) abort
+    " Get the file or directory to get the log from.
+    " (empty string is for the whole repository)
+    let l:repo = lawrencium#hg_repo()
+    if a:0 > 0 && matchstr(a:1, '\v-*') == ""
+        let l:path = l:repo.GetRelativePath(expand(a:1))
+    else
+        let l:path = ''
+    endif
+
+    " Get the Lawrencium path for this `hg log`,
+    " open it in a preview window and jump to it.
+    if a:0 > 0 && l:path != ""
+      let l:log_opts = join(a:000[1:-1], ',')
+    else
+      let l:log_opts = join(a:000, ',')
+    endif
+
+    let l:log_path = l:repo.GetLawrenciumPath(l:path, 'log', l:log_opts)
+    if a:vertical
+        execute 'vertical pedit ' . fnameescape(l:log_path)
+    else
+        execute 'pedit ' . fnameescape(l:log_path)
+    endif
+    wincmd P
+
+    " Add some other nice commands and mappings.
+    let l:is_file = (l:path != '' && filereadable(l:repo.GetFullPath(l:path)))
+    command! -buffer -nargs=* Hglogdiffsum    :call s:HgLog_DiffSummary(1, <f-args>)
+    command! -buffer -nargs=* Hglogvdiffsum   :call s:HgLog_DiffSummary(2, <f-args>)
+    command! -buffer -nargs=* Hglogtabdiffsum :call s:HgLog_DiffSummary(3, <f-args>)
+    command! -buffer -nargs=+ -complete=file Hglogexport :call s:HgLog_ExportPatch(<f-args>)
+    if l:is_file
+        command! -buffer Hglogrevedit          :call s:HgLog_FileRevEdit()
+        command! -buffer -nargs=* Hglogdiff    :call s:HgLog_Diff(0, <f-args>)
+        command! -buffer -nargs=* Hglogvdiff   :call s:HgLog_Diff(1, <f-args>)
+        command! -buffer -nargs=* Hglogtabdiff :call s:HgLog_Diff(2, <f-args>)
+    endif
+
+    if g:lawrencium_define_mappings
+        nnoremap <buffer> <silent> <C-U> :Hglogdiffsum<cr>
+        nnoremap <buffer> <silent> <C-H> :Hglogvdiffsum<cr>
+        nnoremap <buffer> <silent> <cr>  :Hglogvdiffsum<cr>
+        nnoremap <buffer> <silent> q     :bdelete!<cr>
+        if l:is_file
+            nnoremap <buffer> <silent> <C-E>  :Hglogrevedit<cr>
+            nnoremap <buffer> <silent> <C-D>  :Hglogtabdiff<cr>
+            nnoremap <buffer> <silent> <C-V>  :Hglogvdiff<cr>
+        endif
+    endif
+
+    " Clean up when the log buffer is deleted.
+    let l:bufobj = lawrencium#buffer_obj()
+    call l:bufobj.OnDelete('call s:HgLog_Delete(' . l:bufobj.nr . ')')
+endfunction
+
+function! s:HgLog_Delete(bufnr)
+    if g:lawrencium_auto_close_buffers
+        call lawrencium#delete_dependency_buffers('lawrencium_diff_for', a:bufnr)
+        call lawrencium#delete_dependency_buffers('lawrencium_rev_for', a:bufnr)
+    endif
+endfunction
+
+function! s:HgLog_FileRevEdit()
+    let l:repo = lawrencium#hg_repo()
+    let l:bufobj = lawrencium#buffer_obj()
+    let l:rev = s:HgLog_GetSelectedRev()
+    let l:log_path = lawrencium#parse_lawrencium_path(l:bufobj.GetName())
+    let l:path = l:repo.GetLawrenciumPath(l:log_path['path'], 'rev', l:rev)
+
+    " Go to the window we were in before going in the log window,
+    " and open the revision there.
+    wincmd p
+    call lawrencium#edit_deletable_buffer('lawrencium_rev_for', l:bufobj.nr, l:path)
+endfunction
+
+function! s:HgLog_Diff(split, ...) abort
+    let l:revs = []
+    if a:0 >= 2
+        let l:revs = [a:1, a:2]
+    elseif a:0 == 1
+        let l:revs = ['p1('.a:1.')', a:1]
+    else
+        let l:sel = s:HgLog_GetSelectedRev()
+        let l:revs = ['p1('.l:sel.')', l:sel]
+    endif
+
+    let l:repo = lawrencium#hg_repo()
+    let l:bufobj = lawrencium#buffer_obj()
+    let l:log_path = lawrencium#parse_lawrencium_path(l:bufobj.GetName())
+    let l:path = l:repo.GetFullPath(l:log_path['path'])
+
+    " Go to the window we were in before going to the log window,
+    " and open the split diff there.
+    if a:split < 2
+        wincmd p
+    endif
+    call lawrencium#diff#HgDiff(l:path, a:split, l:revs)
+endfunction
+
+function! s:HgLog_DiffSummary(split, ...) abort
+    let l:revs = []
+    if a:0 >= 2
+        let l:revs = [a:1, a:2]
+    elseif a:0 == 1
+        let l:revs = [a:1]
+    else
+        let l:revs = [s:HgLog_GetSelectedRev()]
+    endif
+
+    let l:repo = lawrencium#hg_repo()
+    let l:bufobj = lawrencium#buffer_obj()
+    let l:log_path = lawrencium#parse_lawrencium_path(l:bufobj.GetName())
+    let l:path = l:repo.GetFullPath(l:log_path['path'])
+
+    " Go to the window we were in before going in the log window,
+    " and split for the diff summary from there.
+    let l:reuse_id = 'lawrencium_diffsum_for_' . bufnr('%')
+    let l:split_prev_win = (a:split < 3)
+    let l:args = {'reuse_id': l:reuse_id, 'use_prev_win': l:split_prev_win,
+                \'split_mode': a:split}
+    call lawrencium#diff#HgDiffSummary(l:path, l:args, l:revs)
+endfunction
+
+function! s:HgLog_GetSelectedRev(...) abort
+    if a:0 == 1
+        let l:line = getline(a:1)
+    else
+        let l:line = getline('.')
+    endif
+    " Behold, Vim's look-ahead regex syntax again! WTF.
+    let l:rev = matchstr(l:line, '\v^(\d+)(\:)@=')
+    if l:rev == ''
+        call lawrencium#throw("Can't parse revision number from line: " . l:line)
+    endif
+    return l:rev
+endfunction
+
+function! s:HgLog_ExportPatch(...) abort
+    let l:patch_name = a:1
+    if !empty($HG_EXPORT_PATCH_DIR)
+        " Use the patch dir only if user has specified a relative path
+        if has('win32')
+            let l:is_patch_relative = (matchstr(l:patch_name, '\v^([a-zA-Z]:)?\\') == "")
+        else
+            let l:is_patch_relative = (matchstr(l:patch_name, '\v^/') == "")
+        endif
+        if l:is_patch_relative
+            let l:patch_name = lawrencium#normalizepath(
+                lawrencium#stripslash($HG_EXPORT_PATCH_DIR) . "/" . l:patch_name)
+        endif
+    endif
+
+    if a:0 == 2
+        let l:rev = a:2
+    else
+        let l:rev = s:HgLog_GetSelectedRev()
+    endif
+
+    let l:repo = lawrencium#hg_repo()
+    let l:export_args = ['-o', l:patch_name, '-r', l:rev]
+
+    call l:repo.RunCommand('export', l:export_args)
+
+    echom "Created patch: " . l:patch_name
+endfunction
+