diff options
author | Joshua Minor <github@pixelverse.org> | 2021-11-20 18:38:43 -0800 |
---|---|---|
committer | Joshua Minor <github@pixelverse.org> | 2021-11-21 00:28:01 -0800 |
commit | 7fcaa2502fdef153b2215bbf35a65c2ae76fa05b (patch) | |
tree | 502070f16401c8679fbb2e25e71cd7ead8e66142 | |
parent | bc0a289a79294445de9b0001bdaada93d801dadd (diff) | |
download | lite-xl-plugins-7fcaa2502fdef153b2215bbf35a65c2ae76fa05b.tar.gz lite-xl-plugins-7fcaa2502fdef153b2215bbf35a65c2ae76fa05b.zip |
Add support for submodules & per-file color in the treeview based on git status.
-rw-r--r-- | plugins/gitstatus.lua | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/plugins/gitstatus.lua b/plugins/gitstatus.lua index bb16025..4d0cb87 100644 --- a/plugins/gitstatus.lua +++ b/plugins/gitstatus.lua @@ -1,7 +1,9 @@ -- mod-version:2 -- lite-xl 2.0 local core = require "core" +local common = require "core.common" local config = require "core.config" local style = require "core.style" +local _, TreeView = pcall(require, "plugins.treeview") local StatusView = require "core.statusview" local scan_rate = config.project_scan_rate or 5 @@ -13,6 +15,14 @@ local git = { } +config.gitstatus = { + recurse_submodules = true +} +style.gitstatus_addition = {common.color "#587c0c"} +style.gitstatus_modification = {common.color "#0c7d9d"} +style.gitstatus_deletion = {common.color "#94151b"} + + local function exec(cmd, wait) local proc = process.start(cmd) proc:wait(wait * 1000) @@ -27,10 +37,39 @@ core.add_thread(function() -- get branch name git.branch = exec({"git", "rev-parse", "--abbrev-ref", "HEAD"}, 1):match("[^\n]*") + if TreeView then + TreeView:clear_all_color_overrides() + end + + local inserts = 0 + local deletes = 0 + -- get diff - local line = exec({"git", "diff", "--stat"}, 1):match("[^\n]*%s*$") - git.inserts = tonumber(line:match("(%d+) ins")) or 0 - git.deletes = tonumber(line:match("(%d+) del")) or 0 + local diff = exec({"git", "diff", "--numstat"}, 1) + if config.gitstatus.recurse_submodules and system.get_file_info(".gitmodules") then + diff = diff .. exec({"git", "submodule", "foreach", "git diff --numstat --stat"}, 1) + end + + local root = "" + for line in string.gmatch(diff, "[^\n]+") do + local submodule = line:match("^Entering '(.+)'$") + if submodule then + root = submodule.."/" + else + local ins, dels, path = line:match("(%d+)%s+(%d+)%s+(.+)") + if path then + inserts = inserts + (tonumber(ins) or 0) + deletes = deletes + (tonumber(dels) or 0) + local abs_path = core.project_dir.."/"..root..path + if TreeView then + TreeView:set_color_override(abs_path, style.gitstatus_modification) + end + end + end + end + + git.inserts = inserts + git.deletes = deletes else git.branch = nil |