mirror of
https://github.com/cmderdev/cmder.git
synced 2024-11-15 00:09:11 +08:00
commit
845720e25a
123
vendor/clink.lua
vendored
123
vendor/clink.lua
vendored
@ -3,7 +3,12 @@
|
|||||||
-- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
|
-- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
|
||||||
-- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts
|
-- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts
|
||||||
|
|
||||||
-- luacheck: globals clink
|
-- luacheck: globals CMDER_SESSION
|
||||||
|
-- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color
|
||||||
|
-- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost
|
||||||
|
-- luacheck: globals prompt_singleLine prompt_includeVersionControl
|
||||||
|
-- luacheck: globals prompt_overrideGitStatusOptIn prompt_overrideSvnStatusOptIn
|
||||||
|
-- luacheck: globals clink io.popenyield os.isdir settings.get
|
||||||
|
|
||||||
-- At first, load the original clink.lua file
|
-- At first, load the original clink.lua file
|
||||||
-- this is needed as we set the script path to this dir and therefore the original
|
-- this is needed as we set the script path to this dir and therefore the original
|
||||||
@ -151,12 +156,12 @@ local function set_prompt_filter()
|
|||||||
cwd = string.gsub(cwd, clink.get_env("HOME"), prompt_homeSymbol)
|
cwd = string.gsub(cwd, clink.get_env("HOME"), prompt_homeSymbol)
|
||||||
end
|
end
|
||||||
|
|
||||||
uah = ''
|
local uah = ''
|
||||||
if prompt_useUserAtHost then
|
if prompt_useUserAtHost then
|
||||||
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
|
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
|
||||||
end
|
end
|
||||||
|
|
||||||
cr = "\n"
|
local cr = "\n"
|
||||||
if prompt_singleLine then
|
if prompt_singleLine then
|
||||||
cr = ' '
|
cr = ' '
|
||||||
end
|
end
|
||||||
@ -170,7 +175,7 @@ local function set_prompt_filter()
|
|||||||
|
|
||||||
local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
|
local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
|
||||||
|
|
||||||
prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
|
local prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
|
||||||
prompt = string.gsub(prompt, "{uah}", uah)
|
prompt = string.gsub(prompt, "{uah}", uah)
|
||||||
prompt = string.gsub(prompt, "{cwd}", cwd)
|
prompt = string.gsub(prompt, "{cwd}", cwd)
|
||||||
prompt = string.gsub(prompt, "{env}", env)
|
prompt = string.gsub(prompt, "{env}", env)
|
||||||
@ -191,7 +196,7 @@ end
|
|||||||
local function get_dir_contains(path, dirname)
|
local function get_dir_contains(path, dirname)
|
||||||
|
|
||||||
-- return parent path for specified entry (either file or directory)
|
-- return parent path for specified entry (either file or directory)
|
||||||
local function pathname(path)
|
local function pathname(path) -- luacheck: ignore 432
|
||||||
local prefix = ""
|
local prefix = ""
|
||||||
local i = path:find("[\\/:][^\\/:]*$")
|
local i = path:find("[\\/:][^\\/:]*$")
|
||||||
if i then
|
if i then
|
||||||
@ -201,14 +206,14 @@ local function get_dir_contains(path, dirname)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Navigates up one level
|
-- Navigates up one level
|
||||||
local function up_one_level(path)
|
local function up_one_level(path) -- luacheck: ignore 432
|
||||||
if path == nil then path = '.' end
|
if path == nil then path = '.' end
|
||||||
if path == '.' then path = clink.get_cwd() end
|
if path == '.' then path = clink.get_cwd() end
|
||||||
return pathname(path)
|
return pathname(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Checks if provided directory contains git directory
|
-- Checks if provided directory contains git directory
|
||||||
local function has_specified_dir(path, specified_dir)
|
local function has_specified_dir(path, specified_dir) -- luacheck: ignore 432
|
||||||
if path == nil then path = '.' end
|
if path == nil then path = '.' end
|
||||||
local found_dirs = clink.find_dirs(path..'/'..specified_dir)
|
local found_dirs = clink.find_dirs(path..'/'..specified_dir)
|
||||||
if #found_dirs > 0 then return true end
|
if #found_dirs > 0 then return true end
|
||||||
@ -236,7 +241,7 @@ end
|
|||||||
local function get_git_dir(path)
|
local function get_git_dir(path)
|
||||||
|
|
||||||
-- return parent path for specified entry (either file or directory)
|
-- return parent path for specified entry (either file or directory)
|
||||||
local function pathname(path)
|
local function pathname(path) -- luacheck: ignore 432
|
||||||
local prefix = ""
|
local prefix = ""
|
||||||
local i = path:find("[\\/:][^\\/:]*$")
|
local i = path:find("[\\/:][^\\/:]*$")
|
||||||
if i then
|
if i then
|
||||||
@ -255,7 +260,8 @@ local function get_git_dir(path)
|
|||||||
local gitfile = io.open(dir..'/.git')
|
local gitfile = io.open(dir..'/.git')
|
||||||
if not gitfile then return false end
|
if not gitfile then return false end
|
||||||
|
|
||||||
local git_dir = gitfile:read():match('gitdir: (.*)')
|
local line = gitfile:read() or ''
|
||||||
|
local git_dir = line:match('gitdir: (.*)')
|
||||||
gitfile:close()
|
gitfile:close()
|
||||||
|
|
||||||
if os.isdir then -- only available in Clink v1.0.0 and higher
|
if os.isdir then -- only available in Clink v1.0.0 and higher
|
||||||
@ -303,6 +309,9 @@ local function get_git_branch(git_dir)
|
|||||||
local HEAD = head_file:read()
|
local HEAD = head_file:read()
|
||||||
head_file:close()
|
head_file:close()
|
||||||
|
|
||||||
|
-- If HEAD is missing, something is wrong.
|
||||||
|
if not HEAD then return end
|
||||||
|
|
||||||
-- if HEAD matches branch expression, then we're on named branch
|
-- if HEAD matches branch expression, then we're on named branch
|
||||||
-- otherwise it is a detached commit
|
-- otherwise it is a detached commit
|
||||||
local branch_name = HEAD:match('ref: refs/heads/(.+)')
|
local branch_name = HEAD:match('ref: refs/heads/(.+)')
|
||||||
@ -322,6 +331,9 @@ local function get_hg_branch()
|
|||||||
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
|
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
|
||||||
local cmd = "hg branch 2>nul"
|
local cmd = "hg branch 2>nul"
|
||||||
local file = io.popen(cmd)
|
local file = io.popen(cmd)
|
||||||
|
if not file then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
for line in file:lines() do
|
for line in file:lines() do
|
||||||
local m = line:match("(.+)$")
|
local m = line:match("(.+)$")
|
||||||
@ -339,8 +351,12 @@ end
|
|||||||
-- Find out current branch
|
-- Find out current branch
|
||||||
-- @return {false|svn branch name}
|
-- @return {false|svn branch name}
|
||||||
---
|
---
|
||||||
local function get_svn_branch(svn_dir)
|
local function get_svn_branch()
|
||||||
local file = io_popenyield("svn info 2>nul")
|
local file = io_popenyield("svn info 2>nul")
|
||||||
|
if not file then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
for line in file:lines() do
|
for line in file:lines() do
|
||||||
local m = line:match("^Relative URL:")
|
local m = line:match("^Relative URL:")
|
||||||
if m then
|
if m then
|
||||||
@ -359,12 +375,16 @@ end
|
|||||||
---
|
---
|
||||||
local function get_git_status()
|
local function get_git_status()
|
||||||
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
||||||
|
if not file then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
local conflict_found = false
|
local conflict_found = false
|
||||||
local is_status = true
|
local is_status = true
|
||||||
for line in file:lines() do
|
for line in file:lines() do
|
||||||
local code = line:sub(1, 2)
|
local code = line:sub(1, 2)
|
||||||
-- print (string.format("code: %s, line: %s", code, line))
|
-- print (string.format("code: %s, line: %s", code, line))
|
||||||
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then
|
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then -- luacheck: no max line length
|
||||||
is_status = false
|
is_status = false
|
||||||
conflict_found = true
|
conflict_found = true
|
||||||
break
|
break
|
||||||
@ -374,38 +394,27 @@ local function get_git_status()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
file:close()
|
file:close()
|
||||||
|
|
||||||
return { status = is_status, conflict = conflict_found }
|
return { status = is_status, conflict = conflict_found }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
-- Get the status of working dir
|
|
||||||
-- @return {bool}
|
|
||||||
---
|
|
||||||
local function get_hg_status()
|
|
||||||
local file = io.popen("hg status -0")
|
|
||||||
for line in file:lines() do
|
|
||||||
file:close()
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
file:close()
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
---
|
---
|
||||||
-- Get the status of working dir
|
-- Get the status of working dir
|
||||||
-- @return {bool}
|
-- @return {bool}
|
||||||
---
|
---
|
||||||
local function get_svn_status()
|
local function get_svn_status()
|
||||||
local file = io_popenyield("svn status -q")
|
local file = io_popenyield("svn status -q")
|
||||||
for line in file:lines() do
|
if not file then
|
||||||
|
return { error = true }
|
||||||
|
end
|
||||||
|
|
||||||
|
for line in file:lines() do -- luacheck: ignore 512, no unused
|
||||||
file:close()
|
file:close()
|
||||||
return false
|
return { clean = false }
|
||||||
end
|
end
|
||||||
file:close()
|
file:close()
|
||||||
|
|
||||||
return true
|
return { clean = true }
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -433,24 +442,28 @@ local function get_git_status_setting()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local gitStatusConfig = io_popenyield("git --no-pager config cmder.status 2>nul")
|
local gitStatusConfig = io_popenyield("git --no-pager config cmder.status 2>nul")
|
||||||
for line in gitStatusConfig:lines() do
|
if gitStatusConfig then
|
||||||
if string.match(line, 'false') then
|
for line in gitStatusConfig:lines() do
|
||||||
gitStatusConfig:close()
|
if string.match(line, 'false') then
|
||||||
last_git_status_setting = false
|
gitStatusConfig:close()
|
||||||
return false
|
last_git_status_setting = false
|
||||||
|
return false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
gitStatusConfig:close()
|
||||||
end
|
end
|
||||||
gitStatusConfig:close()
|
|
||||||
|
|
||||||
local gitCmdStatusConfig = io_popenyield("git --no-pager config cmder.cmdstatus 2>nul")
|
local gitCmdStatusConfig = io_popenyield("git --no-pager config cmder.cmdstatus 2>nul")
|
||||||
for line in gitCmdStatusConfig:lines() do
|
if gitCmdStatusConfig then
|
||||||
if string.match(line, 'false') then
|
for line in gitCmdStatusConfig:lines() do
|
||||||
gitCmdStatusConfig:close()
|
if string.match(line, 'false') then
|
||||||
last_git_status_setting = false
|
gitCmdStatusConfig:close()
|
||||||
return false
|
last_git_status_setting = false
|
||||||
|
return false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
gitCmdStatusConfig:close()
|
||||||
end
|
end
|
||||||
gitCmdStatusConfig:close()
|
|
||||||
|
|
||||||
last_git_status_setting = true
|
last_git_status_setting = true
|
||||||
return true
|
return true
|
||||||
@ -536,8 +549,6 @@ local function hg_prompt_filter()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
local result = ""
|
|
||||||
|
|
||||||
local hg_dir = get_hg_dir()
|
local hg_dir = get_hg_dir()
|
||||||
if hg_dir then
|
if hg_dir then
|
||||||
-- Colors for mercurial status
|
-- Colors for mercurial status
|
||||||
@ -559,16 +570,20 @@ local function hg_prompt_filter()
|
|||||||
local color = colors.clean
|
local color = colors.clean
|
||||||
|
|
||||||
local pipe = io.popen("hg status -amrd 2>&1")
|
local pipe = io.popen("hg status -amrd 2>&1")
|
||||||
local output = pipe:read('*all')
|
if pipe then
|
||||||
local rc = { pipe:close() }
|
output = pipe:read('*all')
|
||||||
|
pipe:close()
|
||||||
|
if output ~= nil and output ~= "" then color = colors.dirty end
|
||||||
|
end
|
||||||
|
|
||||||
if output ~= nil and output ~= "" then color = colors.dirty end
|
local result = color .. "(" .. branch .. ")"
|
||||||
result = color .. "(" .. branch .. ")"
|
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", " "..verbatim(result))
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", " "..verbatim(result))
|
-- No hg present or not in hg repo
|
||||||
return false
|
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function svn_prompt_filter()
|
local function svn_prompt_filter()
|
||||||
@ -589,7 +604,6 @@ local function svn_prompt_filter()
|
|||||||
if svn_dir then
|
if svn_dir then
|
||||||
-- if we're inside of svn repo then try to detect current branch
|
-- if we're inside of svn repo then try to detect current branch
|
||||||
local branch = get_svn_branch()
|
local branch = get_svn_branch()
|
||||||
local color
|
|
||||||
if branch then
|
if branch then
|
||||||
-- If in a different repo or branch than last time, discard cached info
|
-- If in a different repo or branch than last time, discard cached info
|
||||||
if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then
|
if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then
|
||||||
@ -599,7 +613,7 @@ local function svn_prompt_filter()
|
|||||||
end
|
end
|
||||||
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
|
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
|
||||||
local svnStatus
|
local svnStatus
|
||||||
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then
|
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then -- luacheck: no max line length
|
||||||
svnStatus = clink_promptcoroutine(function ()
|
svnStatus = clink_promptcoroutine(function ()
|
||||||
return get_svn_status()
|
return get_svn_status()
|
||||||
end)
|
end)
|
||||||
@ -613,9 +627,10 @@ local function svn_prompt_filter()
|
|||||||
svnStatus = get_svn_status()
|
svnStatus = get_svn_status()
|
||||||
end
|
end
|
||||||
|
|
||||||
if svnStatus == nil then
|
local color
|
||||||
|
if not svnStatus or svnStatus.error then
|
||||||
color = colors.nostatus
|
color = colors.nostatus
|
||||||
elseif svnStatus then
|
elseif svnStatus.clean then
|
||||||
color = colors.clean
|
color = colors.clean
|
||||||
else
|
else
|
||||||
color = colors.dirty
|
color = colors.dirty
|
||||||
|
Loading…
Reference in New Issue
Block a user