Last active
March 19, 2024 01:39
-
-
Save Linhieng/70f9cff681d4c597dab8afa4a2053fb1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# 负责打印 git 分支相关信息 | |
支持输出以下信息: | |
当前分支,或者是 hash 值 | |
当前目录是否为 git 子目录 | |
当前是否有提交历史 | |
#> | |
function write_host_git_branch { | |
# 在这里,能确保是一个 git 仓库,或者是一个 git 仓库中的子目录 | |
# 获取当前 HEAD 所在分支名。如果当前是 detached HEAD 状态,则显示为 hash。 | |
$git_branch = git symbolic-ref --short --quiet HEAD | |
Write-Host "(" -ForegroundColor "DarkGray" -NoNewline | |
if ( $null -eq $git_branch ) { | |
$hash = git rev-parse --short HEAD | |
Write-Host $hash -ForegroundColor "red" -NoNewline | |
} else { | |
Write-Host $git_branch -ForegroundColor "blue" -NoNewline | |
} | |
Write-Host ") " -ForegroundColor "DarkGray" -NoNewline | |
if ( | |
# 如果当前目录没有 .git 文件夹,说明当前是在 git 仓库的子目录 | |
$false -eq (Test-Path .git) | |
) { | |
Write-Host "sub " -ForegroundColor "DarkGray" -NoNewline | |
} | |
$git_log = git log 2>&1 | |
if ( | |
# 命令执行失败 | |
$? -eq $false | |
) { | |
write_host_not_commits($git_log) | |
} | |
$tags = git tag --points-at HEAD | |
if ( | |
$null -ne $tags | |
) { | |
$tags_one_line = ($tags -split '\r?\n') -join ', ' | |
Write-Host "[" -ForegroundColor "DarkGray" -NoNewline | |
Write-Host "$tags_one_line" -ForegroundColor "DarkYellow" -NoNewline | |
Write-Host "] " -ForegroundColor "DarkGray" -NoNewline | |
} | |
# 打印子模块相关信息会有性能问题 | |
# $submodule = git submodule status 2>&1 | |
} | |
function write_host_not_commits($git_log) { | |
$error_message = ($git_log.Exception.Message | Select-Object -First 1).Trim() | |
if ( | |
$true -eq $error_message.EndsWith("does not have any commits yet") | |
) { | |
Write-Host "not commits yet" -ForegroundColor "red" -NoNewline | |
} else { | |
Write-Host "❌fatal: $error_message" -ForegroundColor "red" -NoNewline | |
} | |
return | |
} | |
function wirte_host_git_wrong($git_output) { | |
# 转换为字符串对象,并只获取第一行的内容 | |
$error_message = ($git_output.Exception.Message | Select-Object -First 1).Trim() | |
# 检查输出是否以指定的前缀开头 | |
if ( | |
# 空(非 git 仓库) | |
$true -eq $error_message.StartsWith("fatal: not a git repository") | |
) { | |
Write-Host "" -NoNewline | |
} elseif ( | |
# 不安全的仓库 | |
$true -eq $error_message.StartsWith("fatal: detected dubious ownership") | |
) { | |
Write-Host "❌fatal: detected dubious ownership" -ForegroundColor "red" -NoNewline | |
} else { | |
Write-Host "❌fatal: $error_message" -ForegroundColor "red" -NoNewline | |
} | |
} | |
function write_host_git_info { | |
# 执行 Git 命令并捕获输出。 2>&1 表示将 stderr 重定向到 stdout, 以将错误信息保存在 $git_output 变量中 | |
$git_output = git rev-parse --is-inside-work-tree 2>&1 | |
if ( | |
# 前一个命令执行失败 | |
$? -eq $false | |
) { | |
wirte_host_git_wrong($git_output) | |
return | |
} | |
write_host_git_branch | |
} | |
# 判断当前是否是管理员 | |
function has_admin_power { | |
$identity = [Security.Principal.WindowsIdentity]::GetCurrent() | |
$principal = [Security.Principal.WindowsPrincipal] $identity | |
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator | |
return $principal.IsInRole($adminRole) | |
} | |
function __prompt { | |
# 空格原则:输出内容时,不需要考虑给前面留空,只需要考虑给后面留空 | |
$pwsh_version = "PS$($Host.version.Major) " | |
$fullpath = "$($executionContext.SessionState.Path.CurrentLocation)" | |
Write-Host "`n$pwsh_version" -NoNewline | |
Write-Host "$fullpath " -NoNewline -ForegroundColor "green" | |
write_host_git_info | |
if (has_admin_power) { | |
return "`n# " | |
} else { | |
return "`n$ " | |
} | |
} | |
# 主入口 | |
function prompt { | |
# 编写的代码可能报错 | |
try { | |
__prompt | |
return | |
} catch { | |
# 输出报错信息 | |
Write-Host "powershell script error occurred: $_" -NoNewline -ForegroundColor "red" | |
} | |
return "`nPS> " | |
} | |
# 解决终端的中文乱码问题。注意,chcp 无效! | |
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding | |
# 设置 UpArrow 快捷方式为向前搜索 | |
Set-PSReadLineKeyHandler -Key UpArrow -ScriptBlock { | |
[Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward() | |
[Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine() | |
} # 设置向上键为后向搜索历史记录 | |
# 设置 DownArrow 快捷方式为向后搜索 | |
Set-PSReadLineKeyHandler -Key DownArrow -ScriptBlock { | |
[Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward() | |
[Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment