better git format and parsing

This commit is contained in:
kyazdani42
2020-02-19 16:24:49 +01:00
parent 1c4fb795fb
commit 05b5117f75
5 changed files with 72 additions and 50 deletions

View File

@@ -1,4 +1,5 @@
local function system(v) return vim.api.nvim_call_function('system', { v }) end
local function systemlist(v) return vim.api.nvim_call_function('systemlist', { v }) end
local function is_git_repo()
local is_git = system('git rev-parse')
@@ -9,7 +10,7 @@ local IS_GIT_REPO = is_git_repo()
local function set_git_status()
if IS_GIT_REPO == false then return '' end
return system('git status --porcelain=v1')
return systemlist('git status --porcelain=v1')
end
local GIT_STATUS = set_git_status()
@@ -26,31 +27,41 @@ local function force_refresh_git()
end
local function is_folder_dirty(relpath)
return string.match(GIT_STATUS, relpath) ~= nil
for _, status in pairs(GIT_STATUS) do
if string.match(status, relpath) ~= nil then return true end
end
end
local function create_git_checker(pattern)
return function(relpath)
local ret = string.match(GIT_STATUS, '^.*' .. relpath)
if ret == nil then return false end
return string.match(ret, pattern) ~= nil
for _, status in pairs(GIT_STATUS) do
local ret = string.match(status, '^.. ' .. relpath)
if ret ~= nil and string.match(ret, pattern) ~= nil then return true end
end
return false
end
end
local is_modified = create_git_checker('^ ?MM?')
local is_staged = create_git_checker('^ ?A')
local is_unmerged = create_git_checker('^ ?UU')
local is_untracked = create_git_checker('^%?%?')
local unstaged = create_git_checker('^ ')
local staged = create_git_checker('^M ')
local staged_new = create_git_checker('^A ')
local staged_mod = create_git_checker('^MM')
local unmerged = create_git_checker('^[U ][U ]')
local renamed = create_git_checker('^R')
local untracked = create_git_checker('^%?%?')
local function get_git_attr(path, is_dir)
if IS_GIT_REPO == false then return '' end
if is_dir then
if is_folder_dirty(path) == true then return 'Dirty' end
if is_folder_dirty(path) == true then return '' end
else
if is_modified(path) then return 'Modified'
elseif is_staged(path) then return 'Staged'
elseif is_unmerged(path) then return 'Unmerged'
elseif is_untracked(path) then return 'Untracked'
if unstaged(path) then return ''
elseif staged(path) then return ''
elseif staged_new(path) then return '✓★ '
elseif staged_mod(path) then return '✓✗ '
elseif unmerged(path) then return ''
elseif renamed(path) then return ''
elseif untracked(path) then return ''
end
end