Skip to content

Commit

Permalink
Merge pull request cmderdev#1834 from b0bh00d/master
Browse files Browse the repository at this point in the history
Refactored the Mercurial prompt code to be more efficient.
  • Loading branch information
Stanzilla committed Sep 13, 2018
2 parents 2cfa7c4 + 0f99f66 commit 35eab7a
Showing 1 changed file with 30 additions and 21 deletions.
51 changes: 30 additions & 21 deletions vendor/clink.lua
Expand Up @@ -285,31 +285,40 @@ end

local function hg_prompt_filter()

-- Colors for mercurial status
local colors = {
clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m",
}

if get_hg_dir() then
-- if we're inside of mercurial repo then try to detect current branch
local branch = get_hg_branch()
local color
if branch then
-- Has branch => therefore it is a mercurial folder, now figure out status
if get_hg_status() then
color = colors.clean
else
color = colors.dirty
local result = ""

local hg_dir = get_hg_dir()
if hg_dir then
-- Colors for mercurial status
local colors = {
clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m",
}

-- 'hg id' gives us BOTH the branch name AND an indicator that there
-- are uncommitted changes, in one fast(er) call
local pipe = io.popen("hg id 2>&1")
local output = pipe:read('*all')
local rc = { pipe:close() }

if output ~= nil and
string.sub(output,1,7) ~= "abort: " and -- not an HG working copy
string.sub(output,1,12) ~= "000000000000" and -- empty wc (needs update)
(not string.find(output, "is not recognized")) then -- 'hg' not in path
local color = colors.clean
-- split elements on space delimiter
local items = {}
for i in string.gmatch(output, "%S+") do
table.insert(items, i)
end

clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", color.."("..branch..")")
return false
-- if the repo hash ends with '+', the wc has uncommitted changes
if string.sub(items[1], -1, -1) == "+" then color = colors.dirty end
-- substitute the branch in directly -- already WITH parentheses. :)
result = color .. items[2] -- string.sub(items[2], 1, string.len(items[2]) - 1)
end
end

-- No mercurial present or not in mercurial file
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", result)
return false
end

Expand Down

0 comments on commit 35eab7a

Please sign in to comment.