Skip to content

Commit

Permalink
Add -related option
Browse files Browse the repository at this point in the history
  • Loading branch information
rbong committed Sep 7, 2024
1 parent 6158cbe commit b77c831
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 2 deletions.
6 changes: 6 additions & 0 deletions autoload/flog/cmd/flog/args.vim
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ function! flog#cmd#flog#args#Parse(current_opts, workdir, args) abort
let a:current_opts.reflog = v:true
elseif l:arg ==# '-no-reflog'
let a:current_opts.reflog = v:false
elseif l:arg ==# '-related'
let a:current_opts.related = v:true
elseif l:arg ==# '-no-related'
let a:current_opts.related = v:false
elseif l:arg ==# '-reverse'
let a:current_opts.reverse = v:true
elseif l:arg ==# '-no-reverse'
Expand Down Expand Up @@ -319,6 +323,8 @@ function! flog#cmd#flog#args#Complete(arg_lead, cmd_line, cursor_pos) abort
\ '-raw-args=',
\ '-reflog ',
\ '-no-reflog ',
\ '-related',
\ '-no-related',
\ '-rev=',
\ '-reverse ',
\ '-no-reverse ',
Expand Down
3 changes: 3 additions & 0 deletions autoload/flog/floggraph/buf.vim
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ function! flog#floggraph#buf#GetName(instance_number, opts) abort
if len(a:opts.rev) > 1
let l:name .= ' [rev=...]'
endif
if a:opts.related && !a:opts.limit
let l:name .= ' [related]'
endif
if len(a:opts.path) == 1
let l:name .= ' [path=' . flog#str#Ellipsize(fnamemodify(a:opts.path[0], ':t'), 15) . ']'
elseif len(a:opts.path) > 1
Expand Down
13 changes: 11 additions & 2 deletions autoload/flog/floggraph/git.vim
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,22 @@ function! flog#floggraph#git#BuildLogArgs() abort
if !empty(l:opts.raw_args)
let l:args .= ' ' . l:opts.raw_args
endif
if len(l:opts.rev) >= 1
if len(l:opts.rev) >= 1 || (empty(l:opts.limit) && l:opts.related)
let l:rev = ''

if !empty(l:opts.limit)
" The -L flag only supports a single rev, use only the first rev
let l:rev = flog#shell#Escape(l:opts.rev[0])
else
let l:rev = join(flog#shell#EscapeList(l:opts.rev), ' ')
" Include related refs
let l:revs = l:opts.rev
if l:opts.related
let l:revs = uniq(sort(flog#git#GetRelatedRefs(l:revs) + l:revs))
endif

let l:rev = join(flog#shell#EscapeList(l:revs), ' ')
endif

let l:args .= ' ' . l:rev
endif

Expand Down
57 changes: 57 additions & 0 deletions autoload/flog/git.vim
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,60 @@ function! flog#git#SplitRemote(ref, remotes) abort

return ['', a:ref]
endfunction

function! flog#git#GetHeadRef() abort
let l:cmd = flog#fugitive#GetGitCommand()
let l:cmd .= ' symbolic-ref --short HEAD'
return flog#shell#Run(l:cmd)
endfunction

function! flog#git#GetRelatedRefs(revs = []) abort
let l:related_refs = []

" Remove duplicates and filter
let l:revs = uniq(sort(filter(a:revs, '!empty(v:val)')))

" Use HEAD if empty
if empty(l:revs)
let l:revs = ['HEAD']
endif

" Resolve HEAD
let l:head_index = index(l:revs, 'HEAD')
if l:head_index >= 0
let l:head_ref = flog#git#GetHeadRef()[0]
if empty(l:head_ref)
call add(related_refs, 'HEAD')
call remove(l:revs, l:head_index)
else
let l:revs[l:head_index] = l:head_ref
endif
endif

" Early exit if revs are empty
if empty(l:revs)
return l:related_refs
endif

" Get data from Git
let l:remotes = flog#git#GetRemotes()
let l:all_refs = flog#git#GetRefs()

" Strip remote from revs
let l:check_revs = {}
for l:rev in l:revs
let l:check_revs[flog#git#SplitRemote(l:rev, l:remotes)[1]] = 1
endfor

" Find related refs
for l:ref in l:all_refs
" Strip remote from ref
let l:stripped_ref = flog#git#SplitRemote(l:ref, l:remotes)[1]
" Check if ref matches
if has_key(l:check_revs, l:stripped_ref)
call add(l:related_refs, l:ref)
endif
endfor

return l:related_refs
endfunction
1 change: 1 addition & 0 deletions autoload/flog/state.vim
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ function! flog#state#GetInternalDefaultOpts() abort
\ 'first_parent': v:false,
\ 'merges': v:true,
\ 'reflog': v:false,
\ 'related': v:false,
\ 'reverse': v:false,
\ 'graph': v:true,
\ 'patch': -1,
Expand Down
14 changes: 14 additions & 0 deletions doc/flog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,20 @@ The options shown here can be configured via |g:flog_default_opts| and
When enabled, pass the "--reflog" argument to "git log".
Disabled by default.

:Flog -related *:Flog_-related*
:Flog -no-related *:Flog_-no-related*

When enabled, pass refs related to target revisions to "git log".
Target revisions are set by |:Flog_-rev| and default to "HEAD".

A related ref is any ref with the same name on a different remote.
In the case of "HEAD", any ref name at "HEAD" is used.

When disabled, do not pass any additional refs to "git log".
When |:Flog_-limit| is specified, this flag is unused.

Disabled by default.

:Flog -reverse *:Flog_-reverse*
:Flog -no-reverse *:Flog_-no-reverse*

Expand Down

0 comments on commit b77c831

Please sign in to comment.