From f074844b60f9e151970fbcdbeb8a2cd52b6ef25a Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Thu, 25 Jul 2024 12:14:39 +0100 Subject: [PATCH] feat: add submodule support for gitsigns urls Fixes #1095 --- lua/gitsigns/attach.lua | 20 ++++++++++++++++---- lua/gitsigns/cache.lua | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lua/gitsigns/attach.lua b/lua/gitsigns/attach.lua index 60b3368..540c906 100644 --- a/lua/gitsigns/attach.lua +++ b/lua/gitsigns/attach.lua @@ -41,13 +41,25 @@ end --- @return string buffer --- @return string? commit local function parse_gitsigns_uri(name) - -- TODO(lewis6991): Support submodules - --- @type any, any, string?, string?, string - local _, _, root_path, commit, rel_path = name:find([[^gitsigns://(.*)/%.git/(.*):(.*)]]) + local _proto, head, tail = unpack(vim.split(name, '//')) + + --- @type any, any, string?, string? + local _, _, root_path, sub_path = head:find([[(.*)/%.git(.*)]]) + + --- @type any, any, string?, string? + local _, _, commit, rel_path = tail:find([[(.*):(.*)]]) + commit = util.norm_base(commit) + if root_path then - name = root_path .. '/' .. rel_path + if sub_path then + sub_path = sub_path:gsub('^/modules/', '') + name = string.format('%s/%s/%s', root_path, sub_path, rel_path) + else + name = string.format('%s/%s', root_path, rel_path) + end end + return name, commit end diff --git a/lua/gitsigns/cache.lua b/lua/gitsigns/cache.lua index 5f7d7e3..9934aad 100644 --- a/lua/gitsigns/cache.lua +++ b/lua/gitsigns/cache.lua @@ -25,9 +25,9 @@ local CacheEntry = M.CacheEntry function CacheEntry:get_rev_bufname(rev, nofile) rev = rev or self.git_obj.revision or ':0' if nofile then - return string.format('gitsigns://%s/%s', self.git_obj.repo.gitdir, rev) + return string.format('gitsigns://%s//%s', self.git_obj.repo.gitdir, rev) end - return string.format('gitsigns://%s/%s:%s', self.git_obj.repo.gitdir, rev, self.git_obj.relpath) + return string.format('gitsigns://%s//%s:%s', self.git_obj.repo.gitdir, rev, self.git_obj.relpath) end --- Invalidate any state dependent on the buffer content.