Extensions/Git.Checkout.UGit.Extension.ps1

<#
.SYNOPSIS
    git checkout extension
.DESCRIPTION
    Outputs git checkout as objects.
.EXAMPLE
    git checkout -b CreateNewBranch
.EXAMPLE
    git checkout main
#>

[Management.Automation.Cmdlet('Out', 'Git')]
[ValidatePattern('^git checkout')]
param()

begin {
    $gitCheckoutLines = @()
    $switchedToNewBranch = "^Switched to a new branch '(?<b>[^']+)'"
}

process {
    $gitCheckoutLines += $gitOut
}

end {

    
    if ($($gitCheckoutLines) -match $switchedToNewBranch) {        
        foreach ($line in $gitCheckoutLines) {
            if ($line -match $switchedToNewBranch) {
                [PSCustomObject]@{
                    BranchName = $matches.b
                    PSTypeName = 'git.checkout.newbranch'
                    GitRoot    = $GitRoot
                }        
                break
            }
        }        
    }
    elseif ($gitCheckoutLines -match "Switched to branch '(?<b>[^']+)'")
    {
        $gitCheckoutInfo = @{PSTypeName='git.checkout.switchbranch';GitRoot=$GitRoot;GitOutputLines=$gitCheckoutLines;Modified=@()}
        foreach ($checkoutLine in $gitCheckoutLines) {
            if ($checkoutLine -match "Switched to branch '(?<b>[^']+)'") {
                $gitCheckoutInfo.BranchName = $matches.b
            }
            elseif ($checkoutLine -match '^Your branch') {
                $gitCheckoutInfo.Status = $checkoutLine
            }
            elseif ($checkoutLine -match '^(?<ct>\w)\s+(?<fn>\S+)') {
                if ($matches.ct -eq 'M') {
                    $gitCheckoutInfo.modified += (Get-Item $matches.fn -ErrorAction SilentlyContinue)
                }
            }
        }
        [PSCustomObject]$gitCheckoutInfo
    }
    elseif ($gitCheckoutLines -match "Already on '(?<b>[^']+)'") {
        $gitCheckoutInfo = @{PSTypeName='git.checkout.alreadyonbranch';GitRoot=$GitRoot;GitOutputLines=$gitCheckoutLines}
        foreach ($checkoutLine in $gitCheckoutLines) {
            if ($checkoutLine -match "Already on '(?<b>[^']+)'") {
                $gitCheckoutInfo.BranchName = $matches.b
            }
            elseif ($checkoutLine -match '^Your branch') {
                $gitCheckoutInfo.Status = $checkoutLine
            }
        }
        [PSCustomObject]$gitCheckoutInfo
    }
    else {
        $gitCheckoutLines
    }
}