Public/Invoke-Gitt.ps1
|
<#
.SYNOPSIS Git helpers entry point mirroring git's subcommand style. .DESCRIPTION Dispatches to GittHelpers module functions using git-style subcommand syntax. Supported subcommands: gitt clone <url> [args] -> Invoke-GitCloneBare gitt init <name> [args] -> Invoke-GitInit gitt worktree add [args] -> New-GitWorktree gitt worktree remove <path> [args] -> Remove-GitWorktree gitt save -Message <msg> [args] -> Save-GitWorktree gitt sync [args] -> Sync-GitBranches gitt prune [args] -> Remove-StaleGitBranches gitt goto <path|branch> [args] -> Enter-GitWorktree .EXAMPLE gitt init myrepo .EXAMPLE gitt init myrepo -RemoteUrl https://github.com/user/myrepo -Worktrees master .EXAMPLE gitt clone https://github.com/org/repo.git .EXAMPLE gitt worktree add -Feature login -Description "Add OAuth" .EXAMPLE gitt worktree remove .\feature\login .EXAMPLE gitt save -Message "Fix null ref" .EXAMPLE gitt sync .EXAMPLE gitt prune -DryRun .EXAMPLE gitt goto main .EXAMPLE gitt goto feature/you/login-page -NewWindow #> function Invoke-Gitt { [CmdletBinding()] param( [Parameter(Mandatory, Position = 0)] [string] $Subcommand, [Parameter(Position = 1, ValueFromRemainingArguments)] [object[]] $Arguments ) switch ($Subcommand.ToLowerInvariant()) { 'clone' { Invoke-GitCloneBare @Arguments } 'init' { $parsed = ConvertTo-ParamHashtable -ArgumentList $Arguments $named = $parsed.Named $pos = $parsed.Positional Invoke-GitInit @named @pos } 'worktree' { if (-not $Arguments -or $Arguments.Count -eq 0) { Write-Error "Usage: gitt worktree <add|remove> [args]" return } $action = $Arguments[0].ToString().ToLowerInvariant() $remaining = if ($Arguments.Count -gt 1) { $Arguments[1..($Arguments.Count - 1)] } else { @() } $parsed = ConvertTo-ParamHashtable -ArgumentList $remaining $named = $parsed.Named $pos = $parsed.Positional switch ($action) { 'add' { New-GitWorktree @named @pos } 'remove' { Remove-GitWorktree @named @pos } default { Write-Error "Unknown worktree action '$action'. Use: add, remove" } } } 'save' { $parsed = ConvertTo-ParamHashtable -ArgumentList $Arguments $named = $parsed.Named $pos = $parsed.Positional Save-GitWorktree @named @pos } 'sync' { Sync-GitBranches @Arguments } 'prune' { Remove-StaleGitBranches @Arguments } 'goto' { $parsed = ConvertTo-ParamHashtable -ArgumentList $Arguments $named = $parsed.Named $pos = $parsed.Positional Enter-GitWorktree @named @pos } 'list' { $worktrees = Get-GitWorktreeStatus foreach ($wt in $worktrees) { $color = if ($wt.IsBare) { 'DarkGray' } elseif ($wt.Changes) { 'Yellow' } else { 'Green' } $status = if ($wt.IsBare) { 'bare' } elseif ($wt.Changes) { "$($wt.Changes) change(s)" } else { 'clean' } Write-Host ("{0,-45} {1}" -f $wt.Branch, $status) -ForegroundColor $color Write-Host (" $($wt.Path)") -ForegroundColor DarkGray } } default { Write-Error "Unknown subcommand '$Subcommand'. Valid subcommands: clone, init, worktree, save, sync, prune, goto, list" } } } Set-Alias -Name gitt -Value Invoke-Gitt |