mirror of
				https://github.com/cmderdev/cmder.git
				synced 2025-10-31 17:32:27 +08:00 
			
		
		
		
	
							
								
								
									
										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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user