From 9437ab08c5ff9388d607e37a6252bfcc1645c353 Mon Sep 17 00:00:00 2001 From: Masahiro Kasashima Date: Thu, 25 May 2023 22:12:16 +0900 Subject: [PATCH 1/3] Added hash mark uri encoding for branch name --- lua/openingh/utils.lua | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lua/openingh/utils.lua b/lua/openingh/utils.lua index 68a4557..132ed14 100644 --- a/lua/openingh/utils.lua +++ b/lua/openingh/utils.lua @@ -77,17 +77,21 @@ end -- Returns the current branch or commit if they are available on remote -- otherwise this will return the default branch of the repo function M.get_current_branch_or_commit() - local current_branch = get_current_branch() - if current_branch ~= "HEAD" and M.is_branch_upstreamed(current_branch) then - return current_branch + local core = function() + local current_branch = get_current_branch() + if current_branch ~= "HEAD" and M.is_branch_upstreamed(current_branch) then + return current_branch + end + + local commit_hash = get_current_commit_hash() + if current_branch == "HEAD" and M.is_commit_upstreamed(commit_hash) then + return commit_hash + end + + return M.get_default_branch() end - local commit_hash = get_current_commit_hash() - if current_branch == "HEAD" and M.is_commit_upstreamed(commit_hash) then - return commit_hash - end - - return M.get_default_branch() + return string.gsub(core(), "#", "%%23") end -- get the active buf relative file path form the .git From 30535d4c2876c697d01d5cbcafe84f962626b378 Mon Sep 17 00:00:00 2001 From: Masahiro Kasashima Date: Sun, 28 May 2023 07:47:32 +0900 Subject: [PATCH 2/3] Encode uri component properly and apply it for branch name and also file path --- lua/openingh/utils.lua | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/lua/openingh/utils.lua b/lua/openingh/utils.lua index 132ed14..ef39177 100644 --- a/lua/openingh/utils.lua +++ b/lua/openingh/utils.lua @@ -22,6 +22,12 @@ function M.trim(string) return (string:gsub("^%s*(.-)%s*$", "%1")) end +-- url encode +-- see: https://datatracker.ietf.org/doc/html/rfc3986#section-2.3 +function M.encode_uri_component(string) + return (string:gsub("[^%w_~%.%-]", function (c) return string.format("%%%02X", string.byte(c)) end)) +end + -- returns a table with the host, user/org and the reponame given a github remote url -- nil is returned when the url cannot be parsed function M.parse_gh_remote(url) @@ -77,21 +83,17 @@ end -- Returns the current branch or commit if they are available on remote -- otherwise this will return the default branch of the repo function M.get_current_branch_or_commit() - local core = function() - local current_branch = get_current_branch() - if current_branch ~= "HEAD" and M.is_branch_upstreamed(current_branch) then - return current_branch - end - - local commit_hash = get_current_commit_hash() - if current_branch == "HEAD" and M.is_commit_upstreamed(commit_hash) then - return commit_hash - end - - return M.get_default_branch() + local current_branch = get_current_branch() + if current_branch ~= "HEAD" and M.is_branch_upstreamed(current_branch) then + return M.encode_uri_component(current_branch) end - return string.gsub(core(), "#", "%%23") + local commit_hash = get_current_commit_hash() + if current_branch == "HEAD" and M.is_commit_upstreamed(commit_hash) then + return commit_hash + end + + return M.encode_uri_component(M.get_default_branch()) end -- get the active buf relative file path form the .git @@ -100,9 +102,13 @@ function M.get_current_relative_file_path() local absolute_file_path = vim.api.nvim_buf_get_name(0) local git_path = vim.fn.system("git rev-parse --show-toplevel") - local relative_file_path = "/" .. string.sub(absolute_file_path, git_path:len() + 1) + local relative_file_path_components = M.split(string.sub(absolute_file_path, git_path:len() + 1), "/") + local encoded_components = {} + for i, path_component in pairs(relative_file_path_components) do + table.insert(encoded_components, i, M.encode_uri_component(path_component)) + end - return relative_file_path + return "/" .. table.concat(encoded_components, '/') end -- get the line number in the buffer From 11430ecac6b2d8f5e7b79aed2acdd0730009dcac Mon Sep 17 00:00:00 2001 From: Masahiro Kasashima Date: Fri, 2 Jun 2023 19:01:59 +0900 Subject: [PATCH 3/3] Added a few tests for encode_uri_component --- tests/utils_spec.lua | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/utils_spec.lua b/tests/utils_spec.lua index 11cf4e0..b3377b9 100644 --- a/tests/utils_spec.lua +++ b/tests/utils_spec.lua @@ -26,3 +26,26 @@ describe("is_commit_upstreamed", function() assert.is.True(output) end) end) + +describe("encode_uri_component", function() + it("returns the given string without any change if it doesn't contain any uri reserved characters", function() + local input = "asdf_12345.QWER~yuio-hjkl" + local output = utils.encode_uri_component(input) + assert.is.Equal(input, output) + end) + + it("returns an encoded string that all non-uri-unreserved characters are converted", function() + local input = "" + for i = 0, 127 do + input = input .. string.char(i) + end + local output = utils.encode_uri_component(input) + assert.is.Equal("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F", output) + end) + + it("returns encoded string for a non-ascii string input (UTF-8)", function() + local input = "ほげ" -- UTF-8 bytewise representation is "e3 81 bb e3 81 92" + local output = utils.encode_uri_component(input) + assert.is.Equal("%E3%81%BB%E3%81%92", output) + end) +end)