diff --git a/PowershellModule.slnx b/PowershellModule.slnx index 04cf69b..2f6dd79 100644 --- a/PowershellModule.slnx +++ b/PowershellModule.slnx @@ -1,20 +1,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/GitRepositoryRegistration.md b/docs/GitRepositoryRegistration.md new file mode 100644 index 0000000..83038b7 --- /dev/null +++ b/docs/GitRepositoryRegistration.md @@ -0,0 +1,47 @@ +# Git Repo Registration + +- all commands support `-debug` + +## New-GitRepoRegistration + +`New-GitRepoRegistration [-Name string]` + +Creates a new registration for the current directory, optionally registering against the given name. If `-Name` is not given the folder for the root level of the git repo will be used. + +Name registrations are _not_ case-sensitive, so registrations can be made using different cases for the same location, and multiple registrations can exist for the git repository. + +```pwsh +# Default registration +PS D:/Repos/Project-a> New-GitRepoRegistration -debug +DEBUG: Checking if current directory is a git repository... +DEBUG: ...location is a git repo! +DEBUG: No name given for registration, defaulting to git folder root. +DEBUG: Registered 'D:/Repos/Project-a' to name 'Project-a' + +# Named registration +PS D:/Repos/Project-a> New-GitRepoRegistration "test repo" -debug +DEBUG: Checking if current directory is a git repository... +DEBUG: ...location is a git repo! +DEBUG: Registered 'D:/Repos/Project-a' to name 'test repo' + +PS D:/Repos/Project-a> Get-GitRepoRegistration + +Name Location CurrentBranch +---- -------- ------------- +test-repo D:/Repos/Project-a main +Project-a D:/Repos/Project-a main +``` + +If the current directory is not in a git repo, a registration already exists by name or default folder, or if any other issue occurs such as git not being available an error will be thrown. + +## Get-GitRepoRegistration + +`Get-GitRepoRegistration` + +## Show-GitRepoRegistration + +`Show-GitRepoRegistration -Name string [-NoStack|-NoSetLocation]` + +## Remove-GitRepoRegistration + +`Remove-GitRepoRegistration [-Name string]` \ No newline at end of file diff --git a/src/ModuleCore/Git/GitManager.cs b/src/ModuleCore/Git/GitManager.cs index dfeb1f7..f301244 100644 --- a/src/ModuleCore/Git/GitManager.cs +++ b/src/ModuleCore/Git/GitManager.cs @@ -108,6 +108,7 @@ public class GitManager if (_registrations.TryAdd(registrationName, gitRegistration)) { + _debugWriterDelegate?.Invoke($"Registered '{gitRegistration.Location}' to name '{registrationName}'"); return registrationName; } @@ -155,6 +156,7 @@ public class GitManager if (_registrations.TryRemove(registrationName, out var removedItem)) { _debugWriterDelegate?.Invoke($"Removed {registrationName}."); + return; } // Weird error to throw, but by this stage we shouldn't have a git repo registered under this name @@ -195,6 +197,9 @@ public class GitManager /// /// Returns the git root directory for any nested directory if git rev-parse --show-toplevel returns a value. + /// + /// Will always return a non-null value if the directory is a git repo, otherwise an exception will be thrown + /// /// /// Path to check if it or any of its parents contain a git repository /// @@ -235,7 +240,7 @@ public class GitManager // Gotta trim what we get as it might already have a newline character at the end var dirInfo = new DirectoryInfo(directory.Trim()); - _debugWriterDelegate?.Invoke("...location is a git repo (duh)."); + _debugWriterDelegate?.Invoke("...location is a git repo!"); var repoFolderInfo = new ParsedGitFolderDetails { diff --git a/src/PowershellModule/Git/Commands/NewGitRepoRegistrationCommand.cs b/src/PowershellModule/Git/Commands/NewGitRepoRegistrationCommand.cs index 1f968aa..ec460eb 100644 --- a/src/PowershellModule/Git/Commands/NewGitRepoRegistrationCommand.cs +++ b/src/PowershellModule/Git/Commands/NewGitRepoRegistrationCommand.cs @@ -19,8 +19,15 @@ public sealed class NewGitRepoRegistrationCommand : PSCmdlet { GitManager.SetDebugWriter(WriteDebug); + // Test that we're in a git repo first. If we aren't (or git isn't available), this method will throw + // so we don't need to handle for null (yet). var repoFolder = GitManager.IsGitRepo(SessionState.Path.CurrentLocation.Path); + if (string.IsNullOrWhiteSpace(Name)) + { + WriteDebug("No name given for registration, defaulting to git folder root."); + } + GitManager.Instance.RegisterRepo(repoFolder.Directory, Name ?? repoFolder.Folder); GitManager.ClearDebugWriter();