GitPrompt.ps1
# Inspired by Mark Embling # http://www.markembling.info/view/my-ideal-powershell-prompt-with-git-integration $global:GitPromptSettings = New-Object PSObject -Property @{ DefaultForegroundColor = $Host.UI.RawUI.ForegroundColor BeforeText = ' [' BeforeForegroundColor = [ConsoleColor]::Yellow BeforeBackgroundColor = $Host.UI.RawUI.BackgroundColor DelimText = ' |' DelimForegroundColor = [ConsoleColor]::Yellow DelimBackgroundColor = $Host.UI.RawUI.BackgroundColor AfterText = ']' AfterForegroundColor = [ConsoleColor]::Yellow AfterBackgroundColor = $Host.UI.RawUI.BackgroundColor BranchForegroundColor = [ConsoleColor]::Cyan BranchBackgroundColor = $Host.UI.RawUI.BackgroundColor BranchAheadForegroundColor = [ConsoleColor]::Green BranchAheadBackgroundColor = $Host.UI.RawUI.BackgroundColor BranchBehindForegroundColor = [ConsoleColor]::Red BranchBehindBackgroundColor = $Host.UI.RawUI.BackgroundColor BranchBehindAndAheadForegroundColor = [ConsoleColor]::Yellow BranchBehindAndAheadBackgroundColor = $Host.UI.RawUI.BackgroundColor BeforeIndexText = "" BeforeIndexForegroundColor= [ConsoleColor]::DarkGreen BeforeIndexForegroundBrightColor= [ConsoleColor]::Green BeforeIndexBackgroundColor= $Host.UI.RawUI.BackgroundColor IndexForegroundColor = [ConsoleColor]::DarkGreen IndexForegroundBrightColor= [ConsoleColor]::Green IndexBackgroundColor = $Host.UI.RawUI.BackgroundColor WorkingForegroundColor = [ConsoleColor]::DarkRed WorkingForegroundBrightColor = [ConsoleColor]::Red WorkingBackgroundColor = $Host.UI.RawUI.BackgroundColor UntrackedText = ' !' UntrackedForegroundColor = [ConsoleColor]::DarkRed UntrackedForegroundBrightColor = [ConsoleColor]::Red UntrackedBackgroundColor = $Host.UI.RawUI.BackgroundColor ShowStatusWhenZero = $true AutoRefreshIndex = $true EnablePromptStatus = !$Global:GitMissing EnableFileStatus = $true RepositoriesInWhichToDisableFileStatus = @( ) # Array of repository paths DescribeStyle = '' EnableWindowTitle = 'posh~git ~ ' Debug = $false BranchNameLimit = 0 TruncatedBranchSuffix = '...' } $currentUser = [Security.Principal.WindowsPrincipal]([Security.Principal.WindowsIdentity]::GetCurrent()) $isAdminProcess = $currentUser.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $adminHeader = if ($isAdminProcess) { 'Administrator: ' } else { '' } $WindowTitleSupported = $true if (Get-Module NuGet) { $WindowTitleSupported = $false } function Write-Prompt($Object, $ForegroundColor, $BackgroundColor = -1) { if ($BackgroundColor -lt 0) { Write-Host $Object -NoNewLine -ForegroundColor $ForegroundColor } else { Write-Host $Object -NoNewLine -ForegroundColor $ForegroundColor -BackgroundColor $BackgroundColor } } function Format-BranchName($branchName){ $s = $global:GitPromptSettings if($s.BranchNameLimit -gt 0 -and $branchName.Length -gt $s.BranchNameLimit) { $branchName = "{0}{1}" -f $branchName.Substring(0,$s.BranchNameLimit), $s.TruncatedBranchSuffix } return $branchName } function Write-GitStatus($status) { $s = $global:GitPromptSettings if ($status -and $s) { Write-Prompt $s.BeforeText -BackgroundColor $s.BeforeBackgroundColor -ForegroundColor $s.BeforeForegroundColor $branchBackgroundColor = $s.BranchBackgroundColor $branchForegroundColor = $s.BranchForegroundColor if ($status.BehindBy -gt 0 -and $status.AheadBy -gt 0) { # We are behind and ahead of remote $branchBackgroundColor = $s.BranchBehindAndAheadBackgroundColor $branchForegroundColor = $s.BranchBehindAndAheadForegroundColor } elseif ($status.BehindBy -gt 0) { # We are behind remote $branchBackgroundColor = $s.BranchBehindBackgroundColor $branchForegroundColor = $s.BranchBehindForegroundColor } elseif ($status.AheadBy -gt 0) { # We are ahead of remote $branchBackgroundColor = $s.BranchAheadBackgroundColor $branchForegroundColor = $s.BranchAheadForegroundColor } Write-Prompt (Format-BranchName($status.Branch)) -BackgroundColor $branchBackgroundColor -ForegroundColor $branchForegroundColor if($s.EnableFileStatus -and $status.HasIndex) { Write-Prompt $s.BeforeIndexText -BackgroundColor $s.BeforeIndexBackgroundColor -ForegroundColor $s.BeforeIndexForegroundColor if($s.ShowStatusWhenZero -or $status.Index.Added) { Write-Prompt " +$($status.Index.Added.Count)" -BackgroundColor $s.IndexBackgroundColor -ForegroundColor $s.IndexForegroundColor } if($s.ShowStatusWhenZero -or $status.Index.Modified) { Write-Prompt " ~$($status.Index.Modified.Count)" -BackgroundColor $s.IndexBackgroundColor -ForegroundColor $s.IndexForegroundColor } if($s.ShowStatusWhenZero -or $status.Index.Deleted) { Write-Prompt " -$($status.Index.Deleted.Count)" -BackgroundColor $s.IndexBackgroundColor -ForegroundColor $s.IndexForegroundColor } if ($status.Index.Unmerged) { Write-Prompt " !$($status.Index.Unmerged.Count)" -BackgroundColor $s.IndexBackgroundColor -ForegroundColor $s.IndexForegroundColor } if($status.HasWorking) { Write-Prompt $s.DelimText -BackgroundColor $s.DelimBackgroundColor -ForegroundColor $s.DelimForegroundColor } } if($s.EnableFileStatus -and $status.HasWorking) { if($s.ShowStatusWhenZero -or $status.Working.Added) { Write-Prompt " +$($status.Working.Added.Count)" -BackgroundColor $s.WorkingBackgroundColor -ForegroundColor $s.WorkingForegroundColor } if($s.ShowStatusWhenZero -or $status.Working.Modified) { Write-Prompt " ~$($status.Working.Modified.Count)" -BackgroundColor $s.WorkingBackgroundColor -ForegroundColor $s.WorkingForegroundColor } if($s.ShowStatusWhenZero -or $status.Working.Deleted) { Write-Prompt " -$($status.Working.Deleted.Count)" -BackgroundColor $s.WorkingBackgroundColor -ForegroundColor $s.WorkingForegroundColor } if ($status.Working.Unmerged) { Write-Prompt " !$($status.Working.Unmerged.Count)" -BackgroundColor $s.WorkingBackgroundColor -ForegroundColor $s.WorkingForegroundColor } } if ($status.HasUntracked) { Write-Prompt $s.UntrackedText -BackgroundColor $s.UntrackedBackgroundColor -ForegroundColor $s.UntrackedForegroundColor } Write-Prompt $s.AfterText -BackgroundColor $s.AfterBackgroundColor -ForegroundColor $s.AfterForegroundColor if ($WindowTitleSupported -and $s.EnableWindowTitle) { if( -not $Global:PreviousWindowTitle ) { $Global:PreviousWindowTitle = $Host.UI.RawUI.WindowTitle } $repoName = Split-Path -Leaf (Split-Path $status.GitDir) $prefix = if ($s.EnableWindowTitle -is [string]) { $s.EnableWindowTitle } else { '' } $Host.UI.RawUI.WindowTitle = "$script:adminHeader$prefix$repoName [$($status.Branch)]" } } elseif ( $Global:PreviousWindowTitle ) { $Host.UI.RawUI.WindowTitle = $Global:PreviousWindowTitle } } if(!(Test-Path Variable:Global:VcsPromptStatuses)) { $Global:VcsPromptStatuses = @() } $s = $global:GitPromptSettings # Override some of the normal colors if the background color is set to the default DarkMagenta. if ($Host.UI.RawUI.BackgroundColor -eq [ConsoleColor]::DarkMagenta) { $s.BeforeIndexForegroundColor = $s.BeforeIndexForegroundBrightColor $s.IndexForegroundColor = $s.IndexForegroundBrightColor $s.UntrackedForegroundColor = $s.UntrackedForegroundBrightColor $s.WorkingForegroundColor = $s.WorkingForegroundBrightColor } function Global:Write-VcsStatus { $Global:VcsPromptStatuses | foreach { & $_ } } # Add scriptblock that will execute for Write-VcsStatus $PoshGitVcsPrompt = { $Global:GitStatus = Get-GitStatus Write-GitStatus $GitStatus } $Global:VcsPromptStatuses += $PoshGitVcsPrompt $ExecutionContext.SessionState.Module.OnRemove = { $Global:VcsPromptStatuses = $Global:VcsPromptStatuses | ? { $_ -ne $PoshGitVcsPrompt} } |