utils.ps1

<#
.SYNOPSIS
    Get current git branch.
#>

function Get-Git-CurrentBranch {
    git symbolic-ref --quiet HEAD *> $null

    if ($LASTEXITCODE -eq 0) {
        return git rev-parse --abbrev-ref HEAD
    } else {
        return
    }
}

function Get-Git-MainBranch {
    git rev-parse --git-dir *> $null

    if ($LASTEXITCODE -ne 0) {
        return
    }

    $branches = @('main', 'trunk')

    foreach ($branch in $branches) {
        & git show-ref -q --verify refs/heads/$branch

        if ($LASTEXITCODE -eq 0) {
            return $branch
        }
    }

    return 'master'
}

# Don't add `Remove-Alias` on PowerShell >= 6.
# PowerShell >= 6 already has built-in `Remove-Alias`.
# Let use built-in `Remove-Alias` on PowerShell >= 6.
if ($PSVersionTable.PSVersion.Major -le 5) {
    function Remove-Alias ([string] $AliasName) {
        while (Test-Path Alias:$AliasName) {
            Remove-Item Alias:$AliasName -Force 2> $null
        }
    }
}

function Format-AliasDefinition {
    param (
        [Parameter(Mandatory = $true)][string] $Definition
    )

    $definitionLines = $Definition.Trim() -split "`n" | ForEach-Object {
        $line = $_.TrimEnd()

        # Trim 1 indent
        if ($_ -match "^`t") {
            return $line.Substring(1)
        }
        elseif ($_ -match '^ ') {
            return $line.Substring(4)
        }

        return $line

    }

    return $definitionLines -join "`n"
}

<#
.SYNOPSIS
    Get git aliases' definition.
.DESCRIPTION
    Get definition of all git aliases or specific alias.
.EXAMPLE
    PS C:\> Get-Git-Aliases
    Get definition of all git aliases.
.EXAMPLE
    PS C:\> Get-Git-Aliases -Alias gst
    Get definition of `gst` alias.
#>

function Get-Git-Aliases ([string] $Alias) {
    $esc = [char] 27
    $green = 32
    $magenta = 35

    $Alias = $Alias.Trim()
    $blacklist = @(
        'Get-Git-CurrentBranch',
        'Remove-Alias',
        'Format-AliasDefinition',
        'Get-Git-Aliases'
    )
    $aliases = Get-Command -Module git-aliases | Where-Object { $_ -notin $blacklist }

    if (-not ([string]::IsNullOrEmpty($Alias))) {
        $foundAliases = $aliases | Where-Object -Property Name -Value $Alias -EQ

        if ($foundAliases -is [array]) {
            return Format-AliasDefinition($foundAliases[0].Definition)
        }
        else {
            return Format-AliasDefinition($foundAliases.Definition)
        }
    }

    $aliases = $aliases | ForEach-Object {
        $name = $_.Name
        $definition = Format-AliasDefinition($_.Definition)
        $definition = "$definition`n" # Add 1 line break for some row space

        return [PSCustomObject]@{
            Name       = $name
            Definition = $definition
        }
    }

    $cols = @(
        @{
            Name       = 'Name'
            Expression = {
                # Print alias name in green
                "$esc[$($green)m$($_.Name)$esc[0m"
            }
        },
        @{
            Name       = 'Definition'
            Expression = {
                # Print alias definition in yellow
                "$esc[$($magenta)m$($_.Definition)$esc[0m"
            }
        }
    )

    return Format-Table -InputObject $aliases -AutoSize -Wrap -Property $cols
}