let s:Git = vital#gina#import('Git')
let s:Path = vital#gina#import('System.Filepath')
let s:Store = vital#gina#import('System.Store')


function! gina#core#repo#abspath(git, expr) abort
  return gina#core#path#abspath(a:expr, a:git.worktree)
endfunction

function! gina#core#repo#relpath(git, expr) abort
  let path = gina#core#path#expand(a:expr)
  if s:Path.is_relative(s:Path.realpath(path))
    return path
  endif
  let path = gina#core#path#relpath(path, a:git.worktree)
  if path ==# path && path !=# resolve(path)
    return gina#core#path#relpath(resolve(path), a:git.worktree)
  endif
  return path
endfunction

function! gina#core#repo#config(git) abort
  let slug = eval(s:Store.get_slug_expr())
  let store = s:Store.of(s:Git.resolve(a:git, 'config'))
  let config = store.get(slug, {})
  if !empty(config)
    return config
  endif
  let result = gina#process#call(a:git, ['config', '--list'])
  if result.status
    throw gina#process#errormsg(result)
  endif
  let config = {}
  for record in filter(copy(result.stdout), '!empty(v:val)')
    call s:extend_config(config, record)
  endfor
  call store.set(slug, config)
  return config
endfunction


" Private --------------------------------------------------------------------
function! s:extend_config(config, record) abort
  let m = matchlist(a:record, '^\(.\+\)=\(.*\)$')
  if empty(m)
    return
  endif
  let a:config[tolower(m[1])] = m[2]
endfunction