From 740d35d3e759a986f6856c1f89e6ffcbad32e806 Mon Sep 17 00:00:00 2001 From: Scott Date: Sun, 23 Aug 2026 09:53:33 +1000 Subject: [PATCH] feat(git-provider): Initial Show-GitRepo implementation --- src/ModuleCore/Git/GitManager.cs | 15 +++++++ .../Git/Commands/ShowGitRepoCommand.cs | 45 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/PowershellModule/Git/Commands/ShowGitRepoCommand.cs diff --git a/src/ModuleCore/Git/GitManager.cs b/src/ModuleCore/Git/GitManager.cs index ce03922..702d0e1 100644 --- a/src/ModuleCore/Git/GitManager.cs +++ b/src/ModuleCore/Git/GitManager.cs @@ -57,6 +57,21 @@ public class GitManager { return _registrations.Select(x => new GitReg() { Name = x.Value.Name, Location = x.Value.Location }).ToList(); } + + public string GetRepo(string? registeredName) + { + if (string.IsNullOrEmpty(registeredName)) + { + throw new Exception("Name cannot be null"); + } + + if (_registrations.TryGetValue(registeredName, out var registration)) + { + return registration.Location; + } + + throw new Exception($"No git repo has been registered with the name {registeredName}"); + } } public class GitReg diff --git a/src/PowershellModule/Git/Commands/ShowGitRepoCommand.cs b/src/PowershellModule/Git/Commands/ShowGitRepoCommand.cs new file mode 100644 index 0000000..116062c --- /dev/null +++ b/src/PowershellModule/Git/Commands/ShowGitRepoCommand.cs @@ -0,0 +1,45 @@ +using System; +using System.Management.Automation; +using ModuleCore.Git; + +namespace PowershellModule.Git.Commands; + +[Cmdlet(VerbsCommon.Show, Noun)] +public class ShowGitRepoCommand : PSCmdlet +{ + private const string Noun = "GitRepo"; + + [Parameter( + Position = 0, + ValueFromPipeline = true, + Mandatory = true, + HelpMessage = "Reference name for the repo")] + public string? Name { get; set; } + + [Parameter( + Mandatory = false, + HelpMessage = "Changes directory directly instead of using Set-Location")] + [Alias("NoSetLocation")] + public SwitchParameter NoStack { get; set; } + + protected override void BeginProcessing() + { + var location = GitManager.Instance.GetRepo(Name); + + // By default instead of doing the same as cd, we instead do pushd so a user can popd straight back to where + // they came from. + // TODO: incorporate this into the custom prompt when I develop that + if (!NoStack) + { + // Push the current location to the stack + // TODO: support named stacks. PowerShell *-Location commands support named stacks, but I don't personally + // use them myself so I haven't implemented them initially. I would like to in the future though, but right + // now it's low value to me. + // https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-location?view=powershell-7.6#example-4-set-the-current-location-to-a-named-stack + SessionState.Path.PushCurrentLocation(null); + } + + SessionState.Path.SetLocation(location); + base.BeginProcessing(); + } +} \ No newline at end of file