Public/Get-PSUGitRepositoryChanges.ps1

function Get-PSUGitRepositoryChanges {
<#
.SYNOPSIS
    Shows the specific modifications, additions, and deletions made in your Git working directory since the last commit.
 
.DESCRIPTION
    This function gives you a super clear report for every change it finds.
    For each change, it tells you the name of the file or folder.
    It also says what kind of item it is (like a file, a folder, or if it's been removed).
    Then, it explains how it changed – was it modified, added, deleted, or renamed?
    Finally, it gives you the full location of that item, making everything easy to understand.
 
    It is especially useful for automated module building, tagging, changelogs, and version control workflows.
 
.PARAMETER RootPath
    The root path of your Git repository. If not specified, it defaults to the current directory.
 
.OUTPUTS
    [PSCustomObject]
 
.EXAMPLE
    Get-PSUGitRepositoryChanges -RootPath "C:\repos\OMG.PSUtilities"
    [PSCustomObject] containing:
        - Name : Name of the file or folder
        - ItemType : File, Folder, Removed, or Unknown
        - ChangeType : Type of change detected (Modified, Added, Deleted, Renamed, New, etc.)
        - Path : Full path to the changed item
 
.NOTES
    Author: Lakshmanachari Panuganti
    Date : 2025-07-16
#>


    [CmdletBinding()]
    param (
        [string]$RootPath = (Get-Location).Path
    )

    Push-Location $RootPath
    try {
        $gitOutput = git status --porcelain

        $changedItems = foreach ($line in $gitOutput) {
            $line = $line.Trim()

            $changeCode = $line.Split(' ')[0].Trim()
            $path       = $line.Split(' ', 2)[1].Trim() -replace '"'
            $fullPath   = Join-Path -Path $RootPath -ChildPath $path

            $itemInfo = Get-Item $fullPath -ErrorAction SilentlyContinue

            $itemType = if ($changeCode -eq 'D' -or -not $itemInfo) {
                'File/Folder'
            }
            elseif ($itemInfo -is [System.IO.DirectoryInfo]) {
                'Folder'
            }
            elseif ($itemInfo -is [System.IO.FileInfo]) {
                'File'
            }
            else {
                'Unknown'
            }

            [pscustomobject]@{
                Name       = Split-Path $path -Leaf
                ItemType   = $itemType
                ChangeType = switch ($changeCode) {
                    'M'  { 'Modified' }
                    'A'  { 'Added' }
                    'D'  { 'Deleted' }
                    'R'  { 'Renamed' }
                    'C'  { 'Copied ' }
                    'U'  { 'Unmerged' }
                    '??' { 'New' }
                    default { "Other: $changeCode" }
                }
                Path       = $fullPath
            }
        }

        return $changedItems
    }
    Catch {
        Pop-Location
        $PSCmdlet.ThrowTerminatingError($_)
    }
}