Skip to content

Instantly share code, notes, and snippets.

@Linhieng
Last active March 19, 2024 01:39
Show Gist options
  • Save Linhieng/70f9cff681d4c597dab8afa4a2053fb1 to your computer and use it in GitHub Desktop.
Save Linhieng/70f9cff681d4c597dab8afa4a2053fb1 to your computer and use it in GitHub Desktop.
<# 负责打印 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