Extensions/Git.Mv.UGit.Extension.ps1

<#
.Synopsis
    Git Move Extension
.Description
    Outputs git mv as objects.
.EXAMPLE
    git mv .\OldName.txt .\NewName.txt
.EXAMPLE
    git mv .\OldName.txt .\NewName.txt --verbose
#>

[Management.Automation.Cmdlet("Out","Git")]   # It's an extension for Out-Git
[ValidatePattern("^git mv")]                  # that is run when the switch -o is used.
[OutputType([IO.FileInfo])]
param(   )

begin {
    $moveLines = @()
}

process {
    $moveLines += $gitOut
}

end {
    if ($gitArgument -match '--(?>n|dry-run)') {
        return $moveLines
    }

    # Take all non-dashed arguments to git.
    $cmd,                 # The first is 'mv'
        $source,          # The second is the source
            $dest,        # The third is the detination.
                $null   = # (ignore anything else)
                $gitArgument -notlike '-*'

    if (-not (Test-Path $dest)) { return $moveLines }

    $destItem = Get-Item $dest -ErrorAction SilentlyContinue
    @(if ($destItem -is [IO.DirectoryInfo]) {
        $destItem = Get-Item (Join-Path $destItem $source)
        $destItem
    } elseif ($destItem) {
        $destItem
    } else {
        return $moveLines
    }) |
        Add-Member NoteProperty Source (Join-Path $gitRoot $source) -Force -PassThru |
        Add-Member NoteProperty Destination $destItem.FullName -Force -PassThru |
        Add-Member NoteProperty GitRoot $gitRoot -Force -PassThru |
        Add-Member NoteProperty GitCommand $gitCommand -Force -PassThru
}