Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: error when missing remote branch #18

Merged
merged 1 commit into from
Jun 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 34 additions & 17 deletions lua/gitlinker/git.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ local job = require("plenary.job")
local path = require("plenary.path")
local logger = require("gitlinker.logger")

--- @alias JobResult table<string, any>
--- @class JobResult
--- @field stdout string[]
--- @field stderr string[]

--- @param result JobResult
--- @return boolean
Expand Down Expand Up @@ -42,11 +44,11 @@ local function cmd(args, cwd)
return result
end

--- @return string[]
--- @return JobResult
local function get_remote()
local result = cmd({ "remote" })
logger.debug("[git.get_remote] result:%s", vim.inspect(result))
return result.stdout
return result
end

--- @param remote string
Expand Down Expand Up @@ -75,15 +77,15 @@ local function get_rev(revspec)
end

--- @param revspec string|nil
--- @return string|nil
--- @return JobResult
local function get_rev_name(revspec)
local result = cmd({ "rev-parse", "--abbrev-ref", revspec })
logger.debug(
"[git.get_rev_name] revspec:%s, result:%s",
vim.inspect(revspec),
vim.inspect(result)
)
return has_output(result) and result.stdout[1] or nil
return result
end

local function is_file_in_rev(file, revspec)
Expand Down Expand Up @@ -145,7 +147,7 @@ local function is_rev_in_remote(revspec, remote)
return false
end

local allowed_chars = "[_%-%w%.]+"
local UpstreamBranchAllowedChars = "[_%-%w%.]+"

local function get_closest_remote_compatible_rev(remote)
assert(remote, "remote cannot be nil")
Expand Down Expand Up @@ -182,7 +184,7 @@ local function get_closest_remote_compatible_rev(remote)
end

logger.error(
"Error! Failed to get closest revision in that exists in remote '%s'",
"fatal: failed to get closest revision in that exists in remote '%s'",
remote
)
return nil
Expand Down Expand Up @@ -210,43 +212,58 @@ end

local function get_branch_remote()
-- origin/upstream
local remotes = get_remote()
--- @type JobResult
local remote_result = get_remote()

if type(remotes) ~= "table" or #remotes == 0 then
logger.error("Error! Git repository has no remote")
if type(remote_result.stdout) ~= "table" or #remote_result.stdout == 0 then
if #remote_result.stderr > 0 then
logger.error("%s", remote_result.stderr[1])
else
logger.error("fatal: git repository has no remote")
end
return nil
end

if #remotes == 1 then
return remotes[1]
if #remote_result.stdout == 1 then
return remote_result.stdout[1]
end

-- origin/linrongbin16/add-rule2
local upstream_branch = get_rev_name("@{u}")
if not upstream_branch then
--- @type JobResult
local upstream_branch_result = get_rev_name("@{u}")
if not has_output(upstream_branch_result) then
if #upstream_branch_result.stderr > 0 then
logger.error("%s", upstream_branch_result.stderr[1])
else
logger.error("fatal: git branch has no remote")
end
return nil
end

--- @type string
local upstream_branch = upstream_branch_result.stdout[1]
-- origin
--- @type string
local remote_from_upstream_branch =
upstream_branch:match("^(" .. allowed_chars .. ")%/")
upstream_branch:match("^(" .. UpstreamBranchAllowedChars .. ")%/")

if not remote_from_upstream_branch then
logger.error(
"Error! Cannot parse remote name from remote branch '%s'",
"fatal: cannot parse remote name from remote branch '%s'",
upstream_branch
)
return nil
end

local remotes = remote_result.stdout
for _, remote in ipairs(remotes) do
if remote_from_upstream_branch == remote then
return remote
end
end

logger.error(
"Error! Parsed remote '%s' from remote branch '%s' is not a valid remote",
"fatal: parsed remote '%s' from remote branch '%s' is not a valid remote",
remote_from_upstream_branch,
upstream_branch
)
Expand Down
9 changes: 2 additions & 7 deletions lua/gitlinker/logger.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,7 @@ local function log(level, msg)
if Config.console then
vim.cmd("echohl " .. EchoHl[level])
for _, line in ipairs(msg_lines) do
vim.cmd(
string.format(
'echom "%s"',
vim.fn.escape(string.format("gitlinker: %s", line), '"')
)
)
vim.cmd(string.format('echom "%s"', vim.fn.escape(line, '"')))
end
vim.cmd("echohl None")
end
Expand All @@ -43,7 +38,7 @@ local function log(level, msg)
for _, line in ipairs(msg_lines) do
fp:write(
string.format(
"gitlinker: %s [%s] - %s\n",
"%s [%s] - %s\n",
os.date("%Y-%m-%d %H:%M:%S"),
level,
line
Expand Down